1. 程式人生 > 其它 >Git 分支合併後回退的幾種情況分析

Git 分支合併後回退的幾種情況分析

轉 https://www.jianshu.com/p/667ee3d289d3

今天在合併分支的時候碰到了一個問題,情況是這樣的,當前開發分支A , 合併了分支B,發現有衝突,於是就去改衝突,改好衝突後commit。但是此時老大提醒說提醒用另一中方法可能更好。於是就想退回去,重新改改試試。其實直接reset就好了。不過一檢視到官網有篇文章是介紹這種情況的,正好就按他說的寫一下。
文章地址:https://git-scm.com/blog/2010/03/02/undoing-merges.html
先說一下幾個Git的基本知識:

  • Git倉庫有三個主要組成——工作目錄,快取區和提交歷史。
  • reset將一個分支的末端指向另一個提交。
  • checkout 分支切換。
  • revert撤銷一個提交的同時會建立一個新的提交。

git revert是個安全的方法。相比git reset他不會改變現在的提交歷史,因此git revert可以用在公共分支上,而git reset最好用在私人分支上。

下面說一下那篇文章介紹的撤銷merge的方法:

Reset a Merge:

reset 到merge之前的commit,然後重新做之後的操作,不過這要求所有的協作者知道如何處理回退的head,如果這不是問題,或者只是本地分支,這是一個很好的解決方法。方法如下:

$  git checkout master
git reset --hard [要回退的commit的sha值] 

簡單暴力,不過很好用。

Reverting a Merge:

當 merge 以後還有別的操作和改動時,或者你的協作者在你merge之後又做了一些提交的時候,git 正好也有辦法能撤銷 merge。你可以使用revert命令。方法如下:

$  git resert -m [要撤銷的那條merge線的編號] [merge前的版本號,即sha值]
Finished one revert.
[master 88edd6d] Revert "Merge branch 'jk/post-checkout'"
 1 files changed, 0 insertions(+), 2 deletions(-)

這樣會建立新的 commit 來抵消對應的 merge 操作,如果你嘗試再次合併,Git會看到該分支上的提交是在歷史記錄中,並假設你錯誤地嘗試合併你已經有的東西。

$ git merge jk/post-checkout
Already up-to-date.

Reverting the Revert

$ git revert [方法二撤銷merge時提交的commit的版本號,這裡是88edd6d]
Finished one revert.
[master 268e243] Revert "Revert "Merge branch 'jk/post-checkout'"" 1 files changed, 2 insertions(+), 0 deletions(-)

這樣就可以正常的merge了,不過這可能會產生更多的衝突。
現在基本上重新介紹了我們以前撤回的分支中的一切。現在如果我們在這個分支上有更多的工作,我們可以重新合併它。

$ git merge jk/post-checkout
Auto-merging test.txt
Merge made by recursive. test.txt | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)

寫在最後

大致的看完之後,發現後面的方法太麻煩,簡直是沒事找事。不過作者可能完全是基於在公共分支改動的比較複雜的情況,總之,感覺還是在本地分支用reset最方便,或者revert也可以,別整的那個麻煩就行了。
最後分享一篇Git Community Book中關於git rebase 的文章,之前不太瞭解,感覺寫的很好:http://gitbook.liuhui998.com/4_2.html



作者:華子dev
連結:https://www.jianshu.com/p/667ee3d289d3
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。