2012-07-20 143 views
2

首先,我必須道歉 - 這裏有很多'如何撤消合併'的問題,但我對git非常陌生,以至於我真的不明白如何適應他們的解決方案我的情況(儘管我相信他們可以)。git撤消推送合併恢復單獨的分支

我有兩個分支,versionAversionB。我在versionA中做了一些更改,並將它們合併爲versionB,這很好,因爲versionA中所做的更改是向前兼容的。然後,我想我一定是不小心合併了versionBversionA,這是不好的,因爲versionB不是向後兼容到versionA

我該如何解決這個問題?

爲了讓事情更清晰,這是我做了什麼:

versionA C--C--C--C'--M2 
      \  /
      \  /
versionB C--M--C--C* 

M: merged versionA into versionB. this is fine. 
M2: accidentally merged versionB back into versionA 

這就是我想要的:

versionA C--C--C--C' 
      \   
      \  
versionB C--M--C--C* 

如果我是在水銀我會做hg rollback和所有會沒關係,或者我會hg update C',併爲versionA分支做出未來提交,儘管這會使M2成爲一個死角(因此我更喜歡rollback方法)。

什麼是git方式來清理最後提交M2versionA分支? (所有更改都已推送)。

回答

1

您需要找到合併的提交。

要找到合併提交嘗試: git log versionA ^versionB --ancestry-path --merges

所需提交的是最後提交。

混帳恢復-m 1 commit_hash

但請在Linus的讀了寫上去:http://www.kernel.org/pub/software/scm/git/docs/howto/revert-a-faulty-merge.txt

另見:Which commit hash to undo a pushed merge using git-revert?

+0

謝謝!我能請求一些進一步的解釋嗎?第一個選項我的歷史將會是什麼樣子? 'M2'是一個搖搖晃晃的頭,並且進一步承諾'versionA'全部脫離'C''? (也就是說,我的'versionA'歷史看起來像是一條連續的線,有一條(死的)葉子'M2'掛在它上面?)另外,你能解釋'git reset HEAD^--hard'嗎?我看看'git help reset',但它並不能解釋'HEAD'後面的'^'是什麼意思(儘管它在示例中使用了它)。我猜它意味着「頭部之前的提交」? – 2012-07-20 01:14:21

+0

最後,如果我做第二個版本(清理歷史),如果其他人已經將「M2」拉入其歷史記錄,會發生什麼?同樣,如果未來的人拉動存儲庫,他們會看到「M2」嗎? – 2012-07-20 01:15:15

+0

要回答第一個問題 - 我在'git help revisions'中找到了HEAD ^'的解釋。並且基於'git help revert',我認爲我的新'versionA'歷史將是'C - C - C - C' - M2 - M2'',其中'M2'表示「恢復了M2" 。其他問題(將'HEAD^--hard'重新設置爲已經對已經簽出'M2'的任何人進行了重新設置)仍然存在。 – 2012-07-20 01:23:25