[英]Git diff on topic branch, excluding merge commits that happened in the meantime?
假設我有以下情況:
B---D---F---G topic
/ /
--A---C---E master
出於代碼審查的目的,我想從提交A中提取一個diff來提交G,但不包括在主分支上發生的提交E和C,也不包括提交F,這是一個合並提交。
換句話說,我想生成一個包含從F到G的變化的差異,並將這些變化與A到D的變化進行匯總。
換句話說,我希望審閱差異僅包含我對主題分支的更改,而不包括同時發生的大量代碼。
這可能嗎? 如果git無法處理這樣的“差異聚合”,我會非常感謝有人可以提供一些關於外部命令如何做到這一點的指針(這樣我就可以嘗試編寫一個bash腳本來完成這個技巧)。
卡爾的答案有誤導性:
git diff
永遠不會在適當的范圍內工作(即多次提交),只能在兩次提交之間!
范圍語法對git diff
有特殊意義。
git diff E..G
總是等於git diff EG
(和
git diff E...G
在這種情況下git diff E...G
等於git diff EG
,因為E是兩者之間的合並基礎。
git diff master...topic
是你想要的,在一般情況下 :它顯示主題分支的所有變化,將它與最后一個合並基礎進行比較(即在最后一次合並時將其與主要對比) ,忽略master中以后不在主題分支中的所有后續更改)。
注意:遺憾的是(巧合?) git log
等中x..y
的效果最好用git diff
的x...y
表示,反之亦然!
如果你不關心差異的“上下文”部分,那么git diff master..topic
會給你你想要的東西。 在C
和E
中引入的任何更改都被視為diff的“基礎”的一部分,因此來自master
的更改將在上下文中存在,但只有主題分支中的實際更改將標記為+
或-
作為更改。 這通常是人們想要進行代碼審查的。
如果你想要表現得從未發生合並,你將不得不將其重新定義:
git rebase --onto A master
關於什么:
git結帳主題
git checkout -b temp
git revert F
git diff A.
之后你可以愉快地刪除臨時分支。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.