以下命令有什么区别?:
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> 主题提示和主分支之间的变化。 同上。 自主题分支从主分支启动以来发生在主分支上的更改。
比较分支
$ git diff topic master <1> $ git diff topic..master <2> $ git diff topic...master <3>
但我不太清楚。
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的共同祖先以来所引入的更改。
git merge-base foo master
来自GitHub的这个例子解释了何时使用这两个:
例如,如果你创建了一个' dev '分支,并将一个函数添加到a 文件,然后返回到' master '分支,并从 然后运行如下代码: $ git diff master dev 它会告诉你从第一个文件中添加了一个函数 行被添加到README。为什么?因为在分支上,README 仍然有原来的行,但在' master '你已经删除了它-所以 直接比较快照看起来像是‘dev’添加的。< / p > 你真正想要比较的是' dev '自从你的 分支分化。要做到这一点,Git有一个很好的简写: $ git diff master...dev
$ git diff master dev
$ git diff master...dev
由于我已经创建了这些图像,我认为可能值得在另一个答案中使用它们,尽管..(点-点)和...(点-点-点)之间的区别的描述基本上与manojlds的答案相同。
..
...
git diff命令通常只显示提交图中两个点之间树状态的差异。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
< / > < / p > 换句话说,git diff foo..bar与git diff foo bar完全相同;都将显示两个分支foo和bar的尖端之间的差异。另一方面,git diff foo...bar会告诉你“合并基”和“;这两个分支和bar的尖端。“合并基础”;通常是这两个分支之间的最后一次共同提交,所以这个命令将显示你在bar上的工作所引入的更改,同时忽略在此期间在foo上所做的所有事情。 这就是你需要知道的关于git diff中的..和...符号的全部内容。然而…… ... 这里一个常见的混淆来源是,..和...在诸如git log之类的命令中使用时,其含义略有不同,该命令期望将一组提交作为一个或多个参数。(这些命令最终都使用git rev-list从它们的参数解析提交列表。) ..和...对于git log的含义如下图所示: 因此,git rev-list foo..bar向你显示分支bar上没有在分支foo上的所有内容。另一方面,git rev-list foo...bar会向你显示所有在foo、或、bar和不是两个中的提交。第三个图显示,如果列出两个分支,就会得到其中一个或两个分支中的提交。 好吧,我发现这一切都有点混乱,无论如何,我认为提交图表有帮助:) ¹我只说“典型地”;因为在解决合并冲突时,例如,git diff将显示一个三向合并。
换句话说,git diff foo..bar与git diff foo bar完全相同;都将显示两个分支foo和bar的尖端之间的差异。另一方面,git diff foo...bar会告诉你“合并基”和“;这两个分支和bar的尖端。“合并基础”;通常是这两个分支之间的最后一次共同提交,所以这个命令将显示你在bar上的工作所引入的更改,同时忽略在此期间在foo上所做的所有事情。
git diff foo..bar
git diff foo bar
foo
bar
git diff foo...bar
这就是你需要知道的关于git diff中的..和...符号的全部内容。然而……
... 这里一个常见的混淆来源是,..和...在诸如git log之类的命令中使用时,其含义略有不同,该命令期望将一组提交作为一个或多个参数。(这些命令最终都使用git rev-list从它们的参数解析提交列表。)
git log
git rev-list
..和...对于git log的含义如下图所示:
因此,git rev-list foo..bar向你显示分支bar上没有在分支foo上的所有内容。另一方面,git rev-list foo...bar会向你显示所有在foo、或、bar和不是两个中的提交。第三个图显示,如果列出两个分支,就会得到其中一个或两个分支中的提交。
git rev-list foo..bar
git rev-list foo...bar
好吧,我发现这一切都有点混乱,无论如何,我认为提交图表有帮助:)
¹我只说“典型地”;因为在解决合并冲突时,例如,git diff将显示一个三向合并。
我的合并版本的.. vs ...与diff vs 日志
< / >
上面的图等价于下面的图树
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