2017-05-05 60 views
0

我是git/github的新手,並且最近開始使用它。如何在git中恢復丟失的提交?

我有一個項目在git中有幾個提交,但是,我強迫推入git使用git push -f origin master,現在,我失去了所有以前的提交,並且只有最近推送的一個提交。

我如何檢索恢復我的項目在git中的前一個狀態?

的事情,我已經做了: git的引用日誌(這不會給我一次提交細節)

213bcde [email protected]{0}: revert: Revert "V3 files" cb24c10 [email protected]{1}: reset: moving to HEAD cb24c10 [email protected]{2}: reset: moving to cb24c103e6c0400760a20098a2baceb0601bb858 cb24c10 [email protected]{3}: checkout: moving from master to master cb24c10 [email protected]{4}: commit (initial): V3> files

我需要去提交超越cb24c10頭@ {4}:提交(初始) :V3文件

git的恢復HEAD --no編輯

混帳顯示 這說明僅提交當前的詳細信息SHA

混帳的fsck --no-reflogs

這爲我提供了一個懸空的斑點,我不知道這是我的老參考提交

Checking object directories: 100% (256/256), done. dangling blob e6a2438a4750e9cda68ce2d916c1b8a65dcc5384

請有人可以幫助讓我知道接下來的步驟將我的項目恢復到之前的狀態。

不幸的是,我還沒有關閉我的終端窗口,我可以擁有以前提交b0b7eba的SHA。我該如何恢復到這種狀態?

git push -f原點大師 增量壓縮使用多達4個線程。 寫作對象:100%(507/507),13.55 MiB | 7.17 MiB/s,完成。 總計507(增量109),重用0(增量0) 遠程:解決三角洲:100%(109/109),完成。 到https:http://.filename.git + b0b7eba ... cb24c10主 - >主(強制更新)

+0

這將是有益的,如果你說什麼是錯誤的提交(我的意思是,與推力的那個) –

+0

我用一個強制推(git push -f origin master )用文件形式我的本地系統,但沒有拉從混帳 –

+0

最新的請告訴我這個'混帳引用日誌顯示遙控器/產地/ master'的結果。 你檢查了這個問題嗎? http://stackoverflow.com/questions/3973994/how-can-i-recover-from-an-erronous-git-push-f-origin-master gitreflog顯示遙控器/來源/主是ofcb24c10遙控器/來源的 –

回答

1

UPDATE每股新信息IN THE QUESITON

鑑於b0b7eba原提交SHA1至少讓我們嘗試一些事情。

對於初學者來說,

git checkout b0b7eba 

如下文所述,如果這是一個新的克隆,該命令將失敗。但如果它失敗,你的狀態很好。

git branch -f master 
git push -f 

如果失敗了(如果你沒有一個老回購嘗試用),我們再次回是到github上;但至少我們知道該怎麼告訴我們想要的github。再次,我必須對使用的具體步驟提出無知(因爲我沒有做太多的github),但是您應該能夠導航到特定的提交(幾乎肯定會在那裏存在),然後...

  • 標籤,然後拉,然後檢出標籤,然後branch -f master,然後push -f
  • 在其上創建一個分支,...
  • 只是通過網絡API移動主分支吧

原答覆

所以有一件事要知道:如果你沒有在強制推動之前創建的本地回購,這並不容易。

你提到試圖reflogs,但它聽起來像你說他們不回去遠遠不夠。現在也許這是因爲舊的reflog已經過期,但除非你以不尋常的方式配置了一些東西,否則我懷疑它。所以我想知道你是否一直在嘗試使用在推動後創建的克隆來解決這個問題。因爲事情是這樣的,reflog是本地的,只有repo的一個克隆。因此,在強制推送後創建的任何克隆都不可能有有用的reflog條目。如果您擁有用於強制推送的克隆,那麼最好使用這種方法。

同樣,你提到尋找一個懸空的斑點。 blob是個別文件的內容;您想要查找的對象類型是COMMIT。沒有懸掛提交再次顯示的事實表明,克隆的力推之後創建的(因爲在這一點上你想要的是提交和無法訪問不會被包含在用於初始化新克隆的包)。

(不過,如果你好奇的對象,你可以做

git cat-file -p e6a2438a4 

,看看它是什麼。)

的力推動是一個歷史的改寫,而revert不禁接着就,隨即。 (它僅在提交在當前歷史瞭解撤消更改。)

最好的辦法是進入從中力推做回購,檢查其引用日誌。如果這是一個不行的話,那麼你就會受到github的API的支配(我不太瞭解這些)。這似乎有可能是有用的建議在這裏:https://objectpartners.com/2014/02/11/recovering-a-commit-from-githubs-reflog/

+0

git checkout導致錯誤(錯誤:pathspec'b0b7eba'與git已知的任何文件都不匹配。),但是我確實有被推送到我本地的git文件的副本/備份(備份複製)。你是要求我進入該文件夾並將其設置爲git存儲庫並再次按照步驟操作? –

+0

好的,所以看起來本地不包含目標提交,並且沒用。但是,不,我並不是建議你設置一個新的repo來重試。工作樹文件的備份毫無幫助。您需要'.git'文件夾中回購部分的舊副本 - 即*強制推送*之前存在的克隆。這是唯一可以運作的本地回購協議。所以從你說的話,我認爲你需要弄清楚如何通過github web界面直接恢復歷史記錄 –

+0

git api的幫助。這只是一個簡單的獲取和發佈幫助。我得到了我需要的提交的SHA,並使用api的post方法將它創建爲單獨的分支。 –