Git 如何撤销分支的merge

首先回滚两种方式的区别

revert:是用一次新的commit回滚之前的commit,所以它的版本号不会变,这样就会导致在日后继续merge以前的老版本的时候,这些差异并不会显示,我们这次也有这个问题,master和develop对比差异的时候,并没有把回滚之后的差异显示出来。

reset:是直接删除指定的commit,提交及之前的commit都会被保留,但是此次之后的修改都会被退回到暂存区。

举个例子:假设有三个commit, git log:

1
2
3
commit3: add test3.c  
commit2: add test2.c
commit1: add test1.c

当执行git revert HEAD~1时, commit2被撤销了,git log可以看到:

1
2
3
4
revert "commit2":this reverts commit 5fe21s2...  
commit3: add test3.c
commit2: add test2.c
commit1: add test1.c

git status 没有任何变化,如果换做执行git reset –soft(默认) HEAD~1后,运行git log

1
2
commit2: add test2.c  
commit1: add test1.c

运行git status, 则test3.c处于暂存区,准备提交。
如果换做执行git reset –hard HEAD~1后,显示:HEAD is now at commit2,运行git log

1
2
commit2: add test2.c  
commit1: add test1.c

运行git log, 没有任何变化

怎么撤销megre呢?

方法一 如果没有新的提交可以用reset 到 merge 前的版本,然后再重做接下来的操作,要求每个合作者都晓得怎么将本地的 HEAD 都回滚回去:

1
$ git reset --hard 【merge前的版本号】

方法二 当 merge 以后还有别的操作和改动时,git 正好也有办法能撤销 merge,用 git revert:

1
$ git revert -m 【要撤销的那条merge线的编号,从1开始计算】 【merge前的版本号】

这样会创建新的 commit 来抵消对应的 merge 操作,而且以后 git merge 【那个编号所代表的分支】 会提示:

1
Already up-to-date.

因为使用方法二会让 git 误以为这个分支的东西都是咱们不想要的。

方法三 怎么撤销方法二

1
$ git revert 【方法二撤销merge时提交的commit的版本号,这里是88edd6d】

方法二里的megre线的编号怎么算,1:合并目标的分支 2:合并来源分支

一般来说,如果你在master上merge zhc_branch,那么parent 1就是master,parent 2就是zhc_branch.


Git 如何撤销分支的merge
https://www.panaihua.com/git-revert/
作者
谏言
发布于
2017年8月10日
许可协议