Git diff提交范围中双点".."和三点"..."之间有什么区别?

chr*_*lee 175 git diff git-diff

以下命令之间有什么区别?:

git diff foo master   # a 
git diff foo..master  # b
git diff foo...master # c
Run Code Online (Sandbox Code Playgroud)

diff手册谈到它:

比较分支机构

$ git diff topic master    <1>
$ git diff topic..master   <2>
$ git diff topic...master  <3>
Run Code Online (Sandbox Code Playgroud)
  1. 主题提示与主分支之间的更改.
  2. 与上述相同.
  3. 自主题分支启动以来主分支上发生的更改.

但对我来说并不完全清楚.

Mar*_*air 299

由于我已经创建了这些图像,我认为在另一个答案中使用它们可能是值得的,尽管..(点 - 点)和...(点 - 点 - 点)之间的差异的描述与manojlds的答案基本相同.

该命令git diff通常只显示提交图中两个点之间树的状态之间的差异.在.....中符号git diff的含义如下:

为git diff指定提交的不同方式的说明

换句话说,git diff foo..bar完全一样git diff foo bar; 两者都将告诉你两个分支的末端之间的差异foobar.另一方面,git diff foo...bar将显示两个分支的"合并基础"和尖端之间的区别bar."合并基础"通常是这两个分支之间的最后一个共同提交,因此该命令将向您显示您的工作bar所引入的更改,同时忽略同时完成的所有操作foo.

这就是你需要了解的所有内容.....符号git diff.然而...


...混乱的常见原因这里是.....一个命令中使用时,如意味着微妙的不同的东西git log期望一个组提交的一个或多个参数的.(这些命令最终都git rev-list用于解析其参数中的提交列表.)

..and和...for 的含义git log可以用图形方式显示如下:

为git日志指定提交范围的不同方法的说明

因此,git rev-list foo..bar向您显示分支bar上不存在的所有内容foo.另一方面,git rev-list foo...bar向您显示所有提交foo 两者中的提交bar,但不是两者.第三个图表只显示如果列出两个分支,则会获得其中一个或两个分支的提交.

好吧,无论如何,我发现有点令人困惑,我认为提交图表帮助:)

¹我只说"通常",因为在解决合并冲突时,例如,git diff会向您显示三向合并.

  • 有人注意到了吗?```和`...`的效果在`git diff`中感觉_reversed_(与`git rev-list`相比)! (31认同)
  • 你让我知道“这就是你需要知道的全部 [...]。但是...”。:-) Git 充满了这样的东西,其中类似的符号和术语在不同的上下文中意味着不同的东西;感谢您如此清楚地澄清这一点。 (3认同)

Dol*_*eam 48

我的合并版本.. vs ...diff vs log

Diff vs Log&.. vs ..

  • 如果它没有太多不同的颜色,并且将设置操作与`..` /`...`东西混合在一起,那将是非常好的。例如,在“ log A ... B”中,不清楚命令是返回交集(图的白色部分)还是返回AB并集的其余部分(绿色)。如果没有任何设置的操作数并且只有一种颜色,那就更好了。 (3认同)
  • @KajMagnus 这似乎令人困惑和矛盾,因为 `git log` 和 `git diff` 都以不同的方式对待 `...`。_log_ 使用 gitrevisions (参见 `man 7 gitrevisions`)来解析 `...`,但 _diff_ 不会。_diff_ 使用它自己的 `...` 定义,与 gitrevisions 使用的定义不同。 (3认同)
  • 这真的应该是 `diff A..B` &lt;—&gt; `log A...B`,也就是说,带有 2 个点的 *diff* 真的对应于带有 3 个(!)点的 *log* 吗?或者图片中有错别字。看看这些点的颜色编码方式,在我看来,图像中存在拼写错误。左下角:`log A...B`应该是`log A..B`,对吧(?)。右边的 *log* 应该是 `...` 而不是 `..`。 (2认同)
  • @KajMagnus 实际上红/蓝色只是用来区分 2 点和 3 点(无论与 diff 或 log 一起使用)。该图是正确的。在第一列中,具有 2 点的 diff 的结果类似于具有 3 点的 log(因此是整个目的图)。2 点的 diff 给出了两个转速下到分歧点的代码更改(由提交周围的绿色气泡和货车图的绿色部分说明),而 3 点的日志给出了更改日志(提交消息)两个转速都下降到分歧点。 (2认同)
  • @snath03 已经有一段时间了,但我想我使用 LibreOffice Draw 来制作它。 (2认同)

man*_*lds 26

git diff foo master foo和master的top(head)提交之间的差异.

git diff foo..master 做同样事情的另一种方式.

git diff foo...mastergit merge-base foo masterfoo和master 的共同祖先()到master的tip.换句话说,仅显示master分支自fob的共同祖先以来引入的更改.

GitHub的这个例子解释了何时使用这两个:

例如,如果您创建一个'dev'分支并向函数添加一个函数,那么返回到您的'master'分支并从README中删除一行,然后运行如下所示的代码:

$ git diff master dev
Run Code Online (Sandbox Code Playgroud)

它会告诉您从第一个文件添加了一个函数,并在README中添加了一行.为什么?因为在分支上,README仍然具有原始行,但是在'master'上你已经删除它 - 所以直接比较快照看起来像'dev'添加它.

你真正想要比较的是你的分支分歧后'dev'的变化.要做到这一点,Git有一个很好的小速记:

$ git diff master...dev
Run Code Online (Sandbox Code Playgroud)

  • git diff foo ... master分支引入的主要更改,因为它是与foo共同的祖先 (2认同)

ita*_*o40 6

git diff foo master
Run Code Online (Sandbox Code Playgroud)

将显示该时间点主题和主分支之间的差异

git diff foo..master
Run Code Online (Sandbox Code Playgroud)

这也将显示该时间点主题和主分支之间的差异

git diff foo...master
Run Code Online (Sandbox Code Playgroud)

这将显示主题何时从分支到之后的所有差异

因此前两个命令是相同的,最后一个命令只显示差异历史中的更宽视图