日常开发中,我们存在多人开发和同一个人提交多次记录的情况,这就避免不了代码冲突的情况出现。
下面介绍几种gerrit提交失败的现象,后续会根据大家遇到的情况,持续更新。
注意:出现合入不了,显示“cannot merge”,首先尝试下点击下页面得rebase按钮,如下:
如果还是显示冲突,在使用下面的方法。
情况一:报错“Submit including parents”
举例:程序员A在bbb分支上创建(修改)了test.txt文件,并提交到gerrit上,此次提交为commit1,但是没有合入,此时test.txt的内容如下:
hello, this is commit1
然后A又在本地修改了test.txt,然后提交到了gerrit上,此次提交为commit2,此时test.txt的内容如下:
hello, this is commit1
hello, this is commit2
此时gerrit上就有两次提交,很明显,commit2的内容包含了commit1的内容,可认为commit1是commit2的parent节点。
A想,既然commit2 包含了commit1,直接提交commit2就好了,于是就把commit1执行了abondon丢掉了,此时gerrit 代码review的时候发现失败了,显示为“Submit including parents”,如下:
那么解决问题的关键点就是解决冲突。
此时解决的步骤如下:(我们用test工程来说明问题)
- 克隆一份新的代码到本地
git clone ssh://anl@$gerritip:29418/test
(主要是为了防止在原工程下操作,导致切分支失败或者代码不小心丢了,如果不想克隆代码,可以先将本地的改动使用git stash命令保存下,关于git stash的使用不在本文中说明,可自行查找)
- 基于冲突问题分支创建一个新的分支,比如冲突问题分支为bbb,新建分支为ccc
git checkout -b ccc remotes/origin/bbb
- Cherry-pick 改动到本地
Cherry-pick命令来自gerrit上的download下箭头,位置如下:
直接复制这条命令下来,执行:
git fetch ssh://anl@$gerritip:29418/test refs/changes/88/788/1 && git cherry-pick FETCH_HEAD
然后执行git status,如下:
备注:新建的文件,会如上显示,如果是修改原文件,git status 会显示冲突文件前会显示“conflicts:”字段,显示什么不重要,重要的是git status看出有问题的文件是哪个。
有冲突的,开发判断哪些代码是需要的,冲突内容按照如下方式显示:
》》》》》
原来gerrit上的内容
==============
你的修改
《《《《《《《《
删除冲突部分,然后再执行git add,如下:
git add test.txt
备注,如果git status看到的所有文件都是需要提交的,直接“git add .”即可,否者按需要执行git add。
然后再执行git commit -s ,此时会看到如下,删除其中的conflicts和对应的文件,如下
保存后推出继续提交,然后执行git push origin HEAD:refs/for/问题分支,比如下:
Git push执行成功后,再刷新gerrit页面,submit按钮有了,可以提交了,如下:
点击submit即可提交。