git&gerrit代码提交

1、 注册和登录账号
2、 在账号—setting--SSH Public Key添加本地工作机器(linux或者windows)的ssh key,
$cat ~/.ssh/id_rsa.pub   显示公钥,如果这个公钥不存在则使用下面一条命令生成。
$ ssh-keygen -t rsa    一路回车生成ssh key
3、 找到project—general--clone with commit-msg hook—SSH下的git 远程仓库路径在本地clone出来。
$git clone 路径
默认只会迁出master分支到本地,用git branch –a可以看到本地仓库的所有分支
4、 如何发起代码评审和提交代码:
一、EC故障处理
a) 首先配置本地git仓库的用户名和邮箱
$git config user.name XXXX
$git config user.email [email protected]
b) 首先更新本地master分支与远程master主分支对齐
$ git pull origin master
c) 本地checkout一个故障分支bugfix
$git checkout -b bugfix
d) 修改代码本地提交
$git add .
$ git commit -m "说明"
e) 提交评审,将本地bugfix分支(HEAD)的修改提交到远程团队分支(比如master)进行评审
$git push origin HEAD:refs/for/master
f) 评审成员在gerrit界面进行评审和打分
g) 提交者根据评审意见本地进行修改后重新提交,用—amend参数,不需要写说明,并重新发起评审,本次评审会自动触发团队CI,CI的结果会在评审界面上显示。
$git commit –a –-amend  
$git push origin HEAD:refs/for/master
h) 当评审打分为2分时,表示同意提交,评审界面出现submit按钮,由核心成员点击该按钮将代码合入master分支。
i) Bug修复完成之后,请及时删除该分支
$git checkout master
$git branch –D bugfix
二、故事开发story
1) 在gerrit上新建一个远程仓库origin/feature/story专门用于本故事开发
2) 本地仓库更新之后,迁出一个本地的story开发分支与远程分支对齐

$git checkout -b story origin/feature/story 

注意,如果下载不下来,先用git branch -a 查看是否更新有这个分支,无的话,使用git pull下载

3) 在本地story分支修改、评审…修改-评审,注意评审执行story分支
git add .
git commit –m “说明”
$git push origin HEAD:refs/for/feature/story 
4) 评审符合要求后,由核心成员点击submit按钮,合入story远程分支
5) 故事全部开发完成后,准备合入远程master分支,首先更新远程story分支到本地,主要是更新其他tx的commit到本地
$git pull --rebase origin feature/story
6) 然后基于本地master分支迁出一个专门用于此次合入的br_merge分支
$git checkout master
$git checkout –b br_merge
7) 将本地的story分支merge到该分支,用—squash选项
$git merge --squash story
8) 然后在br_merge分支重新提交一次,生成一次新的commit-id和change-id
$git commit –am “log”
最后由本地master分支发起一次合并请求(本质是再做一次代码评审,其实我们关注的是CI结果)
$git push origin HEAD:refs/for/master
9) CI通过之后,有核心成员点击submit按钮提交到远程master主分支
清除本地修改,回退到分支最新版本
git reset -–hard
git pull --rebase origin master
回退到之前的某个版本
git reset --hard edd6952e85b6
git pull --rebase origin master

git push origin HEAD:refs/for/feature/sw_snapshotvolume

三、常见的问题及解决方法

1) 发起评审时出现invalid committer 
发生原因:本次commit的提交者没有与gerrit上的账号保持一致
解决方法:
$git config user.name XXXX
$git config user.email [email protected]
$ git commit --amend --reset-author  (弹出vi界面,不用保存,直接退出即可)
然后在重新发起评审

2) 评审时出现 no new changes
发生原因:该commit生成的change-id已经发起过代码评审了,对于gerrit而言每一次评审都需要新的change-id
解决方法:重新commit生成一个change-id,再发起评审。

3) 点击submit时没反应,出现Rebase if necessary 
  发生原因:由于push时没有与远程分支同步
  解决方法:点击界面的rebase按钮,重新触发评审

4) 发起评审时Missing change-id 
发生原因:用git merge进行分支合并的时候,可能会生成一个多的commit-id,而该commit-id并没有生成change-id,使用git log --graph
解决方法:$git rebase branch   用rebase的方式重新做一次合并。

5) Submit时出现Merge Conflict 
发生原因:与库上的现有代码出现冲突
解决方法: 在本地分支上执行如下几条命令
1、$git fetch origin   获取最新的代码
2、$git rebase -i origin/master  定位到冲突处
3、弹出vi界面,不用修改直接退出
4、$git status 看下冲突文件,解决冲突
5、$git rebase --continue 完成
6、$git add . 
                        7、$git commit --amend "修改信息"

                        8、$git push origin HEAD:refs/for/master

6) 远程分支如何合并,在gerrit上创建了一个远程分支story_123用于故事开发,那么怎么保持该远程分支与项目master主分支对齐?
解决方法: 有如下几步,先切换到本地master分支
1、$git pull origin master  更新本地master分支
2、$git checkout -b story_123 origin/feature/story_123  创建一个本地story_123分支
3、$git merge --squash master   将本地master分支合并到story_123,只合并不提交    
4、$git commit -am “说明”     本地提交
                        5、$ git push origin HEAD:refs/for/feature/story_123 向远处分支,story_123发起合并的评审请求             

7) 本地仓库之间的克隆,我想和A同事同时开发一个故事,但又不想拉远程分支,那么可以选择让A直接克隆你的本地仓库,假设你们的开发分支为story,

解决方法:

1、$git checkout -b story     首先你创建一个分支story

2、$git clone root@IP地址:samba路径  A同事接clone你的本地仓库

3、$git push origin master:story  A同事将自己的修改push到你的story分支 
4、$git pull origin story:master A同事更新你的story分支到他本地

8) 我在dev分支上有3个commit,但我只想提交最后一个commit到主分支怎么办
解决方法:
$git checkout -b branch           从master上迁出一个分支branch
$git cherry-pick  <commit-id>    将最后一个commit-id提交到branch分支
$ git push origin HEAD:refs/for/master 发起评审

9) 在某个分支下,把代码改到一半,不想提交,但这时又要切换到另一个分支去解决一个问题,怎么保存现场?
解决方法:git stash暂存起来
$git add . 
$git stash 先保存现场
$git stash pop 修改完成之后,切到本分支,恢复现场

强烈建议:不要在本地的master分支上直接做commit(可以pull和fetch),保证本地master分支的干净。如果要修改请拉分支!! 

葵花宝典:在本地分支上修改代码之前,请先更新一下!这样几乎能解决所有冲突!
fatal: git checkout: updating paths is incompatible with switching branches.
Did you intend to checkout ‘origin/remote-name‘ which can not be resolved as commit?
解决办法:
git remote show origin
git remote update
git fetch
git checkout -b local-name origin/remote-name


猜你喜欢

转载自blog.csdn.net/lanyue1/article/details/79591665