chr*_*lee 175 git diff git-diff
以下命令之间有什么区别?:
git diff foo master # a
git diff foo..master # b
git diff foo...master # c
Run Code Online (Sandbox Code Playgroud)
diff手册谈到它:
比较分支机构
Run Code Online (Sandbox Code Playgroud)$ git diff topic master <1> $ git diff topic..master <2> $ git diff topic...master <3>
- 主题提示与主分支之间的更改.
- 与上述相同.
- 自主题分支启动以来主分支上发生的更改.
但对我来说并不完全清楚.
Mar*_*air 299
由于我已经创建了这些图像,我认为在另一个答案中使用它们可能是值得的,尽管..(点 - 点)和...(点 - 点 - 点)之间的差异的描述与manojlds的答案基本相同.
该命令git diff通常只显示提交图中两个点之间树的状态之间的差异.在..和...中符号git diff的含义如下:

换句话说,git diff foo..bar完全一样git diff foo bar; 两者都将告诉你两个分支的末端之间的差异foo和bar.另一方面,git diff foo...bar将显示两个分支的"合并基础"和尖端之间的区别bar."合并基础"通常是这两个分支之间的最后一个共同提交,因此该命令将向您显示您的工作bar所引入的更改,同时忽略同时完成的所有操作foo.
这就是你需要了解的所有内容..和...符号git diff.然而...
...混乱的常见原因这里是..和...一个命令中使用时,如意味着微妙的不同的东西git log期望一个组提交的一个或多个参数的.(这些命令最终都git rev-list用于解析其参数中的提交列表.)
..and和...for 的含义git log可以用图形方式显示如下:

因此,git rev-list foo..bar向您显示分支bar上不存在的所有内容foo.另一方面,git rev-list foo...bar向您显示所有提交foo 或 两者中的提交bar,但不是两者.第三个图表只显示如果列出两个分支,则会获得其中一个或两个分支的提交.
好吧,无论如何,我发现有点令人困惑,我认为提交图表帮助:)
¹我只说"通常",因为在解决合并冲突时,例如,git diff会向您显示三向合并.
Dol*_*eam 48
我的合并版本.. vs ...与diff vs log
man*_*lds 26
git diff foo master foo和master的top(head)提交之间的差异.
git diff foo..master 做同样事情的另一种方式.
git diff foo...master从git merge-base foo masterfoo和master 的共同祖先()到master的tip.换句话说,仅显示master分支自fob的共同祖先以来引入的更改.
GitHub的这个例子解释了何时使用这两个:
例如,如果您创建一个'dev'分支并向函数添加一个函数,那么返回到您的'master'分支并从README中删除一行,然后运行如下所示的代码:
Run Code Online (Sandbox Code Playgroud)$ git diff master dev它会告诉您从第一个文件添加了一个函数,并在README中添加了一行.为什么?因为在分支上,README仍然具有原始行,但是在'master'上你已经删除它 - 所以直接比较快照看起来像'dev'添加它.
你真正想要比较的是你的分支分歧后'dev'的变化.要做到这一点,Git有一个很好的小速记:
Run Code Online (Sandbox Code Playgroud)$ git diff master...dev
git diff foo master
Run Code Online (Sandbox Code Playgroud)
将显示该时间点主题和主分支之间的差异
git diff foo..master
Run Code Online (Sandbox Code Playgroud)
这也将显示该时间点主题和主分支之间的差异
git diff foo...master
Run Code Online (Sandbox Code Playgroud)
这将显示主题何时从分支到之后的所有差异
因此前两个命令是相同的,最后一个命令只显示差异历史中的更宽视图