撤消合并

撤消尚未推送到远程的合并

如果尚未将合并推送到远程存储库,则可以按照与撤消提交相同的过程进行操作,尽管存在一些细微差别。

重置是最简单的选项,因为它将撤消合并提交和从分支添加的任何提交。但是,你需要知道要重置的 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