2013-07-19 38 views
44

我正在使用源代碼樹。我創建了一個多個更改的存儲,並將其刪除。有沒有辦法找回他們?使用SourceTree在Git中檢索已刪除的存儲

+0

Windows還是Mac? Mac版本在功能方面一直領先於Windows版本。 – 2014-05-05 04:13:35

+2

可能相關:[在git中恢復丟棄的存儲](http://stackoverflow.com/q/89332/456814)。 – 2014-05-05 04:15:27

+0

@Cupcake我一直在使用Mac版本。 – Tushar

回答

40

隱藏在內部被保存爲一個合併提交,從一個列表中引用。

git fsck可以找到懸掛的物體。它會發現不僅僅是你刪除的隱藏,也可能是其他的東西,所以你會想要尋找提交,看起來他們可能是你的存儲(git show <ID>顯示有關對象的相關信息,並決定它是否是一個你正在尋找)。

一旦你有了,你需要做的就是重新插入它的列表中。該列表存儲在.git/logs/refs/stash和行具有以下格式:

<ID of previous stash commit in list or 0000000000000000000000000000000000000000 if none> <ID of merge commit> Your Name <[email protected]> <UNIX timestamp> <time zone, e.g. +0000><TAB char><description of stash> 

這裏有一個工作示例:

16b9a2d400dafe7ea25592029e3e5582d025c7d8 5def7605dfe625e8b3a3152fe52a87cc36694b6a Jan Krüger <[email protected]> 1374227992 +0200 WIP on master: 0dbd812 Update draft release notes to 1.8.4 

就合成了藏匿要行重新插入(名稱/郵件/時間戳/描述不要是準確的),你應該能夠正常使用它。

快樂狩獵!

+0

我運行'''git fsck'''命令,它給了我大約100個GUID。有沒有更簡單的方法來解決這個問題?我的意思是更多的視覺? – Tushar

+0

它不可能通過100 guids!請建議一個更簡單的方法。 – Tushar

+3

這是我知道的唯一方法。但是,你可以使用下面的方法減少它:'git fsck --unreachable';並直接得到一個清單的細節,可能是這樣的:'for i in $(git fsck --unreachable --no-dangling 2> |/dev/null | grep commit | cut -d''-f3);做git - 無記錄器日誌-1 $ i;完成|少' –

20

像以前的答案狀態一樣,您可以使用git fsck來列出 未被包含您刪除的藏匿物的任何物品引用的物品。但是,它 可以使用git show篩選對象的該列表僅顯示 藏匿處,如:

git fsck 2> /dev/null | 
    awk '/commit/{print $3}' | 
    git show --stdin --merges --grep '^WIP on' 

如果您知道創建藏匿時,你還可以添加一個參數像 --since '2 days ago'到最後以進一步限制輸出。希望這會將名單減少到可管理的規模。

找到正確的存儲後,記下它的提交ID,並且可以使用 git stash apply COMMITID來應用它,就像它沒有被刪除一樣。

+2

「since」選項對我來說不起作用 – IcedDante

9

正如JanKrüger所述,git fsck就是要走的路。但是,如果您發現自己無法(無論出於何種原因)成功合成存儲文件中的一行並使存儲顯示在可用列表中,則可以直接使用git stash apply <guid>,而不添加該行。這將立即應用(不提交)文件(s)更改到您當前的分支。

52

基於上述答案,這裏是一個簡單的序列:

打開一個終端窗口和CD到存儲庫下的文件夾。然後:

git fsck | awk '{print $3}' > tmp.txt 
cat tmp.txt | xargs git show > tmp2.txt 

編輯器現在打開tmp2.txt,找到丟失的代碼,並找到提交-ID在它的上面。然後應用代碼:

git stash apply <commit id> 
rm tmp.txt tmp2.txt 

這救了我的命!我真的很感謝所有回答這個問題的人。我保佑git的創造者Linus Torvalds保留刪除的東西在git數據庫。天才!!

+0

我對git相當陌生,這絕對挽救了我的生活,恢復了工作的日子。謝謝 – RyuAkamatsu

+0

我同意。我只是按照這些步驟,並在我無意中刪除(彈出)存儲後恢復了3天的工作。 – bholben

+0

我見過最好的答案。感謝捆綁! – Andrew

1
for i in $(git fsck 2>|/dev/null | grep commit | cut -d' ' -f3); do git --no-pager log -1 $i; echo "-------------------------"; done | less 

然後找到提交ID#。

,做

git stash apply {commit#} 
4

另一種解決方案是:

git fsck 2>&1 | awk '/dangling commit/{print $3 "^!"}' | xargs git log 

您是否使用SourceTree用於查找作者和提交信息(日期,哈希,作者等)

git stash store <hash-id-of-specific-commit> 
+0

我試了幾個腳本,但這個工作沒有錯誤或給我隨機/ n數據。 – Zammbi