git revert 后再次提交,提交不成功,这样去解决

1,477 阅读3分钟
1,首先先了解一下背景:

在一次上线过程中,当我合并完master后,产品说今天不上线,为了不影响其他同事上线(占用了master),就revert来撤销本次提交(其实在这里如果我用reset来回退的话,就不会出现后续的问题),后来,到了上线节点时,发现之前撤销提交的代码始终合并不上去,只有后续的更改能合并上去,后来才恍然大悟,即便revert了,但revert后提交记录是仍然存在的,所以之前的代码对于master来说是合并过的,所以始终合并不上去。即将上线,代码合不上去,急急急!

2,如何解决

为了按时上线,我选择了一个折中的办法(把自己的分支更新成最新的分支,基于自己分支去发布上线,前提是自己的分支当初是基于master拉取的),首先看一下这段时间有没有向master合并的分支,如果有把这些分支都合并到自己的分支,如果没有可以直接发布。

发布上线后如何解决master分支合并不了自己代码的问题?

最简便的一种办法是在之前revert的节点再次revert一下,这样就解决了

3,问题的根本是什么?

为什么会出现以上的问题? 主要原因是revert在撤销上一次代码提交时,仍会保留提交记录,导致后续再次提交,就会提交不上去。如果我用reset来撤销错误代码的话,就不会出现以上问题(前提是此刻没有其他人在master上提交代码,否则会将别人的代码一并撤销),因为reset它在撤销代码的同时会把提交记录一并撤销,不会影响后续代码的再次提交

4,reset和revert的概念

reset 使用方法:git reset --hard commit ,commit是提交后产生的SHA1,执行该命令后,代码会完全回退到本次提交时的状态,工作暂存区以及本次提交后面的提交内容将会被完全清除,包括提交记录!一般执行reset后要进行一次强制提交(原因:因为本地代码回到了旧版本,但远程仓库是新版本和本地不一致,所以你在用git push时会报错,这里我们需要使用强制提交git push -f

revert 执行后会产生新的commit记录,是通过一次新的commit来恢复到之前旧的commit,但revert会保留恢复的该次提交后面的其它提交内容(只会撤销当前提交),假如后面的提交与要恢复的提交更改了同一地方,此时用revert就会产生冲突!

举个栗子:

比如说按时间顺序提交的 a b c 版本,reset到a,那么b c的改动都会被改掉。
但revert到a,只会a的改动,而b c不动, 所以revert不会引起历史提交的变更。

5,简单的说一下reset 和 revert 的区别
  • reset是彻底回退到指定的commit版本,该commit后的所有commit都将被清除,包括提交历史记录;
  • revert仅仅是撤销指定commit的修改,并不影响后续的commit,但所撤销的commit被后续的commit修改了同一地方则会产生冲突;
  • reset执行后不会产生记录,revert执行后会产生记录;
  • reset执行后无法再次恢复,revert执行后因为不会清除记录,并且会产生新纪录,所以文件不会丢失,你可以多次执行revert恢复到某次改变之前的状态;
  • reset执行后HEAD会后移,而revert的HEAD则一直是向前的;