2011-09-20 74 views
10

比方說,我有以下的情況:對主題分支的Git diff,排除同時發生的合併提交?

B---D---F---G topic 
/ /
--A---C---E master 

對於代碼審查的目的,我想拔出DIFF從犯犯G,但不包括提交E和C即發生在主分支,也不包括提交F這是一個合併提交。

換句話說,我想生成包含從F到G ^改變的差異,並聚集從A到D

變化在其他,換句話說這些變化,我想回顧DIFF遏制只有我的主題分支發生了變化,不包括與此同時發生的一堆主人代碼。

這可能嗎?如果git無法處理這樣的「差異聚合」,我會非常感謝,如果有人能夠提供一些關於如何外部命令可以做到這一點的指示(以便我可以嘗試編寫一個bash腳本,可以做到這一點)。

+0

檢查A和G中的文件單獨提交併製作vim diff? –

+0

我需要所有文件的差異,而不是單個文件。另外,我認爲你的建議還會包括合併提交引入的更改。 –

回答

4

如果你不在乎diffs中的「context」部分是什麼,那麼git diff master..topic會給你你想要的。在CE中引入的任何更改都被視爲diff的「基礎」的一部分,因此在上下文中將會出現master的更改,但只有在主題分支中進行的實際更改將標記爲+-作爲更改。這通常是人們想要的代碼評論。

相反,如果你想表現得像合併從來沒有發生過,你將不得不重訂出來:

git rebase --onto A master 
+2

謝謝Karl,'git diff master..topic'完成了這個訣竅。事實證明,我必須在運行diff腳本之前將主人合併到主題中。 –

1

什麼:

  1. git的結帳話題

  2. git的結帳-b臨時

  3. 混帳恢復˚F

  4. git的差異一個

之後,您可以愉快地移除臨時分支。

1

從卡爾答案是誤導:

git diff從來沒有工作在適當的範圍內(即多次提交),只有兩個提交!

範圍語法對於git diff有特殊含義。

git diff E..G總是等於git diff E G(和
git diff E...G等於在此情況下git diff E G,因爲E是兩者的合併基礎)。

git diff master...topic是你在這個並且在一般情況下想要的東西:它表明你的話題分支的所有變化,比較它最後的合併基礎(即對比它來掌握,當它被合併了最後一次,忽略master中所有不在你主題分支中的變化)。

注:(?巧合)不幸的x..ygit log效果等是最好的x...ygit diff表示,反之亦然!

+1

是的,這是正確的答案。從手冊:「git diff A ... B」相當於「git diff $(git-merge-base A B)B」。 – jmiserez

相關問題