我正在尝试比较在两个不同提交中从 master fork 的两个不同分支上所做的更改。因此,我不想看到在两个分支之间的 master 上所做的更改。

我尝试过 git diff topic1 topic2 ^mastergit diff topic1..topic2 ^master ,但我发现我得到了不同的结果 - 特别是一组不同的更改文件 - 尽管文档指出 git diff a bgit diff a..b 是相同的。 ( https://www.git-scm.com/docs/git-diff#_examples )

这两个命令有什么区别,我可以信任哪一个?或者,我只是做错了?有没有更好的办法?

最佳答案

git diff 的修订解析代码过于宽松,然后最终用多个参数做错了事。在某些情况下,如果您给它两个以上的提交 ID 并且其中至少一个被否定(正如您所做的那样),它会错误地解释其参数。特别是,它最终将(正引用、正引用、负引用)三元组视为三点语法。

几周前,我提交了 a Git fix specifically for this ,它(像往常一样)被忽略了(叹气)。然而,即使有了这个修复,你也无法得到你想要的。除了组合差异的更特殊情况——这仍然不是你想要的——你只能让 Git 比较最多两个已经存储在存储库中的现有树:



换句话说,你有一个像这样的提交图:

          a--a--A      <-- feature-A
         /
...--o--*--o--o-...    <-- master
               \
                b--B   <-- feature-B

并且您想将 feature-A 的最尖端提交(即提交 A)与如果您将两个完全在 feature-B 上的提交(提交 bB )并将它们应用到我标记为* ,即 feature-Amaster 分支的点。

你可以很容易地让 Git 比较提交 A 的树和提交 B 的树。这就是 git diff feature-A feature-Bgit diff feature-A..feature-B 所做的。但这不是你想要的。

要获得提交 A 的树和(当前假设的)树 B' 之间的差异,您必须创建一个临时分支1,然后挑选两个 feature-B -only 提交到 * :
          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 中的提交,包括临时分支上的临时提交,足够快且足够便宜,这不会给你带来太多好处——如果某些挑选步骤需要解决 merge 冲突,它只会让一切变得更加困难。

关于git - `git diff topic1 topic2 ^master` 和 `git diff topic1..topic2 ^master` 有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38648906/

10-11 17:32