除了一些涉及合併差異的特殊情況(當您可以使用--combined
時),提交差異總是成對的。這改變了x..y
的解釋方式。代替「從y
到達的所有轉速,從x
無法到達」,這意味着「比較轉速x
與轉速y
」。
(這是這裏值得注意的是,在所鏈接的問題的答案掩蓋了一個事實,即x..y
在git diff
不同的解釋比其他Git命令。)
當你問E..topic
,混帳解決topic
到一個特定的在此情況下爲K
,然後將E
中的樹與K
中的樹進行比較。這就是爲什麼你看到從G
和I
的變化,因爲這些變化通過合併帶入J
。
您可以比較F
和K
,但是這仍然會顯示在G
和I
的變化,因爲再次,這些變化實際上是J
。
還有就是,其實只有一個忽略J
發生了什麼,同時保持F
和H
完整這樣的方式,那就是建立一個樹,要麼跳過它,或者它恢復。例如,開始於H
,您可以添加J
和K
之間的基礎上,DIFF補丁:
K' <-- HEAD[detached]
/
B---D---F---H---J---K <-- topic
/ / /
A---C---E---G---I <-- master
(要做到這一點,git checkout topic~2
獲得在分離提交H
,然後git cherry-pick topic
添加,您現在分開HEAD
,所做的更改從J
到K
)。
現在你可以比較樹提交E
與樹HEAD
(在提交K'
):
git diff E HEAD # or git diff E..HEAD or git diff E..
但是這還不是,一般來說,人們想回顧一下。事實上,由於您幾乎肯定會完全放棄修訂版K'
(僅用於審查目的),它們將審查從未使用過的代碼版本!
這就是爲什麼的接受答案的鏈接的問題是隻git diff master..topic
哪位意味着完全相同的東西git diff master topic
,在這種情況下,樹與樹K
比較了I
。您建議在分支topic
上提交一個類似K
的樹。這是將在topic
中的代碼。它與master
中的轉速I
中的代碼有一些差異。所不同的是具有到I
是變化的F
,H
,K
的總和,這是爲了使J
適合於任何墊片的工作。它確實有G
(當然那些所作的更改I
本身)但這些不是變化到I
,那些只是改變納入在I
。
更透徹的方式來檢查代碼是呈現4點的diff進行審覈:
E
F
VS
F
VS H
H
VS J
(可能是一個組合的diff,H
- 和 - I
vs J
)
J
vs K
第一DIFF告訴你審閱,如果他們接受它,這將有可能簽出的樹,看起來像F
(這肯定是真的,只是git checkout F
)。第二個差異告訴你的評論者,在他們的回購中有F
,這將有可能檢出H
(如果他們接受的話)等。顯然,四個評論比一個更難,這就是爲什麼人們接受比較的捷徑I
vs K
。