Git diff commit范围中的双点“..”和三点“…”之间有什么区别?
以下命令之间有什么区别?
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>
- 主题提示和主分支之间的变化。
- 同上。
- 从主题分支启动时发生在主分支上的更改。
但我不完全清楚。
由于我已经创build了这些图像,我认为这可能是值得在另一个答案中使用它们,虽然描述的区别..
(点 – 点)和...
(点 – 点)基本上是相同的就像manojlds的回答一样 。
git diff
命令通常只显示提交图中恰好两个点之间树的状态之间的差异。 git diff
的..
和...
符号具有以下含义:
换句话说, git diff foo..bar
与git diff foo bar
完全一样; 都会告诉你两个分支foo
和bar
的技巧之间的区别。 另一方面, git diff foo...bar
将显示两个分支的“合并基”和bar
的尖端之间的区别。 “合并基础”通常是这两个分支之间最后一个共同的提交,所以这个命令会告诉你你的工作已经引入的变化,同时忽略了同时在foo
上做的所有事情。
这就是所有你需要知道的..
和...
在git diff
符号。 然而…
…这里混淆的一个常见的来源是..
和...
意味着在git log
等命令中使用的细微差别,这些命令需要一组提交作为一个或多个参数。 (这些命令最终都使用git rev-list
从它们的参数中parsing提交列表。)
git log
的..
和...
的含义可以用graphics显示如下:
所以, git rev-list foo..bar
显示了分支bar
上不是在分支foo
。 另一方面, git rev-list foo...bar
显示所有在foo
或 bar
的提交,但不是两者 。 第三个图表显示如果你列出了两个分支,你会得到它们中的一个或两个的提交。
那么,我发现,所有有点混乱,无论如何,我认为提交图表帮助:)
¹我只会说“典型”,因为在解决合并冲突时,例如, git diff
会向您显示三向合并。
git diff foo master
foo和master的顶端(头)提交之间的git diff foo master
。
git diff foo..master
做同样事情的另一种方法。
git diff foo...master
从git diff foo...master
的共同祖先( git merge-base foo master
)到master的尖端的git diff foo...master
。 换句话说,只显示主分支自从它与主人共同的祖先以来所引入的变化。
这个来自GitHub的例子解释了何时使用这两个:
例如,如果你创build了一个'dev'分支并为一个文件添加一个函数,然后回到你的'master'分支并从README中删除一行,然后运行如下所示:
$ git diff master dev
它会告诉你,一个函数是从第一个文件中添加的,一行被添加到README中。 为什么? 因为在分支上,README仍然有原始的行,但是在'master'中你已经删除了它 – 所以直接比较快照看起来像'dev'添加了它。
你真正想比较的是自你的分支分歧以来,“开发”已经发生了什么变化。 要做到这一点,Git有一个很好的简写:
$ git diff master...dev
我的综合版本的VS …与差异与日志
git diff foo master
将显示当时的主题和主分支之间的差异
git diff foo..master
这也将显示在这个时间点的主题和主分支之间的差异
git diff foo...master
这将显示从分支到分支之后的所有主题
所以前两个命令是相同的,最后一个只是在diff历史中显示更广泛的视图