Git 与 Gerrit 集成的工作流

268 阅读3分钟

在 Git 与 Gerrit 集成的工作流中,每个提交(commit)都由一个唯一的 Change-Id 标识。假设你已经有两个提交,并且其中一个提交需要修改内容。在这种情况下,你需要确保新的修改被添加到现有的 Change-Id 上,然后推送到 Gerrit。以下是详细步骤:

前提条件

  1. 你已经配置好 Gerrit 并且提交中包含 Change-Id
  2. 你已经在本地有两个提交,并且每个提交都有一个 Change-Id

1. 找到需要修改的提交

假设你的提交历史如下:

commit abc1234 (HEAD -> main) 
Author: Your Name <you@example.com> 
Date: Wed Oct 20 12:34:56 2023 +0100 
Second commit 
Change-Id: I23456789abcdef123456789abcdef123456789

commit def5678 
Author: Your Name <you@example.com> 
Date: Wed Oct 20 12:34:56 2023 +0100 
First commit 
Change-Id: I9876543210fedcba09876543210fedcba09876

你需要修改 First commit 的内容。

2. 交互式 rebase

为了修改指定的提交(在本例中是 First commit),可以使用交互式 rebase:

git rebase -i HEAD~2

在编辑器中,你将看到类似如下的内容:

pick def5678 First commit 
pick abc1234 Second commit

将需要修改的提交前的 pick 改为 edit

edit def5678 First commit 
pick abc1234 Second commit

保存并关闭编辑器,这将启动交互式 rebase,并暂时停留在需要修改的提交上。

3. 进行修改并添加到暂存区

进行所需的修改,然后添加到暂存区:

# 例如,编辑一个文件 
nano file_to_edit.txt 
# 将修改添加到暂存区 
git add file_to_edit.txt

4. 修订提交

执行以下命令修订提交并包含 Change-Id:--amend会把提交应用在这个changeId上

git commit --amend

确保原有的 Change-Id 仍然存在,不要删除。例如:

First commit 
Change-Id: I9876543210fedcba09876543210fedcba09876

保存并关闭编辑器。

5. 继续 rebase

git rebase --continue

如果有冲突,解决冲突并继续:

# 解决冲突后 
git add resolved_file.txt 
git rebase --continue

6. 推送到 Gerrit

完成 rebase 后,将修改推送到 Gerrit:

git push origin HEAD:refs/for/main

这么做就能确保新修改被应用到指定的 Change-Id 上,并推送到 Gerrit。

这样推送到远程后 git是停留在需要修改的提交上 还是停留在最新的提交上???

在你完成整个交互式 rebase 过程并继续到最后一步时,Git 将会将 HEAD 指针重新覆盖到最新的提交。这意味着在你解决了所有冲突并运行 git rebase --continue 之后,Git 将执行完整的 rebase 序列并将当前分支指向最新的提交。 也就是说,在完成所有的冲突解决和 rebase 之后,Git 应该会停留在最新的提交上。

如何更新远程代码到本地?

#如果本地有修改或者有未提交的可以先隐藏(其实是一次暂存,不需要add和commit)这会让工作区是一个干净的工作区
git stash
#执行更新
git pull --rebase
#当 `rebase` 完成后,你可以把之前保存的修改重新应用到工作目录:
git stash pop
#如果在应用 `stash` 的过程中出现冲突,需要手动解决冲突,然后继续操作。
#解决冲突文件并暂存 解决完冲突一定要 add 
git add resolved_file