一尘不染

Git diff 提交范围中的双点“..”和三点“...”有什么区别

javascript

以下命令有什么区别?:

git diff foo master   # a 
git diff foo..master  # b
git diff foo...master # c

差异手册谈到了它:

比较分支

$ git diff topic master <1> $ git diff topic..master <2> $ git diff topic...master <3>

  1. 主题提示和主分支之间的变化。
  2. 和上面一样。
  3. 自主题分支启动后,主分支上发生的更改。

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


阅读 262

收藏
2022-03-28

共1个答案

一尘不染

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

该命令git diff通常¹仅向您显示提交图中恰好两个点之间的树状态之间的差异。中的.....符号git diff具有以下含义:

# Left side in the illustration below:
git diff foo..bar
git diff foo bar  # same thing as above

# Right side in the illustration below:
git diff foo...bar
git diff $(git merge-base foo bar) bar  # same thing as above

说明为 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用于从它们的参数中解析提交列表。)

.....for的含义git log可以用图形表示如下:

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

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

好吧,无论如何,我觉得这有点令人困惑,而且我认为提交图有帮助:)

¹ 我只说“通常”,因为例如,在解决合并冲突时,git diff会向您展示三向合并。

2022-03-28