【问题标题】:What is the difference between `git diff topic1 topic2 ^master` and `git diff topic1..topic2 ^master`?`git diff topic 1 topic 2 ^master` 和 `git diff topic 1..topic 2 ^master` 有什么区别?
【发布时间】:2016-07-29 00:52:38
【问题描述】:

我正在尝试比较在两个不同提交时从 master 分叉的两个不同分支上所做的更改。所以,我不想看到在两个分支之间对 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 rev-list。第一个示例正是您问题的第一部分,带有解释,而第二个示例指的是第二部分。
  • 谢谢,user3159253!这并不能完全回答我的问题,但它很好地提醒了 git rev-list 命令及其工作原理。

标签: git


【解决方案1】:

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 上的两个提交(提交bB)并将它们应用于我用* 标记的提交,即feature-Amaster 分支的点。

可以很容易地让 Git 比较提交树 A 和提交树 B。这就是git diff feature-A feature-Bgit 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 中的提交,包括临时分支上的临时提交,足够快且足够便宜,这不会给你带来太多收益——如果某些挑选步骤需要解决合并冲突,它只会让一切变得更加困难。

【讨论】:

  • 我在这个问题上摸不着头脑。另一个很棒的答案 torek。每次我读到你的一个答案,我都会学到一些东西。
  • @DavidN:幸运的是,几周前我在处理a...b 语法时遇到了这个错误。当两个分支提示之间没有没有合并基时,它的行为非常糟糕。
  • 也许 spinics.net/lists/git/msg280490.html 不会被忽略,如果它带有一个实现测试的补丁来说明问题(并且失败),然后是你的补丁(这使得之前的测试有效)(对于spinics.net/lists/git/msg216943.html)
  • @VonC:嗯,我确实有一个用于存储修复的实际测试用例,但我想我应该将它转换为 Git 自己的测试用例格式。我还没有深入研究 Git 自己的任何测试用例,因为我所知道的是其中一些在我的主系统上失败,导致测试运行无论如何都会停止。 :-)
  • "我应该把它转换成 Git 自己的测试用例格式。"是的,这就是这些贡献的工作方式:显示问题并失败的补丁测试,然后是实施修复的补丁。
猜你喜欢
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 2022-11-24
  • 2013-12-31
  • 2015-11-28
  • 2020-03-25
  • 2021-10-07
  • 2014-04-11
相关资源
最近更新 更多