假设我有以下情况:
B---D---F---G topic
/ /
--A---C---E master
出于代码审查的目的,我想从提交A中提取一个diff来提交G,但不包括在主分支上发生的提交E和C,也不包括提交F,这是一个合并提交。< / p>
换句话说,我想生成一个包含从F到G的变化的差异,并将这些变化与从A到D的变化进行汇总。
换句话说,我希望审阅差异仅包含我对主题分支的更改,不包括同时发生的一堆代码中的代码。
这可能吗?如果git无法处理这样的“diff聚合”,我会非常感谢有人可以提供一些关于外部命令如何做到这一点的指针(这样我就可以尝试编写一个bash脚本来实现这一点)。
答案 0 :(得分:5)
如果您不关心差异的“上下文”部分中的内容,那么git diff master..topic
将为您提供所需内容。 C
和E
中引入的任何更改都被视为差异的“基础”的一部分,因此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..y
中git log
的效果最好由x...y
git diff
表示反之亦然!
答案 2 :(得分:1)
怎么样:
git结帐主题
git checkout -b temp
git revert F
git diff A
之后你可以愉快地删除临时分支。