likes
comments
collection
share

关于git revert的一点坑

作者站长头像
站长
· 阅读数 19

关于git revert的一点坑

我们都知道git reset和git revert的区别,那么这里就来说一下在revert的时候遇到的一些问题

话不多说,直接操作

  • 从master分支拉出来两条分支,feature1和feature2 关于git revert的一点坑

  • 在feature1和feature2上进行一次提交,把feature1合并进master,然后在feature2上rebase master再合进master,就得到这张图 关于git revert的一点坑 现在我们来把merge进来的feature1 从master revert掉

revert分类

revert分为revert普通commit和merge commit

  • 对于普通的commit,使用 git revert <commit id> 即可,git 会生成一个新的 commit,将指定的 commit 内容从当前分支上撤除
  • 对于merge commit,需要添加 -m 选项以代表这次 revert 的是一个 merge commit 但如果直接使用 git revert <commit id>,git 也不知道到底要撤除哪一条分支上的内容,这时需要指定一个 parent number 标识出"主线",主线的内容将会保留,而另一条分支的内容将被 revert。 如上面的例子中,从 git show 命令的结果中可以看到,merge commit 的 parent 分别为 d98dcca82c,其中 d98dc 代表 master 分支(从图中可以看出),ca82c 代表 will-be-revert 分支。需要注意的是 -m 选项接收的参数是一个数字,数字取值为 1 和 2,也就是 Merge 行里面列出来的第一个还是第二个,其含义用来保留某个分支。 关于git revert的一点坑

操作

我们一般是提交代码后发现有问题,需要先revert掉本次提交,然后重新在自己的需求分支进行bugfix,完成后然后再进行合并

  • 我们直接revert掉git revert -m 1 3a515ba13efe53b879e108c36b30280c026330a9 关于git revert的一点坑

  • 回到feature1进行bugfix,这是fix后的代码 关于git revert的一点坑

  • 正常我们应该重新合并进master,那我们来试一下,可以看到,只有新增的commit被merge过来了,之前被revert废弃的commit不会重新merge进来,显然这不是我们想要的 关于git revert的一点坑 关于git revert的一点坑

  • 这是刚刚产生的大概的示意图 关于git revert的一点坑

解决

  • 我们应该在合并进bugfix之前,revert掉之前的revertcommit,记作D',这样就能把之前的commit也带进来了 关于git revert的一点坑

  • 如图,feature1的最开始提交就可以合并过来了 关于git revert的一点坑 关于git revert的一点坑