git diff 的修订版解析代码过于宽松,最终导致使用多个参数做错事。在某些情况下,如果您给它两个以上的提交 ID 并且其中至少一个被否定(正如您所做的那样),它会错误地解释其参数。特别是,它最终将 (positive-ref, positive-ref,negative-ref) 三元组 视为 它是三点语法。
几周前,我提交了a Git fix specifically for this,它(像往常一样)被忽略了(叹气)。但是,即使使用此修复程序,您也无法获得想要的东西。除了更特殊的 combined 差异(这仍然不是您想要的)之外,您最多只能让 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 分支的点。
您可以很容易地让 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 提交,现在你可以比较 @987654345 的树@ 反对这个新提交的树。
1技术上可以通过在工作树中构建假设树B',使用git cherry-pick -n,而不是作为使用git cherry-pick 在临时分支上进行一系列提交。但是 Git 中的提交,包括临时分支上的临时提交,足够快且足够便宜,这不会给你带来太多收益——如果某些挑选步骤需要解决合并冲突,它只会让一切变得更加困难。