2013-06-11 27 views
4

我想從默認分支(不是所有文件和其他文件的部分)提交的一部分合併到一個命名的分支。我試過graft,但它只是需要整個承諾,無法給我一個選擇的機會。這將如何完成?如何合併只有一些文件?

實施例:

A---B---C---D 
     \ 
     -E---(G) 

G尚不存在。可以說CD每增加5個文件和修改5個文件。我想要GC上添加5個文件中的2個,對其中一個文件進行的所有修改以及對其他文件的修改。我最好喜歡它也有類似於D的東西。

當我選擇graft to local...時,我得到的全部是整個C變更集。 merge with local...

+2

就我所知,Mercurial本身並不支持這種選擇性合併。你*可以做的是執行正常的合併,然後恢復你不想合併的文件,並對你想要合併的文件進行手動修改。最後,提交合並。 – voithos

+0

@voithos這是從一個分支到另一個分支獲取錯誤修復的標準方式嗎?我會認爲這將是一個常見和支持的情況,不是嗎? – baruch

+2

這不是標準,甚至不推薦。當然,最佳實踐表明,錯誤修復應該是**自己的更改集**,因此您不必挑選單個文件。如果是這樣,你可以使用移植(或只是合併,如果錯誤修復是你在默認分支中的所有東西)。 – voithos

回答

4

合併單位是一個整體變更集,所以C和D應該已經分成小塊。您現在可以合併整個事件並還原一些文件,但這會導致您以後無法合併其他文件 - 它們已被視爲已合併。

我會做的是讓一個分支平行於C-D,在您的示例中植根於B,其中包含C和D中更改的副本,但將它們拆分爲相關部分。然後,您可以合併整個變更集,並關閉(或甚至刪除)原始C-D分支。

 C---D 
    /
A---B--C1--D1--C2--D2 (equivalent to C--D) 
    \ 
     E---(G?) 

在上面,C1和C2在一起等於C.當我在這我繼續和重新排序四個新的變更(使用歷史重寫工具,如rebase),這樣就可以然後簡單地爲E合併D1:

 C---D 
    /
A---B--C1--D1--C2--D2 
    \  \ 
     E------G 

如果重新安排新的變更是不是一種選擇,你必須做一些花哨的tapdancing提交部分的變更順序C1,D1,C2,D2;使用graft(或transplant)複製您不允許單獨合併的更改可能會少很多。例如,在下面,你仍然可以合併C1,但是你需要D1的副本(標記爲D1'),因爲如果不將C2與C2一起拖拽,就無法合併它。

 C---D 
    /
A---B--C1--C2--D1--D2 
    \ \ 
     E--G1--D1' 
相關問題