2012-01-26 14 views
5

Supponiamo di avere un codice ordinato, ma l'ordine non è un requisito tecnico.Unisci la risoluzione del conflitto rispetto al nuovo codice

apple 
kiwi 
strawberry 

E allora ho due argomenti che mi desidera unire in cui diff simile:

TOPIC BRANCH: orange 
    kiwi 
+ orange 
    strawberry 

E anche

TOPIC BRANCH: pear 
    kiwi 
+ pear 
    strawberry 

Esiste un modo per questi due patch per viene risolto automaticamente? Mi sembra che sia un conflitto di fusione dal momento che competono per la stessa nuova linea. Una soluzione che ho trovato è quella di riordinare una delle modifiche dal momento che l'ordinamento è solo un requisito morbido (in cui i frutti sono in realtà definizioni di funzioni).

TOPIC BRANCH: pear' 
    apple 
+ pear 
    kiwi 

Così ora possiamo fondiamo orange e pear' insieme per forma:

_ apple 
p pear 
_ kiwi 
o orange 
_ strawberry 

Ci sono altri modi per risolvere questo in modo tale che l'ordinamento può essere mantenuto? Inoltre ho pensato a pear che doveva essere a valle da orange in modo tale che orange avesse sempre la priorità e non ci sarebbe più un conflitto di unione. Ma questa è una falsa dipendenza poiché orange e pear sono due rami di funzioni separati.

Uno potrebbe essere inserito nel bagagliaio prima dell'altro, ma ciò non riguarda i rami dell'integrazione.

Modifica: Mi sono appena reso conto di due hunk che potrebbero essere mantenuti (solo supposizioni suppongo?) Potrebbero esserci due strategie di unione chiamate "prima io" e "tu prima" in modo che un ordine ambiguo possa essere risolto non -interagivamente tra due rami.

+0

Hai guardato git merge strategie? man git-merge e cerca le varie strategie, inclusa quella ricorsiva chiamata pazienza. – idlethread

risposta

7

L'approccio di base è definire uno strumento di unione personalizzato e quindi utilizzare la funzione attributi git per indicare a git di utilizzare lo strumento di unione personalizzato per tali file.

Esempio:

  1. creare un repository di test:

    $ git init t 
    $ cd t 
    
  2. definire uno strumento di unione personalizzata denominata 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'" 
    

    Lo strumento di unione sopra concatena i file, i tipi le linee risultanti e quindi rimuove le linee duplicate. Se non si desidera modificare l'ordine, sostituire il comando precedente con uno script personalizzato che esegue ciò che si desidera. Vedere git help attributes per ulteriori informazioni.

  3. tell git che si desidera utilizzare mymerge durante l'unione qualsiasi file chiamato foo.txt nel repository:

    $ echo "foo.txt merge=mymerge" >.gitattributes 
    $ git add .gitattributes 
    $ git commit -m "tell git to use the mymerge merge tool for foo.txt" 
    
  4. fanno alcuni dati di prova su tre rami:

    $ 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" 
    
  5. unire i rami (nota nessun conflitto!):

    $ git checkout master 
    $ git merge orange 
    $ git merge pear 
    
  6. profitto!

    $ cat foo.txt 
    apple 
    kiwi 
    orange 
    pear 
    strawberry 
    
0

Se il codice che deve essere ordinato è in un file separato, è possibile utilizzare uno strumento di unione personalizzato che prende due file di input, li legge e ne restituisce il contenuto, ordinati nel file dei risultati. Dovresti quindi dire a git di usare lo strumento di fusione personalizzato per questo file. Non ne so abbastanza su Git per sapere se è possibile impostare gli strumenti di unione personalizzati in base al tipo di file o regex di qualche tipo però, ma è un'idea che potrebbe darti quello che vuoi.

Problemi correlati