ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Gerrit 相关使用教程

Gerrit 相关使用教程

一、更新代码

1、更新全部代码

根目录执行:repo sync

筛选更新:repo sync -c --no-tags -d -j8

一般 repo sync 都会加上 -j4、-j8,代表最多可以多少个线程同时执行。主要根据个人电脑配置自行选择(建议 8G 内存使用 -j4,16G 内存使用 -j8)。

2、更新局部代码

指定目录下执行:git pull

3、重新下载代码

1)忽略本地的改动,强制重新下载代码

repo sync -d

2)下载过程中出现错误,继续下载

repo sync -f --force-sync

-f使遇到网络错误时继续下载,--force-sync表示出现冲突时继续下载。

二、分支

1、查看分支

本地分支:git branch

所有远程分支:git branch -r

所有分支:git branch -a

查看本地分支及关联的远程分支:git branch -vv

2、切换分支

直接切换:git checkout <name>

创建新分支并切换:git checkout -b <name>

覆盖本地代码并切换:git checkout -f <name>

创建本地分支并绑定远程分支

git checkout -b 本地分支 origin/远程分支

切换目录下所有仓库分支(循环切换)

repo forall -c git checkout <name>

修改关联的远程分支

git branch --set-upstream-to=<新分支路径>

3、删除分支

删除本地分支

git branch -d <本地分支名>

git branch -D <本地分支名>

如果本地分支没有与远程分支完全合并,且放弃合并时直接使用 -D 进行删除。

删除远程分支

git push origin --delete <分支名>

三、提交代码

1、查看修改

查看修改文件:git status

查看修改内容:git diff

2、提交代码到暂存区

全部提交:git add .

提交指定文件:git add <文件路径>

3、提交到远程分支

1)添加描述信息

单行信息:git commit -m "描述信息"

多行信息:git commit

这里多行信息处理还需要解释一下,git commit 进入到信息编辑窗口,这里还要对 Linux 和 Windows 分别介绍:

Linux

直接在上面填写信息,Ctrl+X 进行数据保存,退出即可。

Windows

输入小写字母 i 进入编辑模式,填写信息。

按 esc 键退出编辑模式,输入 :wq 保存退出。也按 esc 退出编辑模式后,连续按输入两个大写字母 Z 退出。

2)提交到指定分支:git push origin HEAD:refs/for/<分支名称>

  • git push:推送本地更改到远程仓库的基本命令。
  • origin:远程仓库的名字,默认情况下,克隆操作会自动设置远程仓库名为 origin。你可以通过 git remote -v 查看当前配置的远程仓库及其 URL。
  • HEAD:这是一个指向你当前所在分支顶端提交的指针。它代表了你最近一次提交的状态。
  • refs/for/<分支名称>:这里的 refs/for/ 是一个特殊的命名空间,通常与 Gerrit 等代码审查系统相关联。它表示推送的更改不会直接合并到目标分支,而是进入一个待审状态,等待其他开发者或管理员进行审查。而 <分支名称> 则是你想要推送更改的目标分支名。

4、特定提交应用到其他分支上

当我们需要将同一套修改提交到多个不同分支上时,首先想到的是切换不同分支依此提交,当然这种方式也可以,但 Gerrit 为我们提供了一个更简便的方法。

git cherry-pick <commit-id>

首先提交分支会得到一个 commit-id,提交其他分支时直接使用上面命令即可。也可以在 Gerrit 网站上操作。

1)点击右上角三个点按钮。

2)选择第一个 Cherry pick。

3)在 Cherry Pick to branch 下填写分支名称。

4)点击 CHERRY PICK 即可。

四、修改提交

1、修改描述信息:

git commit --amend

ps:注意不要修改 id 内容

2、追加提交

在代码提交后经常会服务器编译不通过需要修改的情况,简单的修改可以直接在网页中修改,但是内容多了在网页修改就比较麻烦了,这时候就需要追加提交代码。假日第一笔代码已经提交完成,本地代码已经提交,现在需要合并到之前的提交中:

  • 代码提交到暂存区:git add .
  • 使用 --amend 追加到上次提交:git commit --amend --no-edit
  • 强制推送代码到服务端:git push --force-with-lease origin <branch-name>

其中 --no-edit 表示沿用上一次提交的 commit message,不弹出编辑器,如果想同时修改提交信息,去掉该参数即可。如果代码还未推送,下一步正常push就可以,如果已经推送则需要再次强制推送,注意 --force-with-lease 会在远程分支已被他人更新时拒绝推送,避免覆盖别人的工作。

3、版本回退

git reset --mixed(默认)

将指定 commit id 撤回之后所有内容全部放进工作区中。可以省略 --mixed,直接使用 git reset。

回退到上一个版本:git reset HEAD^
回退指定文件到上一个版本:git reset HEAD^ xxx.java
回退到指定版本:git reset 版本ID

reset--soft:

将指定 commit id 撤回之后所有内容全部放进暂存区。

回退上上上一个版本:git reset --soft HEAD ~3

reset --hard:

将指定 commit id 撤回并清空工作目录及暂存区所有修改。撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交。

回退上上一个版本 :git reset --hard HEAD~2
回退到指定版本:git reset –hard 版本ID
与远程代码同步:git reset --hard origin/master

谨慎使用 –-hard 参数,它会删除回退点之前的所有信息。

远端对齐

如果本地没有修改,或者放弃本地修改,可以直接使用远端对其。

git reset --hard origin/xxx_xxx

HEAD 说明

HEAD 表示当前版本

HEAD^ 上一个版本

HEAD^^ 上上一个版本

HEAD^^^ 上上上一个版本

以此类推...

可以使用 ~数字表示

HEAD~0 表示当前版本

HEAD~1 上一个版本

HEAD~2 上上一个版本

HEAD~3 上上上一个版本

git reset HEAD

git reset HEAD 命令用于取消已缓存的内容。例如,我们需要撤销 commit1:

git revert commit1

执行上述命令后,git 会创建一个名为 "Revert commit1" 的新提交,该提交会删除 commit1 的所有修改。需要注意的是,git revert 命令不会删除历史提交,因此更加安全和可靠。

git revert

git revert 命令会创建一个新的提交,该提交会反转我们指定的提交内容。

4、取消本地修改

有时我们会误修改了文件或者不想提交某些文件,而又不想删除它。这时,我们可以使用git取消修改命令来撤销这些修改。

放弃单个文件修改:git checkout -- <文件名称>

放弃所有文件修改:git checkout .

git checkout 命令可以用来切换分支或者恢复文件。当我们使用 git checkout -- <文件名>命令来恢复文件时,它会将该文件回退到最近的提交状态。也就是说,该文件的所有修改都将被取消。 注意不要忘记中间的"--",不写就成了检出分支了。

5、Gerrit网站操作

修改提交内容

1)点击右上角 EDIT 按钮,进入编辑模式。

2)点击进入要修改的代码,并进行修改。

3)点击右上角的 SAVE 保存代码。

4)保存成功,点击右上角的 CLOSE 按钮退出代码编辑界面。

5)修改完成,点击右上角的PUBLISH DEIT按钮发布代码即可。

放弃本次提交

使用 ABANDON 功能放弃本次提交,同时还需要在本地分支使用命令 git reset HEAD^ 回退版本。再重新提交。

增加提交文件

增加提交文件功能主要用于在提交了一笔内容后,在同一个工程下还有一个文件需要简单修改,这时如果提交内容在本地还有其他修改,退回并重新提交显然是比较麻烦的,我们就可以 git 网站上直接增加新文件的修改。

1)点击右上角 EDIT 按钮,进入编辑模式。

2)点击修改代码文件上面的 ADD/OPEN/UPLOAD 选项。

3)在弹出的提示框中直接输入要修改的文件路径或者选择要增加的文件。

4)文件选择完成后直接进入文件编辑页面,这时就可以直接修改新增文件了。

查找对应分支

通常修改一段代码后,需要知道该代码都用在了哪些分支上,可以使用如下步骤查找:

1)点击操作栏 BROWSE 后选择 Repositories。

2)再输入框中输入修改文件对应的路径,点击对应的搜索内容。

3)选择这边栏的 Branches 选项。

这样就可以直接查看对应的分支列表。同时,在该页面也可以复制对应的 ssh 链接,直接粘贴到命令窗口进行对应的的代码下载。

6、修改提交地址

在提交代码模块下找到 .get 文件夹

修改 config 文件中的 url 地址即可

五、查看暂存区

查看暂存区中文件信息:git ls-files

–cached(-c):显示暂存区中的文件,git ls-files命令默认的参数
–deleted(-d):显示删除的文件
–modified(-m):显示修改过的文件
–other(-o):显示没有被git跟踪的文件
–stage(-s) :显示mode以及文件对应的Blob对象,进而我们可以获取暂存区中对应文件里面的内容。

六、配置SSH

1、Windows系统

查看SSH

命令:vim ~/.ssh/id_rsa.pub

输入o 回车

退出查看:按esc,输入 :q

配置SSH

ssh-keygen -t rsa -C "个人邮箱"

ssh-agent bash

ssh-add ~/.ssh/id_rsa

添加到Gerrit

进入 Gerrit 设置界面,选择 SSH Keys,添加上面的 SSH Keys 即可。

2、Linux系统

在主目录下找到 .ssh 文件夹,这里就是 ssh 相关信息。

查看SSH

找到 /.ssh/id_rsa.pub 文件,双击打开即可。

配置SSH

找到 /.ssh/config 文件,并使用下面命令打开文件(双击打开文件可以查看但无法编辑)。

sudo gedit config

配置 gerrit 信息

Host 192.168.1.1
HostName 192.168.1.1
User xiaoxu
IdentityFile ~/.ssh/id_rsa

添加到Gerrit

进入 Gerrit 设置界面,选择 SSH Keys,添加上面的 SSH Keys 即可。

七、patch使用

1、.patch文件

生成补丁

生成最近1次commit的patch:git format-patch HEAD^ 或 git format-patch -1 HEAD

生成最近2次commit的patch:git format-patch HEAD^^ 或 git format-patch -2 HEAD

生成单个commit的patch:git format-patch -1 <r1>(<r1>为commit id)

应用单个补丁

检查patch文件:git apply --stat newpatch.patch
检查能否应用成功:git apply --check newpatch.patch
打补丁:git am --signoff < newpatch.patch

打补丁时可以使用 -s 或 --signoff 选项,可以commit信息中加入 Signed-off-by 信息

批量应用补丁

git am --abort
git am patch/*.patch

2、.diff文件

对于 patch 除了上面的 .patch 文件类型之外,还有 .diff 等其他文件类型的不行,这里介绍 .diff 类型文件主要是在 Gerrit 网站的对应提交页面中可以直接下载该类型的 patch 文件。

这里选择 Download patch 下载的就是 .diff 类型的 patch 文件,当然 .diff 类型的文件也是可以通过 git 命令进行生成。

相关命令

生成补丁:git diff > changes.diff

检查补丁:git apply --check changes.diff

应用补丁: git apply changes.diff

冲突处理

有时在合并代码的时候回存在冲突,这是直接使用上面的命令会报异常导致合并失败,这时我们可以使用下面命令强制合并,再对冲突代码进行手动处理。

强制合并:git apply --reject changes.diff

使用强制合并命令生成 .rej 文件,我们可以参考 .rej 文件对冲突代码进行处理,最后删除对应的 .rej 文件即可。

八、Git LFS

Git 本地会保存文件所有版本,对于大文件很容易导致仓库体积迅速膨胀,Git LFS(Large File Storage)是一个 Git 的扩展,用于实现 Git 对大文件的支持。简单的说,就是如果你想传超过100M的二进制文件到 GitHub,你就要用 Git LFS。

1、代码更新

使用了 LFS 上传代码后,下载代码是也会有所区别,指定目录下更新代码:

git lfs pull

全部更新,repo sync后执行:

repo forall -c "git lfs pull"

2、异常处理

Encountered 7 file(s) that should have been pointers, but weren‘t

Git 仓库启用了 LFS,更新代码时莫名其妙的显示一些出现修改,然而使用上面的一些丢弃命令、覆盖更新等都不起作用,都会出现上面的错误。

直接一次性执行下面命令:

git rm --cached -r .;git reset --hard;git rm .gitattributes;git reset .;git checkout .

九、代码暂存

使用场景:在 branch_1 上修改了部分代码,这时 branch_2 项目来了一个急需修改的 Bug,并且要修改的位置与 branch_1 还相同。由于 branch_1 还未修改完成无法提交,而且由于有修改代码也无法切换分支。这就需要使用到暂存功能,先将 branch_1 的修改暂存,在修改完 branch_2 的 Bug 后,回到 branch_1 取出暂存继续修改即可。

查看保存:git stash list

保存:git stash save "自定义命名"

恢复保存:git stash apply 0(0为列表id)

删除保存数据:git stash drop stash@{1}

十、其他

1、查看Log

上次提交:git show

提交历史:git log

文件修改详情:git log -p <文件名称>

文件修改历史:git blame <文件名称>

2、帮助命令

git help

3、提交对比

安装:sudo apt install gitk

使用:gitk

4、查看Gerrit信息

git remote -v

更多功能:https://mp.weixin.qq.com/s/8lhyBCnvOst2iKy-UFUo3Q

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进