我正在尝试比较在两个不同的提交中从master分叉的两个不同分支上所做的更改。因此,我不希望看到两个分支之间对master进行的更改。
我尝试了git diff topic1 topic2 ^master
和git diff topic1..topic2 ^master
,但我发现我得到了不同的结果 - 特别是一组不同的已更改文件 - 尽管文档指出了git diff a b
和git diff a..b
是一样的。 (https://www.git-scm.com/docs/git-diff#_examples)
这两个命令有什么区别,我可以信任哪一个?或者,我只是做错了吗?还有更好的方法吗?
答案 0 :(得分:7)
git diff
的修订解析代码过于宽松,然后用多个参数做错了。在某些情况下,如果你给它提供两个以上的提交ID并且至少其中一个被否定(正如你所做的那样),它会错误地解释它的参数。特别是,它最终处理(positive-ref,positive-ref,negative-ref)三元组,好像它是三点语法。
几个星期前,我提交了a Git fix specifically for this,其中(照例)已被忽略(叹息)。即使有了这个修复,你也无法得到你想要的东西。除了组合差异的更特殊的情况 - 它仍然不是你想要的 - 你只能让Git比较最多两个现有的树已经存储在存储库:
我正在尝试比较在两个不同的提交中从master分叉的两个不同分支上所做的更改。因此,我不希望看到两个分支之间对master进行的更改。
换句话说,你有一个类似的提交图:
a--a--A <-- feature-A
/
...--o--*--o--o-... <-- master
\
b--B <-- feature-B
并且您希望将feature-A
的提示最多提交(即提交A
- 与您将获得的内容进行比较如果您进行了两次专门提交在feature-B
上(提交b
和B
)并将其应用于我标记为*
的提交,即feature-A
从master
分支的点{1}}。
你可以很容易让Git比较提交A
的树与提交B
的树。这是git diff feature-A feature-B
和git diff feature-A..feature-B
所做的事情。但这不是你想要的。
要在提交A
的树和(当前假设的)树B'
之间获得差异,您必须创建一个临时分支, 1 ,然后挑选两个feature-B
- 仅提交到*
:
a--a--A <-- feature-A
/
...--o--*--o--o-... <-- master
\ \
\ b--B <-- feature-B
\
b'-B' <-- temporary branch
现在你真的有一个提交B'
,如果你“拿走”两个中间master
提交你得到的树,而现在你可以比较A
的树对这个新提交的树。
1 技术上可以在没有临时分支的情况下完成所有这些操作,方法是在工作树中构造假设树B'
,而不使用git cherry-pick -n
进行提交,而不是使用git cherry-pick
作为临时分支上的一系列提交。但是Git中的提交,包括临时分支上的临时提交,足够快且足够便宜,这对你来说并不多 - 如果一些挑选步骤需要解决合并冲突,它只会使一切变得更加困难。