1-1 Gerrit实用指南

注:学习gerrit需要拥有git相关知识,如果没有学习过git请先回顾git相关知识点


黑马程序员git教程


一小时学会git


git参考博客


git 实操博客


1.0 定义


Gerrit 是一个基于 Web 的代码审查系统,它使用 Git 作为底层版本控制系统。Gerrit 的主要功能是帮助团队进行代码评审,通过这种方式来提高软件质量并促进开发者之间的协作。

Gerrit关键特性:

  1. 代码审查:在代码合并到主分支之前,Gerrit 允许团队成员对更改进行审查。这有助于提前发现潜在问题,并确保只有经过批准的更改才会被合并。
  2. 访问控制:提供细粒度的权限管理,允许管理员定义谁可以提交代码、谁可以审查代码以及谁可以批准代码变更等。
  3. 集成能力:Gerrit 可以与多种持续集成(CI)工具集成,如 Jenkins,这样每次有新的代码提交时都可以自动触发构建和测试过程。
  4. Git 扩展:除了标准的 Git 功能外,Gerrit 还提供了额外的功能,比如在线查看差异(diffs)、评论特定行或文件等。
  5. 可扩展性:支持插件机制,可以通过安装插件来增加新的功能或者改进现有的工作流程。

2.0 gerrit工作流程

使用过git的同学,都知道,当我们git add --> git commit --> git push 之后,你的代码会被直接提交到repo,也就是代码仓库中,就是图中橘红色箭头指示的那样。

那么gerrit就是上图中的那只鸟,普通成员的代码是被先push到gerrit服务器上,然后由代码审核人员,就是左上角的integrator在web页面进行代码的审核(review),可以单人审核,也可以邀请其他成员一同审核,当代码审核通过(approve)之后,这次代码才会被提交(submit)到代码仓库(repo)中去。

无论有新的代码提交待审核,代码审核通过或被拒绝,代码提交者(Contributor)和所有的相关代码审核人员(Integrator)都会收到邮件提醒。

gerrit还有自动测试的功能,和主线有冲突或者测试不通过的代码,是会被直接拒绝掉的,这个功能似乎就是右下角那个老头(Jenkins)的任务。


整个流程就是这样。 在使用过程中,有两点需要特别注意下:

1、当进行commit时,必须要生成一个Change-Id,否则,push到gerrit服务器时,会收到一个错误提醒。

2、提交者不能直接把代码推到远程的master主线(或者其他远程分支)上去。这样就相当于越过了gerrit了。 gerrit必须依赖于一个refs/for/*的分支。

假如我们远程只有一个master主线,那么只有当你的代码被提交到refs/for/master分支时,gerrit才会知道,我收到了一个需要审核的代码推送,需要通知审核员来审核代码了。

当审核通过之后,gerrit会自动将这条分支合并到master主线上,然后邮件通知相关成员,master分支有更新,需要的成员再去pull就好了。

而且这条refs/for/master分支,是透明的,也就是说普通成员其实是不需要知道这条线的,如果你正确配置了sourceTree,你也应该是看不到这条线的。

注: 2.0内容引用自博客:【https://blog.csdn.net/chuyouyinghe/article/details/124024459


3. 0 SSH配置


cpp 复制代码
git config --global user.name "用户名"

git config --global user.email "邮箱"

注:用户名自己喜欢什么名字就写什么名字即可,邮箱这里指的并不是自己的邮箱而是自己的主机名(写自己邮箱有可能出现无法访问的情况),另外github支持我们使用用户名和自己的邮箱登录。


cpp 复制代码
cd ~/.ssh    // 进入ssh目录

ls           // 查看当前目录下文件

注:如果当前目录下不包含id_rsa.pub 与 id_rsa就使用生成公钥与私钥的指令

此处包含公钥和私钥表示我此前已经生成过了,为了演示方便我继续操作一次

cpp 复制代码
ssh-keygen -t rsa -C "你的邮箱"    // 邮箱可以写成自己的主机名

ls -----------> 指令查看是否生成公钥和私钥

cat 指令查看公钥的内容,cat id_rsa.pub

把生成的公钥放到远程仓库的key中即可,进入github






把新生成的公钥添加进去




公钥添加成功咋们下面进行测试

使用mkdir 指令创建一个新的目录,然后cd进入新的目录,然后pwd查看当前目录


找一个远程已经存在的仓库,克隆下来,验证之前的配置




配置成功,当前目录下多了一个克隆下来的远程仓库


4.0 Gerrit基本操作


提交公钥到gerrit才能使用ssh,实际上和提交到gitHub上是一致的,没有什么本质区别,生成公钥和私钥步骤与3.0 操作一致。


gerrit 添加公钥参考:

git实战---Gerrit配置SSH key & 下载代码到本地 & 使用VScode编辑器编辑提交代码------2023.07-阿里云开发者社区


gerrit 克隆下远程仓库后查看远程仓库上的内容

进入远程仓库查看远程仓库的内容 cat -alt指令

注意:在我们push代码到远程仓库之前需要同步一下远程的代码到本地,不然容易引发冲突


使用 git pull --rebase同步远程的代码到本地



git add fileName ----> 将文件添加到工作区


将文件推送到远程:git push origin HEAD:refs/for/master

注:origin 表示的是本机的地址,HEAD:refs/for/master表示的是本地的分支

在远程仓库查看我们的提交



提交以后使用:git pull --rebase指令将代码同步到本地

一定要使用rebase如果不手动添加rebase的话,会默认使用merge这个时候会多一个提交


5.0 文件提交树


git log --graph --oneline --decorate --all


6.0 临时存储

注:开发已经进行到一半,有一个新的需求需要我们排除bug

这个时候由一个程序上的bug需要我们解决,如何处理?如果需求完成可以生成一个提交,如果没有完成可以将这个文件隐藏起来。

指令:git stash save "备注" 将没有开发完的文件隐藏起来


查看隐藏的内容:git stash list


同步到远程:git pull --rebase

这个时候就可以在这个基础上解Bug了,


解完bug之后将隐藏的文件的提交格式:

cpp 复制代码
git commit -m "类型 | 编号 > fix xxxx bug"

git commit -m "fix | #1225 > fix xxxx bug"

fix 还要做一些说明,也就是固定的格式

cpp 复制代码
指令: git commit --amend

找对应的bug的一个提交链接也填进去,方便我们回溯项目时更清晰的知道bug在哪个位置是那一次的提交引起的,不要被自己坑了,这一点非常重要


查看log里面的前面3条:主要是查看更改完的效果

cpp 复制代码
git log -3

bug 解决完之后继续同步一下,因为远程仓库可能已经被更新

cpp 复制代码
git pull --rebase

cpp 复制代码
代码推送:git push origin HEAD:refs/for/master

回到原来的工作把隐藏的东西显示出来

cpp 复制代码
git stash apply stash@{0}

这个时候将每完成的工作继续做完,然后执行合并到远程仓库的操作即可。


6.0 change-id问题


在开发过程中可以回遇到没有change-id没有的问题,此时该如何处理?

没有change-id会出现push失败的情况

使用git push --rebase提交代码时显示没有change-id,这个时候会显示提交失败

如果出现没有change-id的情况可以次重新git commit 触发一次commit,git会重新生成change-id


git commit --amend --no-edit

这个时候change-id由重新出现了


使用这条代码克隆代码仓库,会自动的包含change-id的文件信息,如果不使用这一条进行克隆可能会导致出现change-id无法生成的情况。


7.0 修改分支


这是时候我们先创建一个分支,然后将当前主分支保存在临时创建的分支中,然后会回退到当前要改动的分支,在push上远程仓库,以下是具体操作:



cpp 复制代码
git rsset --hard xxxx 

把拉取修改后的内容继续push到远程仓库中


push时尽量使用rebase的方式提交,如果不使用rebase就会出现很多分叉,分支导致比较不整洁

以上是使用rebase的方式提交


新建一个分支指令:

cpp 复制代码
git checkout -b "本地分支名" "远程分支名"

8.0 冲突处理



创建一个分支然后将master分支存储

切换回主分支:然后同步远程分支内容

将远程的内容同步到本地


从远程仓库把文件下载下来


这个时候显示处于cherry-pick状态表示冲突没解完

这个时候push到远程此时远程的情况会更新,冲突会被解决


冲突的解决思想:一定要保证本地是master分支最新的代码,然后把远程的分支克隆下来,然后在本地解冲突,在更新上去。


提交规范......

相关推荐
Scott9999HH3 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社4 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海4 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖5 小时前
JDK 26 新特性详解
java·开发语言
马优晨5 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区7 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大8 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai8 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜8 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa8 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio