2020-10-29 init
2020-11-06 更新基础使用规则
2020-11-25 添加 进阶2. 更换账户
2020-12-17 添加 进阶3. 拉取线上代码


基础

1. pull

1.1 情景还原

gerrit如何拉代码?当前分支,存在并行开发,A已经完成评审并合入分支,B仍在开发未合入分支,且存在一个或多个提交,需要拉取A的代码接入到当前分支,怎么办?

1.2 解决办法

例如拉取分支dev_branch

git pull --rebase origin dev_branchgit status // 看有没有冲突
git add -u // 一键添加冲突项
git rebase --continue // 处理完冲突继续rebase
git rebase --abort    // 我不处理了,放弃pull
git rebase --skip     // 抛弃冲突项,pull到的内容就是不完整的了

2. push

2.1 情景还原

gerrit我该怎么push?代码怎么让别人评审?

2.2 解决办法

例如上传dev_branch

git push origin HEAD:refs/for/dev_branch

3. 根据review意见更新代码

3.1 情景还原

我的代码被评审提出了一系列修改意见,修改后,我是像gitlab/github那样再创建一个新的commit提交吗?

3.2 解决办法

不是的,这就是gerrit和gitlab/github不同的地方了,前者将多次提交看做同一主题的commit,使用patch概念管理,例如对于commit A,评审给出review意见,开发者按照意见进行修改,修改的部分作为同一个commit的patch,而如何判断同一个commit,就是commit id了,需要添加个钩子hook才会自动生成,不同的patch拥有相同的commit id;后者使用merge-request策略,修改好后,作为新的提交再扔给服务器,然后提出合并请求,审批人根据diff同意或打回请求。两者各有优缺,但我属于old style,个人还是喜欢gerrit的patch管理思想。

例如上传dev_branch

git add -u // 一键添加修改的部分
git commit --amend // 作为补丁,将新的修改点加入到commit里
git push origin HEAD:refs/for/dev_branch // 跟push相同

进阶

1. 分支合并

1.1 情景还原

使用git merge在本地执行分支合并操作,git push origin HEAD:refs/for/dev到gerrit 上评审入库,提示:

! [remote rejected] HEAD -> refs/for/dev (no new changes)

1.2 原因

没有新的commit,使用git log也可以看到,并没有类似Merge remote-tracking branch,即这个合并,是线性的合并,那些需要合并的commit节点,在gerrit上都已经提交评审过了,所以本次merge并没有commit。

1.3 解决办法

方法1: 使用git merge --no-ff,强制让git生成一个新的commit,这样就可以提交了

方法2:不经过gerrit,直接git push入远程库,这个branch就会乱掉。

2. 更换账户

2.1 情景还原

我换了账户,也切了config,操作为:git config --global user.namegit config --global user.email,已经与gerrit服务器上的信息对上了,但在git push的时候还是报错如下:

remote: ERROR:  In commit xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
remote: ERROR:  committer email address my_email@email.com
remote: ERROR:  does not match your user account.
remote: ERROR:
remote: ERROR:  The following addresses are currently registered:
remote: ERROR:    previous_email@email.com
remote: ERROR:
remote: ERROR:  To register an email address, please visit:
remote: ERROR:  https://my_gerrit.com/#/settings/contact
remote:
remote:
To http://my_gerrit.com:1234/my_repo! [remote rejected]       HEAD -> refs/for/my_branch (invalid committer)
error: failed to push some refs to 'http://my_gerrit.com:1234/my_repo'

2.2 原因

很大概率你是使用的macOS的,macOS保存了登录gerrit的登录记录,把它清掉就好。

2.3 解决办法

Launchpad -> Other -> Keychain Access

直接搜索gerrit字样,就可以看到登录信息了,改成自己的id就可。

3. 如何在本地review别人的代码/拉取未合入的代码

3.1 情景还原

帮着别人调代码,由于这份提交有bug,不能合入到分支中,那该怎么搞到他的代码呢?

3.2 解决办法

3.2.1 等级一
git diff (your commit hash code) >> mycode.patch # 将本次提交与主干相比较,并输出到后缀为".patch"的文本文件中
# 将这个".patch"发给对方
git apply mycode.patch # 在对方的代码上应用本次提交

如果存在多个分支、多次提交,对方必须拥有跟你上次提交一模一样的代码,即相同的分支,相同的提交记录,而且还要发来发去,一点都不优雅。既然自己的代码已经push到了服务器等待大佬合并,那为啥不能从gerrit服务器直接拉取代码呢?

3.2.2 等级二

在gerrit页面上,是可以看到自己待review的提交的,进入提交详情页面,右上角有个download选项,点开就可以看到各种拉代码的方法了:

  • Checkout,把自己的分支全部都拉下来
  • Cherry Pick,把自己的提交拉下来,并且接在本地的分支头上
  • Format Patch,就是控制打前几个patch,这里的patch就是gerrit特有的内容了
  • Pull,跟Checkout有点像,区别跟普通的checkout和pull差不多
  • Patch-File,跟diff法子一样,然后再apply
  • Archive,把仓库的代码全部下下来,慎点,仓库很大的话就会下很久

我一般使用的是Checkout,它对应的代码如下,可以看到,其内容实际上是git fetchgit checkout的组合,里面的refs/changes/233/2333/1的最后一个数1实际上对应着当前拉取的patch是本次commit的第1个patch,因此在这里控制后面的这个数,也就跟Patch-File的行为差不多了。

CheckoutFormat PatchPull的行为差不多,需要注意的是Cherry Pick,它内部执行的git cherry-pick是将本次commit接在本地分支的头上,所以有可能,本地分支是超前与本次提交或者落后于本次提交,前者会出冲突,后者可能会丢失某些comit。

git fetch ssh://xxx@xxx.gerrit.com:1234/target_repos refs/changes/233/2333/1 && git checkout FETCH_HEAD

gerrit疑难杂症合集相关推荐

  1. 疑难杂症之各种小坑合集

    踩坑小合集 前言 正文 Spring注解相关 一.@Async注解导致项目启动时提示循环注入错误 more and more 更多内容敬请期待,在闲暇之余都会记录上比较有趣的坑 !!!欢迎大家一起讨论 ...

  2. linux 中级 教程pdf,Linux初中级学习者指导Linux操作系统技术合集.pdf

    红联的个人空间 Linux操作系统技术合集 作者:红联 Linux操作系统技术合 集 ─────Linux初, 中级学习者教程 Linux有些神奇,有人就这么说,Linux有些意思,我想尝尝,尚末安装 ...

  3. 最全知乎专栏合集:爬取11088个知乎专栏,打破发现壁垒(编程、python、爬虫、数据分析..)

    最近逛博客,看到一篇很好的文章,整合了知乎上所有优秀的编程.算法专栏,对学习的帮助非常大,转载过来分享给大家: 众所周知,知乎官方没有搜素专栏的功能,于是我通过爬取几十万用户个人主页所关注的专栏从而获 ...

  4. 最全知乎专栏合集:编程、python、爬虫、数据分析、挖掘、ML、NLP、DL...

    上一篇文章<爬取11088个知乎专栏,打破发现壁垒>里提到,知乎官方没有搜素专栏的功能,于是我通过爬取几十万用户个人主页所关注的专栏从而获取到11088个知乎专栏. 本回筛选出其中涉及:编 ...

  5. 入门指南目录页 -PaddlePaddle 飞桨 入门指南 FAQ合集-深度学习问题

    入门指南目录页 -PaddlePaddle 飞桨 入门指南 FAQ合集 GT_Zhang关注 0.1012019.08.01 18:43:34字数 1,874阅读 795 Hi,欢迎各位来自Paddl ...

  6. 全文翻译(全文合集):TVM: An Automated End-to-End Optimizing Compiler for Deep Learning

    全文翻译(全文合集):TVM: An Automated End-to-End Optimizing Compiler for Deep Learning 摘要 人们越来越需要将机器学习应用到各种各样 ...

  7. Open3D点云处理算法最全合集

    Open3D点云处理算法最全合集,致力于搜集可运行,可视化较好的Open3D算法,持续更新中- 1. Open3D 点云读取及可视化.离群点去除 2. Open3D 点云体素格下采样 3. Open3 ...

  8. JAVA Web项目中所出现错误及解决方式合集(不断更新中)

    JAVA Web项目中所出现错误及解决方式合集 前言 一.几个或许会用到的软件下载官网 二.Eclipse的[preferences]下没有[sever]选项 三.Tomcat的安装路径找不到 四.T ...

  9. 一、PyTorch Cookbook(常用代码合集)

    PyTorch Cookbook(常用代码合集) 原文链接:https://mp.weixin.qq.com/s/7at6y2NcYaxGGN8syxlccA 谢谢作者的付出.

最新文章

  1. 力扣(LeetCode)刷题,简单+中等题(第28期)
  2. webservice 测试窗体只能用于来自本地计算机的请求
  3. 工作309:uni-获取vuex里面的值
  4. 4x3矩阵键盘扫描法c语言,四种4*4矩阵键盘的扫描方法
  5. 考软件测试初学者眼影,Summer 大讲堂第一期:如何制作出版级的高分辨率图表?...
  6. Python 的一些网络库(感谢Arbow)
  7. 07 SQL优化技术
  8. Atitit.编程语言的基础句型and汉语英文比较
  9. Docker部署AI算法教程
  10. python 邮件服务器_python SMTP邮件服务
  11. mac os 下 打开 JXM 文件
  12. Angular入门到精通系列教程(14)- Angular 编译打包 Docker发布
  13. 有没免费云桌面,免费桌面虚拟化软件? 确实有的
  14. 七牛云获取token中的bucket是什么?
  15. CANopen--基于DS402协议的伺服电机原点回零模式
  16. Java-----投票系统
  17. 中国储物篮市场运营状况及投资经营分析报告 2022-2027年版
  18. android wp8相机,Camera360 for WP8推出“时光相机” 让你重温岁月痕迹
  19. 磁盘划分和磁盘格式化
  20. lu分解 matlab课件,LU分解与部分旋转Matlab

热门文章

  1. 什么是尾调用优化和尾递归?
  2. 【并发编程】程序的启动和终结
  3. js截取英语完整单词,超出部分显示...”
  4. CentOS 6或者7的YUM源服务器搭建
  5. Adobe Flash CS6 配置错误,错误代码:1
  6. P6软件应用的核心收益
  7. 软件测试员必知!压力测试总共需要几个步骤?思路总结篇
  8. Oracle存储过程编译卡死或者运行卡死的解决方法
  9. mysql中,设置数据ID从1开始
  10. Docker安装配置教程