2017-10-12 85 views
2

我有兩個分支在我的git回購,AB有一個共同的祖先C。從CA的提交可能包含從CB的提交的壓縮合並或其他重寫歷史記錄。我怎樣才能確定這一點?有沒有辦法與git diff做到這一點?不對稱差異

總體而言,我想知道,如果從提交到C包含A在提交從CB所有文字修改。 git diff A B並不完全做我想做的,因爲它也將報告在提交從CA這是在承諾不會CB所有的變化是什麼。我只希望差異在CB的提交中發生變化,它們不在從CA的提交中。我怎麼去解決這個問題?

回答

1

編輯(每個問題編輯):我不認爲有一個完全可靠的方法來做到這一點。從根本上講,問題是,如果從CA一些變化重疊CB一些變化-would撤消或覆蓋或修改CB - 它的不可能之間的差異一般要知道爲什麼是這樣的話。

也就是說,我們給出一個發散提交圖所示:

 a1--a2--...--a_i_max-minus-1--A 
    /
...--C 
     \ 
     b0--...--b_j_max-minus-1--B 

(沒有約束,要麼我= j的我≠j時,即這裏的不同長度是並不意味着暗示其中之一)。這裏標記爲A的提交實際上僅僅是最終的A i,並且類似地對於B。要發現C-VS-B是否包含在任何C-VS-A ,甚至ķ -vs-A的一些ķ<升。你可以詳盡地測試以確定這是否是真實的,但是這樣做會很昂貴,並且也會錯過任何「邏輯正確」的情況,但最終提交的序列與C-vs-B並不完全相同,可能是因爲它是修改以解決合併衝突。

詳盡的測試可能會盡可能地接近您所能得到的。如果您可以強制執行工作流程要求,那麼系統提交中會有一個提交消息或提交說明附加到壁球合併:那麼您只需要枚舉它們並檢查每個註釋說我是擠壓C vs B的結果

(原來的答覆如下)


的問題沒有得到很好的形成,至少在Git中,陸,因爲沒有這樣的事情「在A的變化」不是。如果A是分支名稱,則它命名一個特定的提交。要找到更改您必須命名爲兩個提交和git diff他們。這同樣適用於分支名稱B:爲了將快照(分支上的提示提交)B轉變爲更改集(就某些較早的提交而言),您必須選擇一些較早的提交。

一般來說,人們問這個的時候,他們有一個特定的第三個承諾事項:

  o--o--A <-- BranchA 
     /
...--o--* 
     \ 
      o--o--B <-- BranchB 

這第三個承諾,標誌着*這裏,就是兩個分支「聯合起來」,又名地方合併基地

如果提交*不是您打算用作生成此不對稱差異的(單個)第三點的提交,則此答案的其餘部分均不適用。但如果它,找到它的方法是進行合併,然後將合併結果與您關心的任何分支提示進行比較。

合併將採取的所有更改的工會(從*A,並從*B),並把它們放進合併提交:

$ git checkout --detach BranchA # doesn't matter which one we use 
$ git merge BranchB 

結果(如果沒有合併衝突)的:

  o--o--A <-- BranchA 
     /  \ 
...--o--*   M <-- HEAD (detached) 
     \  /
      o--o--B <-- BranchB 

現在你可以看到*航班嗎A看起來就像如果一個開始與B通過比較(版本比較)B VS M

$ git diff HEAD^2 HEAD # or git diff BranchB HEAD 

凡是顯示了這裏有貢獻的航班嗎*差異A改變了未還貢獻了*航班嗎B差異。

同樣,比較合併提交對提交A將呈現變化貢獻的航班嗎* DIFF B是不是已經在*航班嗎A DIFF:

$ git diff HEAD^1 HEAD 

使用git show -m,你可以因爲這是-mgit show所做的一樣。

+0

感謝您的深入解釋。我需要仔細閱讀它才能消化所有內容,並確定這是否符合我的要求。要根據您的示例對我的問題進行重新說明,我想知道*到to的變化是否出現在*到B中。我不在乎可能在*到B中引入的其他更改。 –

+0

在這種情況下,您可能會檢查merge-vs-B是否爲空。 – torek

+0

我仍在試圖爲此找到更好的解決方案。我已經修改了我的OP,希望能夠更清楚我所尋找的內容。如果你有時間,請看看。 –