2010-11-03 256 views
15

因此,我的一個同事偶然做了合併,實際上只保留樹的一側。於是他開始合併,刪除了合併引入的所有更改,然後進行合併。你如何恢復錯誤的混帳合併提交

這是一個簡單的測試用例,我在測試回購上做過。這個回購有三個分支。 idx是意外合併的主題分支,master是主線。 dev僅僅是對-m如何恢復的測試,所以你可以忽略它。

alt text

我想要做的是恢復故障合併。因此,從主我嘗試運行git revert -m 1 <sha1sum of faulty merge>但隨後的git與迴應:

# On branch master        
nothing to commit (working directory clean) 

所以它實際上並沒有創建一個還原提交該撤銷合併。我相信會發生這種情況是因爲合併實際上並未包含任何實際更改。

如果你想玩弄我的測試回購可以從here

下載這是一個git的bug,還是我失去了一些東西?

+0

我不知道你爲什麼說「它實際上不創建合併提交」 - 它不應該。您應該期待它創建一個正常的提交,這將反轉合併提交的效果。 – Cascabel 2010-11-03 15:40:52

+0

是的,對不起,這應該是說它實際上並沒有創建一個恢復提交。 – 2010-11-03 23:51:44

回答

7

這裏最好的經驗法則是永遠不會改變你的回購的公告後的歷史。它真的把事情搞砸了。但我不認爲這種情況可以避免它。

我認爲這裏有幾個選擇,但最簡單的是做一個rebase。使用您的回購,這些都是我所使用的命令:

git rebase -i ead3646 

然後,當交互shell出現,請卸下出現故障的整個行提交。保存,你應該清盤一個新的歷史這樣的:

* f0ab6d5 more normal work on dev 
* ebb5103 idx commit 
* ead3646 master change 
* 582c38c dev commits 
* f4b8bc6 initial commit 

獲取你們兩個(及其他)回到同步是要採取一些分支,推,收發電子郵件和午餐買盤。

+0

恢復同步並不是那麼複雜。因爲我從來沒有在其他地方看過食譜,所以我寫了一篇文章發佈在這裏:http:// stackoverflow。com/questions/4084868 – 2010-11-03 07:09:48

+1

我沒有機會仔細閱讀關於合併提交主題的'git revert'文檔,但'-m'選項專門用於允許它在合併提交上進行操作。很明顯,應該有一種方法來解決問題,而問題在於爲什麼它在這種情況下不起作用。 – Cascabel 2010-11-03 15:40:25

6

git文檔說這是關於恢復合併:http://code.google.com/p/git-core/source/browse/Documentation/howto/revert-a-faulty-merge.txt 雖然這主要是關於恢復導致不良更改的合併,而不是恢復正確執行的合併。

基本上,還原合併將撤消數據更改,但不會更改歷史(圖形)。因此,預計恢復錯誤的合併不會產生任何效果。

解決這個問題的方法之一是再次進行合併,然後將結果合併到master中。在你的例子中,這可能是這樣的:

git checkout -b temp/merge-fixup ead364653b601f48159bca5cb59d6a204a426168 
git merge 2fce9bfe8f721c45ea1ed5f93176322cac60a1d9 
git checkout master 
git merge temp/merge-fixup 
git branch -d temp/merge-fixup 
+2

現在,文檔似乎已經消失。 – kojiro 2011-12-05 22:56:20

+1

@kojiro:到目前爲止,谷歌搜索「revert-a-faulty-merge.txt」可以產生大量的鏡像。 – 2012-01-30 13:02:14