2010-12-07 133 views
8

可以說我在RepoX中有兩個分支叫做BranchA和BranchB。 RepoX也有一個名爲SubmoduleY的子模塊。Git:合併和子模塊

BranchA具有SubmoduleY在修訂 'ABC',BranchB有SubmoduleY在修訂 '高清'。

說我要BranchA合併到BranchB,但我要離開BranchB的SubmoduleY指向原來的「高清」的修訂工作。我看到這樣做的幾種方法:

方法1:

  1. 結帳BranchB。
  2. 將SubmoduleY移動到修訂版'abc'以使實際合併變得無痛(我們現在不想在子模塊級別進行任何合併)。
  3. 提交SubmoduleY的新版本(我們不能讓它爲合併浮動)。
  4. 將BranchA合併到BranchB中。解決任何衝突。
  5. 將SubmoduleY移回修訂版「def」。
  6. 提交SubmoduleY的新版本。
  7. 推動更改爲主回購。

方法2:

同方法1,但是在做第6步,重訂,擺脫多餘的子模塊的步驟提交3

兩者似乎有惱人的缺點:

方法1將兩個額外的提交放入歷史記錄。

方法2忘記任何改變與子模塊的修改做的,因爲這些提交移除。因此,以後的任何合併都將不得不再次處理一些問題。

有沒有更好的方法?

回答

7

您可以對方法1進行變更,但是執行的提交將子模塊版本(在步驟6中)的變更引入--amend,以便它更改合併提交中子模塊的狀態。換句話說,這將是:

$ git checkout b 
$ git merge a 
Merge made by recursive. 
example.txt | 1 + 
sY   | 2 +- 
2 files changed, 2 insertions(+), 1 deletions(-) 
create mode 100644 example.txt 
$ cd sY 
$ git checkout def 
[... you get the "detached HEAD" warning ...] 
$ cd .. 
$ git add sY 
$ git commit --amend 

請注意,我沒有理會試圖避免合併前具有不同版本的子模塊,當你在你的問題建議。如果發生衝突,您可以選擇在def處添加子模塊來解決它。如果沒有衝突,我上面提到的步驟應該可以正常工作。

+0

不錯的解決方案!謝謝。 – Ben 2010-12-08 17:56:01