2010-12-14 131 views
16

這種情況: 我開始在主人A我分支並在B做了一些更改,然後合併該分支回(C)。在做了一些更改後,我在D,但發現我需要部署代碼而沒有在分支中發生的更改。如果我沒有把它合併,那會很好。Git:如何「撤消」合併

A_______C___D 
\ /
    \_B_/ 

首先,我想知道我應該在這裏做,好像合併從來沒有發生在代碼部署。注意:在分支中編輯的相同文件都沒有在主文件中編輯過。

其次...

我沒有時間來解決處理這個是最好的方法,所以我刪除該分支添加的文件,並手動恢復分支,然後做一些修改COMMITED部署的結果(F

A_______C___D___F 
\ /
    \_B_/ 

我希望能夠繼續開發該分支與合併從主任何更改到它保持它最新的,但如果我這樣做的東西,我做創建F將被合併並導致文件被刪除並且編輯被恢復。處理這個問題的最佳方法是什麼?

回答

16

您可以使用衍合做,在一個步:

git rebase --onto A C D 

我只是測試這一點,適當的結果:

$ edit test.txt 
$ git add . 
$ git commit -mA 
$ git checkout -b the_branch 
$ edit test.txt 
$ git commit -a -mB 
$ git checkout master 
$ git merge master the_branch --no-ff 
$ edit test.txt 
$ git commit -a -mD 

從這裏,你有你所描述的情況。 然後:

$ git rebase --onto <SHA1-for-A> <SHA1-for-C> master 

底墊從C(除外)提交掌握,到A. 我需要解決一些矛盾,因爲我修改了在B和d相同的地方,但我想你不會。

_D' 
/
/
A_______C___D 
\ /
    \_B_/ 

文件約git rebase --onto,這或多或少是您的情況: http://git-scm.com/docs/git-rebase


如果您有:

A_______C___D___F 
\ /
    \_B_/ 

,那麼你現在有:

_D'___F'_(master) 
/
/
A_______C___D___F 
\ /
    \_B_/(the_branch) 

從這裏,將master中的更改合併到分支中很容易。完全放棄提交F'

$ git checkout master # if you were not here already 
$ git branch old_fix # if you want to be able to return to F' later 
$ git reset --hard <SHA1-to-D'> 

你上面的命令之後有:

 (master) 
    /
    _D'___F'_(old_fix) 
/
/
A_______C___D___F 
\ /
    \_B_/(the_branch) 

要合併主的更新到the_branch:

$ git checkout the_branch 
$ git merge master 

...和解決衝突。

+0

太棒了,謝謝!我將來會使用它(如果我的合併更加小心,將無法正常工作)。請參閱@ terminus爲我所做的答案。我認爲它和你的答案達到了幾乎相同的結果。 – Jake 2010-12-15 00:53:11

6

顯而易見的解決方案是重置爲A,手動重新應用所有修補程序並解決衝突(您不會有)。

或者,您也可以只爲git revert補丁B但這會創建一個新的提交。

雖然Gauthier的回答比較好。

+0

謝謝,在閱讀本文後,我看着補丁,並最終在這裏:http://www.gitready.com/intermediate/2009/03/04/pick-out-individual-commits.html所以我分支A和櫻桃採摘的D和F,然後將結果合併到原始分支中以使其更新。 – Jake 2010-12-15 00:52:43

+0

你真的櫻桃F?我以爲F只是爲了逆轉B和C,所以在C'之後沒有任何事情要做? – Gauthier 2010-12-15 10:03:39

+0

對不起,現在我不確定。也許我做了但沒有真正需要。 – Jake 2011-01-05 07:29:06