git提交代碼到gerrit失敗
一、前言
tips:如果我們想在gerrit上管理代碼。那麼你的每次提交都要帶上一個commit_id,這樣才能保證你能push到遠端的rfes/for/master上。(注意是這個Change_id)
要每次提交代碼的時候都帶上一個這樣的唯一標識:
怎麼生成唯一標識可自行查找
二、背景:
提交代碼的正確姿勢:
1:提交代碼git add . git commit --amend(注意這裏一定是amend,因爲要保證每次的patchset是同一次提交)
2:拉取遠端最新的變化git fetch --all
3:rebase主幹分支(master)的代碼變化git rebase origin/master -i
4:提交代碼到主幹分支 git push origin HEAD:refs/for/master
錯誤復現:
提交代碼沒有問題,在拉取遠端最新的分支變化的時候我執行的是git catch(起的git命令別名。這裏我以爲執行的是git fetch --all其實是git remote update origin --prune)前者是拉取遠程分支的變動,後者是更新分支的變動。所以實際上並沒有更新遠程分支的代碼。這時候我push到遠程分支被拒絕。所以我就reset到master的上一次提交,然後再add, commit --amend,push -f 自己開發的遠程分支成功了。push origon HEAD: refs/for/master也成功了。但是比較尷尬的是我是把別人的提交都合到我自己的這次提交了。這肯定是有問題的。提示錯誤如下。
這是因爲我們的提交包含的遠程master的提交。包含了很多master已經提上去的代碼。所以這裏一直提示衝突。
三、解決思路
1:首先我們rebase origin/master分支的代碼,這時候再push肯定是不行的。因爲我們的這次提交包含了master已經存在的代碼。
2:我們reset到master的最新一次提交,這時候我們再rebase origin/master,再提交還是不OK,因爲我們分支上的最新一次提交
包含了之前的master的提交,還是有重複代碼的出現。
3:我們從開發分支上切出一個新的分支,reset到最新的master提交。rebase我們的遠程開發分支的內容。這時候我們把所
有內容stash,再去rebase origin/master的內容,這時候保存master的提交記錄。再stash或apply 把代碼應用於基於現在
的提交。再提交 push成功。
四:總結
1:解決衝突的方法有很多,不要試着用reset方式解決衝突。尤其是在rebase方式合併代碼的情況。reset適合(你自己分支開發的,只有你自己提交代碼,想把多個提交合併成一個提交。其實這時候可以在rebase遠程的時候加個-i)
2:rebase遠程代碼的時候注意是rebase origin/master 如果是rebase origin master 分支會跳到master,並且在master上執行rebase。
3:不要rebase本地分支的代碼,一定要rebase 遠程分支的。因爲rebase本地的時候會在在你的分支有一個合併的提交記錄。會拒絕你的push操作。
3:如果碰到自己不能解決的問題,一定要及時求助,並且做好代碼的備份。最好的方式就是切到新分支保存自己的內容。