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

时间:2011-09-20 17:07:31

标签: git diff git-merge aggregation

假设我有以下情况:

    B---D---F---G topic
   /       /
--A---C---E master

出于代码审查的目的,我想从提交A中提取一个diff来提交G,但不包括在主分支上发生的提交E和C,也不包括提交F,这是一个合并提交。< / p>

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

换句话说,我希望审阅差异仅包含我对主题分支的更改,不包括同时发生的一堆代码中的代码。

这可能吗?如果git无法处理这样的“diff聚合”,我会非常感谢有人可以提供一些关于外部命令如何做到这一点的指针(这样我就可以尝试编写一个bash脚本来实现这一点)。

3 个答案:

答案 0 :(得分:5)

如果您不关心差异的“上下文”部分中的内容,那么git diff master..topic将为您提供所需内容。 CE中引入的任何更改都被视为差异的“基础”的一部分,因此master中的更改将在上下文中出现,但只有实际更改在您的主题分支将标记为+-作为更改。这通常是人们对代码审查的期望。

如果您希望表现得像合并从未发生过,那么您将不得不将其重新定义:

git rebase --onto A master

答案 1 :(得分:3)

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..ygit log的效果最好由x...y git diff表示反之亦然!

答案 2 :(得分:1)

怎么样:

  1. git结帐主题

  2. git checkout -b temp

  3. git revert F

  4. git diff A

  5. 之后你可以愉快地删除临时分支。