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:如果碰到自己不能解决的问题,一定要及时求助,并且做好代码的备份。最好的方式就是切到新分支保存自己的内容。