多次提交的Git差异工具,其中包括其他人的提交

5
我们有一个工作流程,需要其他开发人员审核提交的代码。在简单情况下,可以使用“git diff oldhash newhash >diff.txt”完成此操作,并将其上传到我们的审查委员会。
但是否有一种方法可以创建跨多个提交的差异,并排除其他人在其中完成的提交。例如,我想创建从mine1到mine4的差异,但要排除Joe的提交:
mine4
mine3
joe's
mine2
mine1

有什么办法可以在命令行git或其他工具中做到这一点吗?
由其他人提交的更改影响的文件与我的更改不同,因此在这种情况下,只需排除其他人所做的更改。

这并不是很有意义。mine4 依赖于 mine3joe'smine2(当然还有 mine1)。 - knittl
在查看Git对象时可能会存在依赖关系,但它们可能会涉及源代码完全独立的部分。 - Bombe
@Bombe:可能会,也可能不会。如果中间提交涉及相同的代码块(还有文件可能被移动/重命名),那么就没有合理的表示方式。 - knittl
现在,通过审查 GitLab(开源)或 GitHub(非开源)上的拉取/合并请求,这可以更轻松地完成。 - colan
4个回答

5
您可以通过创建一个新分支并结合使用 cherry-pick 实现此目的:
git checkout -b mine_diffs
git cherry-pick mine1
git cherry-pick mine2
git cherry-pick mine3
git cherry-pick mine4
git diff mine1_ mine4_

完成后,只需删除分支即可。请注意,进行差异比较时sha1哈希值会有所不同,这就是mine1_和mine4_的含义。


4
我不太确定你所说的“从mine1到mine4”是什么意思。除了合并中间状态之外,差异总是成对出现的;“git diff mine1 mine4”将为您提供这两个树之间的所有更改。在上面的示例中,您可以获得四个单独的补丁:mine1->mine2,mine2->joes,joes->mine3,mine3->mine4。如果您执行mine1->mine2,mine2->mine3,mine3->mine4,则仍然会“看到”joe的更改。
也许您想要的是(如@OleksandrKravchuk建议的那样)“如果将mine2、mine3和mine4的更改cherry-pick到从mine1开始的分支中,则会得到一个diff”。在这种情况下,您必须这样做:创建这样的分支,选择要应用的那些更改,然后生成diff。
您可以通过创建临时分支并执行一系列“git cherry-pick”,跳过要省略的提交来轻松自动化此过程。

3

好的,也许这不是真正的git方式,但我会创建一个新分支,删除不需要的提交,并比较两个分支。


1
  1. 将一堆提交作为一个差异进行审查是不好的风格:代码审查(如果使用)必须在单个提交级别上工作。
  2. 您不能拥有“稀疏”的差异
  3. 也许正确的工具会是正确的方式?对于Git来说,它是Gerrit

关于1 - 有些开发人员经常提交和推送代码。我想我们需要教育他们使用squash合并重置吗? - Petteri H
@PetteriHietavirta - 经常提交代码是好的,但这与CodeReview的使命“提交好的代码”无关。频繁的提交对审核人员来说是一个头疼的问题,而不是程序员。 - Lazy Badger
2
我们在Git中进行审查的方式是:(1)所有开发都在功能分支中进行;(2)每个功能分支只有一个开发人员;(3)当分支准备就绪时,它会被压缩并重新提交,以便每个补丁代表最小的合理逻辑变更单元;(4)分支在经过审查后合并在一起。另请参阅有关Git开发流程的文档(即Git本身的开发)。 - Alexander Gladysh
@AlexanderGladysh - 我对你的工作流程没有任何意见:它几乎是理想的,但是 OP 的情况是...... 嗯,让我们说...... 更弱 - 线性开发和审核不是针对提交和特性(完成),而是WIP。 - Lazy Badger
将整个功能分支压缩为单个提交会破坏有价值的信息,并且(对于较大的功能)不会使审阅者的工作更轻松。 - Bombe
@Bombe - 压缩只是回答不同的问题:不是“如何”,而是“什么”。 - Lazy Badger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接