撤消合併

撤消尚未推送到遠端的合併

如果尚未將合併推送到遠端儲存庫,則可以按照與撤消提交相同的過程進行操作,儘管存在一些細微差別。

重置是最簡單的選項,因為它將撤消合併提交和從分支新增的任何提交。但是,你需要知道要重置的 SHA,這可能很棘手,因為你的 git log 現在將顯示來自兩個分支的提交。如果你重置為錯誤的提交(例如,另一個分支上的一個),它可能會破壞已提交的工作。

> git reset --hard <last commit from the branch you are on>

或者,假設合併是你最近的提交。

> git reset HEAD~

恢復更安全,因為它不會破壞已提交的工作,但涉及更多工作,因為你必須恢復恢復,然後才能再次合併分支(請參閱下一節)。

撤消合併推送到遠端

假設你合併了一個新功能(add-gremlins)

> git merge feature/add-gremlins
...
   #Resolve any merge conflicts
> git commit #commit the merge
...
> git push
...
   501b75d..17a51fd  master -> master

之後你發現剛剛合併的功能為其他開發人員打破了系統,必須立即撤消,修復功能本身需要很長時間,因此你只需要撤消合併。

> git revert -m 1 17a51fd
...
> git push
...
   17a51fd..e443799  master -> master

此時,小鬼們已經離開了系統,而你的開發人員已經停止對你大吼大叫。但是,我們尚未完成。使用 add-gremlins 功能修復問題後,你需要在重新合併之前撤消此恢復。

> git checkout feature/add-gremlins
...
   #Various commits to fix the bug.
> git checkout master
...
> git revert e443799
...
> git merge feature/add-gremlins
...
   #Fix any merge conflicts introduced by the bug fix
> git commit #commit the merge
...
> git push

此時,你的功能現已成功新增。但是,鑑於這種型別的錯誤通常是由合併衝突引入的,稍微不同的工作流有時會更有幫助,因為它可以幫助你修復分支上的合併衝突。

> git checkout feature/add-gremlins
...
   #Merge in master and revert the revert right away.  This puts your branch in
   #the same broken state that master was in before.
> git merge master
...
> git revert e443799
...
   #Now go ahead and fix the bug (various commits go here)
> git checkout master
...
   #Don't need to revert the revert at this point since it was done earlier
> git merge feature/add-gremlins
...
   #Fix any merge conflicts introduced by the bug fix
> git commit #commit the merge
...
> git push