双点“.."还有三个点"…"在Git diff提交范围?

以下命令有什么区别?:

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. 自主题分支从主分支启动以来发生在主分支上的更改。

但我不太清楚。

41275 次浏览
git diff foo master

将显示主题和主分支在那个时间点之间的差异

git diff foo..master

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

git diff foo...master

这将显示从分支创建主题时和之后的所有差异

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

git diff foo master foo和master的顶部(头部)提交之间的差异。

做同样事情的另一种方式。

git diff foo...master从foo和master的共同祖先(git merge-base foo master)到master的tip的差异。换句话说,只显示主分支自它与foo的共同祖先以来所引入的更改。

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

例如,如果你创建了一个' dev '分支,并将一个函数添加到a 文件,然后返回到' master '分支,并从 然后运行如下代码:

$ git diff master dev
它会告诉你从第一个文件中添加了一个函数 行被添加到README。为什么?因为在分支上,README 仍然有原来的行,但在' master '你已经删除了它-所以 直接比较快照看起来像是‘dev’添加的。< / p > 你真正想要比较的是' dev '自从你的 分支分化。要做到这一点,Git有一个很好的简写:

$ git diff master...dev

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

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的不同提交方式的说明
< / > < / p >

换句话说,git diff foo..bargit diff foo bar完全相同;都将显示两个分支foobar的尖端之间的差异。另一方面,git diff foo...bar会告诉你“合并基”和“;这两个分支和bar的尖端。“合并基础”;通常是这两个分支之间的最后一次共同提交,所以这个命令将显示你在bar上的工作所引入的更改,同时忽略在此期间在foo上所做的所有事情。

这就是你需要知道的关于git diff中的.....符号的全部内容。然而……


... 这里一个常见的混淆来源是,.....在诸如git log之类的命令中使用时,其含义略有不同,该命令期望将一组提交作为一个或多个参数。(这些命令最终都使用git rev-list从它们的参数解析提交列表。)

.....对于git log的含义如下图所示:

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

因此,git rev-list foo..bar向你显示分支bar上没有在分支foo上的所有内容。另一方面,git rev-list foo...bar会向你显示所有在foobar不是两个中的提交。第三个图显示,如果列出两个分支,就会得到其中一个或两个分支中的提交。

好吧,我发现这一切都有点混乱,无论如何,我认为提交图表有帮助:)

¹我只说“典型地”;因为在解决合并冲突时,例如,git diff将显示一个三向合并。

我的合并版本的.. vs ...diff vs 日志

Diff vs Log &.. vs . . < / >

git log tree

上面的图等价于下面的图树

A0 <- A1 <- A2 <- A3 (master)
\
C0 <- C1 (test)

一图胜千言,.. ... ^的区别如下所示。

$ git log master..test
# output C0 C1


$ git log ^master test
# output C0 C1


$ git log master…test
# output A1 A2 A3 C0 C1