最近,在gerrit上遇到了一个奇怪的现象,开发人员A有一个问题要修改,这个问题本来是要提交到bugfix2分支,但是他本地没有切换到bugfix2分支上,而是在本地的bugfix1分支上直接修改了,然后push的时候,往远程的bugfix2分支上push,代码合入以后,发现在bugfix2分支上,除了要合入的那个提交,还多出了很多不相关的提交,这下糟了,这些不相关的提交在bugfix2上都是不需要的啊,但是这个时候要提测了,总不能一个一个提交的回退吧,不仅麻烦还会多处很多无用的提交,这是大家都不愿意看到的,尝试回退最后一次提交,看看会不会撤销带过来的无用改动,发现并不会,没办法,只能基于bugfix2分支的原来最后一次正确的提交节点拉一个新的2.0分支出来,即bugfix2_2.0先用着。
在gerrit上观察A的那个提交,发现他的parent的并不是bugfix1上的最新提交,所以怀疑是他本地的bugfix1分支没有pull到最新的改动,然后就做了改动,咨询A以后,好像是没拉新代码,基于此,我使用了test工程来看看是否会复现他的这个现象。
test仓库有两个分支,一个是master,一个是aaa
(1)首先将aaa分支合入master分支,这样只是为了后面好看提交记录
(2)在本地master分支上修改了并提交了commit1(改动是新建w1.txt),commit2(改动是新建w2.txt),commit3(改动是新建w3.txt)到远程master分支上,分别对应如下的"w1_test1","w2_test1","w3_test1",如下截图:
(3)参考开发A出现的状况,本地master回退到commitid:5321c5196d2c465371d65a291494284070c80119,也就是commit1,然后添加了一个新的提交commit4(改动是新建w5.txt),这个commit4 push的时候,push到了远程的aaa分支上,如下的”w5_test1“:
gerrit上打开这条提交,会发现对应的提交文件只有w5.txt,并且显示的”parent(s)“是commit1的id:5321c5196d2c465371d65a291494284070c80119,如下:
(4)按照上面的提交,我们的意愿是只想提交commit4,即文件w5.txt的改动到aaa,但是在gerrit上把commit4提交merge到aaa分支后,本地切换到aaa分支,git pull拉取最新的代码,发现不仅有commit4的提交,还有commit1的提交,如下:
所以,问题需要在哪个分支上改,本地就切换到哪个分支上修改,提交时提交到对应的分支,要在A分支上解决的问题,就在A分支上改,提交到A分支上,不要跨分支操作。