2011-08-31 218 views
121

什麼是下面的命令?:Git diff commit範圍中的雙點「..」和三點「...」之間有什麼區別?

git diff foo master # a 
git diff foo..master # b 
git diff foo...master # c 

The diff manual談論它之間的區別:

比較分支

$ git diff topic master <1> 
$ git diff topic..master <2> 
$ git diff topic...master <3> 
  1. 出題的末端之間的變化主分支機構。
  2. 同上。
  3. 自主題分支啓動之後發生在主分支上的更改。

但我不完全清楚。

+0

雖然這個問題是不是重複,[這個答案](http://stackoverflow.com/questions/5256249/git-diff-doesnt-show -enough/5257065#5257065)在'git diff'中顯示'..'和'...'的含義以及它們在'git log'中的不同含義。 –

+2

可能的重複[Git提交範圍中的雙點「..」和三點「...」之間的區別是什麼?](http://stackoverflow.com/questions/462974/what-are-the -differences-between-double-dot-and-triple-dot-in-git-com) – chharvey

回答

206

既然我已經創建了這些圖片,我想這可能是值得的另一種回答使用它們,雖然..之間的差異的說明(dot-dot)和...(dot-dot-dot)基本上與manojlds's answer中的相同。

命令git diff通常只顯示提交圖中恰好兩個點之間樹的狀態之間的差異。的.....符號在git diff具有以下含義:

An illustration of the different ways of specifying commits for 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解析從它們的參數提交列表)

.....git log含義可以圖形方式顯示如下:

An illustration of the different ways of specifying ranges of commits for git log

所以,git rev-list foo..bar向您顯示分支bar上的所有內容,該分支也不在分支foo上。另一方面,git rev-list foo...bar顯示foobar都不是的所有提交。第三個圖表顯示如果列出兩個分支,您將獲得其中一個或兩個分支中的提交。

嗯,我發現所有的有點混亂,反正我覺得犯圖形圖表幫助:)

¹我只能說「一般」,因爲解決當合並衝突,例如,git diff會告訴你三方合併。

+1

我喜歡你的圖表。 [我前一段時間也想到了我自己](http://stackoverflow.com/a/24186641/456814)。我對我自己的'git diff'圖有一些想法,我將在後面做。 – 2014-07-31 23:53:19

+13

有人注意到了嗎? '..'和'...'的效果在'git diff'中感覺_reversed_(與'git rev-list'相比)! –

+1

你讓我在「這就是你需要知道的一切......但是......」。 :-) Git充滿了類似這樣的事物,其中類似的符號和術語在不同的情況下意味着不同的事物;謝謝你澄清這一點。 – ShreevatsaR

6
git diff foo master 

將顯示在該時間點的話題和主分支之間的差異

git diff foo..master 

這也將顯示在該點的話題,主分支之間的差異時

git diff foo...master 

這將顯示從分支製作主題和之後的所有區別

所以前2個命令是相同的,最後一個只是在diff歷史中顯示更寬的視圖。

20

git diff foo master foo和master的頂端(頭)提交之間的差異。

git diff foo..master做同樣事情的另一種方法。

git diff foo...master從foo和master的共同祖先(git merge-base foo master)到master的尖端的差異。換句話說,只顯示主分支自從它與主人共同的祖先以來所引入的變化。

This example從GitHub解釋時使用兩個:

舉例來說,如果你創建了一個「開發」分支,並添加一個功能到 文件,然後回到你的「主人」分支請從 README一條線,然後運行是這樣的:

$ git diff master dev 

它會告訴你,從第一個文件附加功能和 線加入自述。爲什麼?因爲在分支上,README 仍然具有原始行,但在'主'上已將其刪除 - 因此 直接比較快照看起來像「dev」添加了它。

你真正想要比較的是'dev'自你的 分支發散後發生了什麼變化。要做到這一點,Git有一個可愛的小速記:

$ git diff master...dev 
+2

git diff foo ... master master分支引入的變化,因爲它是foo的共同祖先 – 0fnt

+0

@manojlds ok,所以不同的問題,如果您在開發分支並提交您的更改(函數)並將更改推送到遠程開發分支,這是否意味着可見更改只是函數或函數和自述文件? – David

+0

@ 0fnt這是正確的。我解決了。 –

11

我的綜合版本.. vs ...差異 VS 日誌

Diff vs Log & .. vs ..

+0

這會非常好,只要它沒有那麼多不同的顏色和設置操作與'..' /'''東西混合在一起。例如在'log A ... B'中,不清楚命令是返回交集(圖的白色部分)還是其餘的A-B聯合(綠色)。對於沒有任何設置操作數並且只有1種顏色的情況,這將更多。 – xealits

相關問題