2013-10-28 56 views
1

比方說,我有這種情況在混帳:產生兩個分支之間的差異,初步審覈後

B---D---F---H---J---K--->topic 
/ / /
A---C---E---G---I--->master 

只要提交˚F越來越之後,我提出的話題分支進行審查。審稿人提出了一些建議,世界繼續前進,因此又一次合併完成。在這裏回答Git diff on topic branch, excluding merge commits that happened in the meantime?簡單地生成從A到F的差異的方法git diff master..topic。然而,現在修訂版B和D已經被審查過了,我想將它們從新的差異中排除以供審查。然而,git diff E..topic包括G和I。

如何獲得H,J和K的差異,排除通過G和I拉入的東西?

回答

0

torek的建議(做多個評論)是一種可能性,但有不幸的副作用,意思是說F之後需要改進的代碼和固定在H中的代碼必須重新評審兩次:一次在其次級參數狀態,以及完成時的狀態。關於git diff master..topic的好處是它壓扁了這些,並且給了分支之間的最終區別。

我所做的解決問題的方法是從F創建一個分支,將master合併到那裏,然後在我的新臨時分支和topic分支之間做一個差異。這樣,所有對master的更改都被掩蓋了,並且僅使用自上一個審查點以來對topic分支的更改。

1

除了一些涉及合併差異的特殊情況(當您可以使用--combined時),提交差異總是成對的。這改變了x..y的解釋方式。代替「從y到達的所有轉速,從x無法到達」,這意味着「比較轉速x與轉速y」。

(這是這裏值得注意的是,在所鏈接的問題的答案掩蓋了一個事實,即x..ygit diff不同的解釋比其他Git命令。)

當你問E..topic,混帳解決topic到一個特定的在此情況下爲K,然後將E中的樹與K中的樹進行比較。這就是爲什麼你看到從GI的變化,因爲這些變化通過合併帶入J

您可以比較FK,但是這仍然會顯示在GI的變化,因爲再次,這些變化實際上是J

還有就是,其實只有一個忽略J發生了什麼,同時保持FH完整這樣的方式,那就是建立一個樹,要麼跳過它,或者它恢復。例如,開始於H,您可以添加JK之間的基礎上,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,所做的更改從JK)。

現在你可以比較樹提交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是變化的FHK的總和,這是爲了使J適合於任何墊片的工作。它確實G(當然那些所作的更改I本身)但這些不是變化I,那些只是改變納入I

更透徹的方式來檢查代碼是呈現4點的diff進行審覈:

  1. EF VS
  2. F VS H
  3. H VS J(可能是一個組合的diff,H - 和 - I vs J
  4. J vs K

第一DIFF告訴你審閱,如果他們接受它,這將有可能簽出的樹,看起來像F(這肯定是真的,只是git checkout F)。第二個差異告訴你的評論者,在他們的回購中有F,這將有可能檢出H(如果他們接受的話)等。顯然,四個評論比一個更難,這就是爲什麼人們接受比較的捷徑I vs K