日常開發中,我們存在多人開發和同一個人提交多次記錄的情況,這就避免不了代碼沖突的情況出現。
下面介紹幾種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即可提交。
