主题分支上的Git diff,不包括同时发生的合并提交?

Vla*_*vic 13 git diff aggregation git-merge

假设我有以下情况:

    B---D---F---G topic
   /       /
--A---C---E master
Run Code Online (Sandbox Code Playgroud)

对于代码审查的目的,我想拔出DIFF从犯犯G,但不包括提交E和C即发生在主分支,也包括不提交F,可以合并提交.

换句话说,我想生成一个包含从F到G的变化的差异,并将这些变化与A到D的变化进行汇总.

换句话说,我希望审阅差异仅包含我对主题分支的更改,而不包括同时发生的大量代码.

这可能吗?如果git无法处理这样的"差异聚合",我会非常感谢有人可以提供一些关于外部命令如何做到这一点的指针(这样我就可以尝试编写一个bash脚本来完成这个技巧).

Kar*_*ldt 5

如果你不关心差异的"上下文"部分,那么git diff master..topic你会得到你想要的东西.任何更改在介绍CE被认为是把差异"基地"的一部分,所以从变化master将在那里的背景下,但只有在你的话题分行实际做出的更改将被标记+-为改变.这通常是人们想要进行代码审查的.

如果你想要表现得从未发生合并,你将不得不将其重新定义:

git rebase --onto A master
Run Code Online (Sandbox Code Playgroud)

  • 谢谢卡尔,`git diff master..topic`做了这个伎俩.事实证明,在运行diff脚本之前,我必须将master合并到topic中. (2认同)

Rob*_*mer 5

Karl的回答令人误解:

git diff永远不会在适当的范围(即多次提交)上工作,只能在两次提交之间进行!

范围语法对具有特殊含义git diff

git diff E..G总是等于git diff E G(并且在这种情况下
git diff E...G等于git diff E G,因为E是两者之间的合并基础)。

git diff master...topic这就是您想要的,并且在一般情况下是这样:它向您显示主题分支的所有更改,将其与最后一个合并基础进行比较(即,上次合并时将其与master进行对比,而忽略master中所有以后的更改仍然不在您的主题分支中)。

注意:不幸的是(巧合?)x..yin git log等的效果最好用x...yin 表示,git diff反之亦然!