240

以下命令有什么区别?:

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. 自主题分支启动后,主分支上发生的更改。

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

4

5 回答 5

401

由于我已经创建了这些图像,我认为可能值得在另一个答案中使用它们,尽管..(dot-dot) 和(dot-dot-dot) 之间差异的描述与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 指定提交的不同方式

换句话说,与 ;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会向您展示三向合并。

于 2011-08-31T11:39:27.140 回答
84

我的.. vs ...的合并版本,带有diff vs log

差异与日志 & .. 与 ..

于 2017-09-21T13:32:10.840 回答
34

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

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

git diff foo...master从 foo 和 master 的共同祖先 ( git merge-base foo master) 到 master 的尖端。换句话说,仅显示 master 分支自其与 foo 的共同祖先以来引入的更改。

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

例如,如果您创建一个“dev”分支并向文件添加一个函数,然后返回“master”分支并从 README 中删除一行,然后运行如下代码:

$ git diff master dev

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

您真正想要比较的是自从您的分支分歧以来,“开发”发生了哪些变化。为此,Git 有一个很好的速记:

$ git diff master...dev
于 2011-08-31T02:52:20.283 回答
6
git diff foo master

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

git diff foo..master

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

git diff foo...master

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

所以前两个命令是相同的,最后一个只是在差异历史中显示更广泛的视图

于 2011-08-31T02:46:28.360 回答
2

git 日志树

上图相当于下图树

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
于 2020-04-23T02:49:45.523 回答