2017-04-17 36 views

回答

0

UPDATE - 增加了一些澄清差異爲基礎的方法

這有點誤導地說,第二父是在一個正常的合併所有更改源。可能存在手動衝突解決方案,或者某人可能只合並--no-commit選項,並在合併期間引入其他更改。更廣泛地適用於考慮合併方式與每個父母的區別,而不是考慮哪個父母介紹每個變更。

然而,它可以是有用來思考「這種變化從何而來」。取決於您可以從以下其中一個開始之後確定哪些信息:

1)git blame會告訴您每行代碼的來源提交。任何源於HEAD^..branchN提交的內容都必須在branchN上指示更改。但是,由於您提供的信息是每行代碼的提交ID,因此需要進行相當多的後處理才能將更改歸零。

2)你可以爲每個分支做差異。本來我想

git diff HEAD^ HEAD^2 

等(與每個分支合併的引用代替HEAD^2)。這是可以的,除非主分支自其他分支發散以來發生了很大變化(在這種情況下,這些變化的倒數會出現在每個差異中)。

真的要求的是每個分支尖端和該分支開始發散的點之間的差異;所以,如果你能找到「共同祖先」,也許只是使用:

git diff A HEAD^2 

(其中A是最新提交可達來自HEAD^HEAD^2)。雖然這是一種直接表達(對於一次分支)的確切含義,但它確實需要在每種情況下追蹤共同的祖先。 (可能有一個很好的快捷方式,我沒有想到;如果發生在我身上,我會回來一個更新。)

如果分支拓撲過於混亂,這可能仍然有點不清楚。例如,如果branch3實際上從branch2支,那麼你就必須決定是否意味着差異比較branch3反對共同的祖先與HEADbranch2(前一種方法意味着一些改變將歸因於兩種branch2branch3)。

使用單個命令生成所有差異將會很好,並且表面上這是logshow將會執行的選項-m;但是這把我們帶回到我的答案的開始,因爲你要與各分支(不是每個分支引入的變化)合併的差異並有精神上否定每一個變化。 (即您必須查找其差異不包含包含更改以瞭解更改來自哪裏的一個分支)。

+0

這家長版本比較的方法甚至可以到雙親合併應用,以區分真正從那些合併過程中引入的另一個分支出來的變化,順便...... –

+1

注意'git的日誌-p - m「或」git show -m「在合併提交時將顯示每個父代的一個差異。如果'path/to/file.ext'中的行* L *在merge-vs-parent1和merge-vs-parent2中有所不同,但不在merge-vs-parent3中,則通過* to * line * L * parent3。由於章魚合併策略拒絕允許衝突合併,這是一個相當不錯的選擇。 – torek

+0

@torek - 對於一組重要的修補程序,我不希望對每個更改(如果您與合併提交進行比較時需要執行的操作)進行負面工作來確定「哪個N diff不包含此內容」 。針對第一個父級運行diff(而不是針對合併提交)會有所幫助,但我對此的看法越多,我也不太喜歡它(因爲每個diff都會包含與「first父母「分支(如果有的話))。直接查看分支變化的最直接方法:比較分支尖端和共同祖先。但是,每個分支都必須完成。 –

相關問題