2012-01-26 68 views
5

假設我有一些有序的代碼,但排序不是技術要求。通過新代碼合併衝突解決方案

apple 
kiwi 
strawberry 

然後,我有我要合併兩個主題,它們的差異列表如下所示:

TOPIC BRANCH: orange 
    kiwi 
+ orange 
    strawberry 

而且還

TOPIC BRANCH: pear 
    kiwi 
+ pear 
    strawberry 

是否有這兩個補丁的方式自動解決?在我看來,這是一場合並衝突,因爲它們爭奪同一條新線。我提出的一個解決方案是對排序順序中的一個變化重新排序,因爲排序順序只是一個軟性要求(果實實際上是函數定義)。

TOPIC BRANCH: pear' 
    apple 
+ pear 
    kiwi 

所以現在我們可以合併orangepear'在一起形成:

_ apple 
p pear 
_ kiwi 
o orange 
_ strawberry 

還有沒有其他的方法可以解決此使得排序可以保持?我也想到pear必須從orange下游,這樣orange總是獲得優先權,不會再有合併衝突。但是這是錯誤的依賴關係,因爲orangepear是兩個獨立的功能分支。

一個可以在另一個之前插入主幹,但不能解決集成分支。

編輯:它只是曙光在我可以保留兩個區塊(只有我猜?)可能有兩個合併策略稱爲「我第一」和「你第一」,這樣一個模棱兩可的排序可以解決非在兩個分支之間交互。

+0

有你看着混帳合併策略? man git-merge並尋找各種策略,包括遞歸的一種叫做耐心的策略。 – idlethread

回答

7

基本的方法是定義一個自定義合併工具,然後使用git屬性功能來告訴git爲這些文件使用該自定義合併工具。

例子:

  1. 創建一個測試庫:

    $ git init t 
    $ cd t 
    
  2. 定義一個名爲mymerge自定義合併工具:

    $ git config merge.mymerge.name "my custom merge tool" 
    $ git config merge.mymerge.driver "cat '%A' '%B'|sort -u >'%A'.tmp && mv '%A'.tmp '%A'" 
    

    上述合併工具串接的文件,分類生成的行,然後刪除重複的行。如果您不想更改順序,請使用您想要的自定義腳本替換上述命令。有關更多信息,請參閱git help attributes

  3. 要使用 mymerge合併存儲庫中的名爲 foo.txt任何文件時
  4. 讓Git:

    $ echo "foo.txt merge=mymerge" >.gitattributes 
    $ git add .gitattributes 
    $ git commit -m "tell git to use the mymerge merge tool for foo.txt" 
    
  5. 就三個分支一些測試數據:

    $ printf 'apple\nkiwi\nstrawberry\n' >foo.txt 
    $ git add foo.txt 
    $ git commit -m "common ancestor version of foo.txt" 
    $ git checkout -b orange 
    $ printf 'apple\nkiwi\norange\nstrawberry\n' >foo.txt 
    $ git commit -a -m "add orange" 
    $ git checkout -b pear master 
    $ printf 'apple\nkiwi\npear\nstrawberry\n' >foo.txt 
    $ git commit -a -m "add pear" 
    
  6. 合併分支(注意不衝突!):

    $ git checkout master 
    $ git merge orange 
    $ git merge pear 
    
  7. 獲利!

    $ cat foo.txt 
    apple 
    kiwi 
    orange 
    pear 
    strawberry 
    
0

如果需要排序的代碼位於單獨的文件中,則可以使用自定義合併工具,該工具將兩個輸入文件讀取並輸出它們的內容,並將其排序到您的結果文件中。然後你會告訴git爲這個文件使用自定義合併工具。我對git知之甚少,不知道你是否可以基於文件類型或正則表達式來設置自定義合併工具,但這是一個想法,可能會給你想要的東西。