Gerrit:继续处理未提交的变更集

Gerrit: Continue working on not submitted change sets

我们最近引入了 gerrit 以在我们的团队中拥有一个代码审查工具。现在有一个问题,我想和你讨论一下我的解决方案。

问题: 开发人员正在修复一些小错误,并希望对这些更改使用代码审查。由于问题 ID,他正在为每个错误修复创建一个更改集。所有更改都转到分支 "develop"。同时有一个审阅者,他对一些代码更改有一些疑问。他(验证者)要求开发人员更改特定更改集(SHA 1234)上的某些内容,这不是最后一个。

此时开发者的树是:

A <-- B <-- SHA1234 <-- D <-- E

其中 A 和 B 是已经审核并提交的提交; SHA1234要改; D 是一个完全不同的补丁集,并且已经推送到 gerrit; E 将是一个完全不同的补丁集(这是一个目前不存在于 gerrit 中的提交)。

现在怎么办?

我提出的解决方案是这样的:

  1. 创建临时分支

    git branch tmp
    
  2. 将头指针重置为提交以更改 SHA:1234

    git reset --hard 1234
    
  3. 完成所有更改并在 --amend

    完成后提交
    git commit --amend
    
  4. rebase "tmp" 分支删除过时的提交

    git checkout tmp
    git rebase -i develop
    

...删除列表中过时的提交并保存+关闭编辑器。

  1. 将 tmp 合并回 develop 并删除 tmp 分支

    git checkout develop
    git merge tmp
    git branch -d tmp
    
  2. 再次将更改推送到 gerrit

    git push origin HEAD:refs/for/develop
    

你觉得呢?有没有更简单的solution/workflow?

He asks the developer for a patch to a specific change set (SHA 1234) which is not the last one. What to do now?

使用 gerrit 应该很容易,特别是因为他为每个错误修复创建了一个补丁集。

首先,因为我一直使用 gerrit 的“旧屏幕”,还没有找到如何使用“新屏幕”,你可能也想将你的设置为“旧屏幕”。

在设置 -> 首选项 -> 更改视图

然后,在你的家伙想要检索的特定补丁集的页面上,你应该看到这个部分

在这里,如您所见,他有几个选项。结帐/拉/樱桃挑选/补丁。他可以 select 他需要的选项,然后复制出现的 link 并将其粘贴到 git 终端。

例如,我经常使用它来挑选一个新的提交到我的本地开发分支,以验证 android 设备上的一些新代码,因为并不总是很容易看出它是如何工作的以及它是否工作只看代码。


编辑:

The original developer has some further commits. So the tree has a dependency to sha1234. But he has to change sha1234 in order to apply the code review results. The commit that have sha1234 as the parent has to be rebased. Of course that has also impact of all the following commits he already have and result in some conflicts...

The initial question was: Is the proposed way (the steps above) to solve that situation wrong?

不一定是错的,但我觉得有更简单的方法。

  • 检查具有提交 1234 的分支和依赖它的其他提交

  • 做一个交互式变基,可以追溯到提交 1234 是

     $ git rebase -i HEAD~5  # replace 5 with how many commits back 1234 is
    
  • 将提交 1234 设置为 'edit',其余设置为 'pick'(选择应该是默认设置)。退出nano/vim并确认。

  • 您将返回到提交 1234。您可以在此处进行编辑并修改提交。 (注意:修改提交会更改其哈希)

  • $ git rebase --continue git 现在将尝试在修改后的 1234 之上重新应用其他提交。

    • 如果没有出现冲突:太好了,你现在已经完成了变基。

    • 如果他们这样做:以您喜欢的任何方式解决冲突,并用 git add 或 git rm 标记已解决的冲突。然后再次 git rebase --continue。重复此步骤,直到解决所有冲突。您现在应该回到开始的地方,但历史发生了变化。

  • 现在,由于所有这些提交都已更新(1234 已修改,其他已更新 parent/dependency),您需要将它们全部重新推送到 gerrit。这应该像 $ git push origin HEAD:refs/for/develop 一样简单,gerrit 会自动检测哪些补丁集已收到更新。

我在这里更详细地解释了这个过程:Modifying old commit in git