撤消合并
撤消尚未推送到远程的合并
如果尚未将合并推送到远程存储库,则可以按照与撤消提交相同的过程进行操作,尽管存在一些细微差别。
重置是最简单的选项,因为它将撤消合并提交和从分支添加的任何提交。但是,你需要知道要重置的 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