2012-01-26 18 views
5

Załóżmy, że mam zamówiony kod, ale zamówienie nie jest wymogiem technicznym.Scalenie rozdzielczości konfliktu za pomocą nowego kodu

apple 
kiwi 
strawberry 

A potem mam dwa tematy, które chcę połączyć w, której diffs wyglądać następująco:

TOPIC BRANCH: orange 
    kiwi 
+ orange 
    strawberry 

a także

TOPIC BRANCH: pear 
    kiwi 
+ pear 
    strawberry 

Czy istnieje sposób dla tych dwóch poprawek do rozwiązać automatycznie? Wydaje mi się, że jest to konflikt seryjny, ponieważ konkurują o tę samą nową linię. Rozwiązaniem, które wymyśliłem, jest zmiana kolejności jednej ze zmian, ponieważ kolejność sortowania jest tylko miękkim wymogiem (gdzie owoce są w rzeczywistości definicjami funkcji).

TOPIC BRANCH: pear' 
    apple 
+ pear 
    kiwi 

Więc teraz możemy połączyć orange i pear' razem do postaci:

_ apple 
p pear 
_ kiwi 
o orange 
_ strawberry 

Czy istnieją inne sposoby, aby rozwiązać ten problem tak, że zamawiający mogą być przechowywane? Pomyślałem także o pear konieczności downstream od orange tak, że orange zawsze dostaje pierwszeństwo i nie będzie już konfliktu scalania. Ale jest to fałszywa zależność, ponieważ orange i pear to dwie oddzielne gałęzie obiektów.

Jeden może być umieszczony w bagażniku przed drugim, ale nie adresuje gałęzi integracji.

Edycja: Uświadomiłem sobie tylko dwie porcje, które można było przechowywać (chyba tylko dodatki?) Mogą istnieć dwie strategie scalania o nazwie "ja pierwszy" i "ty pierwszy", tak, że niejednoznaczne zamówienie można rozwiązać bez -interaktywnie między dwoma oddziałami.

+0

Czy spojrzał na git scalić strategie? człowiek git-merge i poszukiwanie różnych strategii, w tym rekurencyjnej zwanej cierpliwością. – idlethread

Odpowiedz

7

Podstawowe podejście polega na zdefiniowaniu niestandardowego narzędzia scalania, a następnie skorzystaniu z funkcji atrybutów git, aby poinformować git o użyciu niestandardowego narzędzia scalania dla tych plików.

przykład:

  1. utworzyć repozytorium badania:

    $ git init t 
    $ cd t 
    
  2. określenia niestandardowe narzędzie scalania nazwie 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'" 
    

    Powyższy narzędzie seryjnej skleja plików rodzaje wynikowe linie, a następnie usuwa zduplikowane linie. Jeśli nie chcesz zmieniać kolejności, zamień powyższe polecenie na niestandardowy skrypt, który robi to, co chcesz. Aby uzyskać więcej informacji, patrz git help attributes.

  3. tell git, który chcesz użyć mymerge gdy łączenie dowolnego pliku o nazwie foo.txt w repozytorium:

    $ echo "foo.txt merge=mymerge" >.gitattributes 
    $ git add .gitattributes 
    $ git commit -m "tell git to use the mymerge merge tool for foo.txt" 
    
  4. poczynienia pewnych danych testowych na trzy gałęzie:

    $ 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. scalić oddziałów (Uwaga: nie ma konfliktów!):

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

    $ cat foo.txt 
    apple 
    kiwi 
    orange 
    pear 
    strawberry 
    
0

Jeśli kod, który należy zamówić, znajduje się w osobnym pliku, można użyć niestandardowego narzędzia scalania, które pobiera dwa pliki wejściowe, odczytuje je i wyświetla ich zawartość, posortowane w pliku wyników. Powiedziałbyś git, aby użył niestandardowego narzędzia do scalania tego pliku. Nie wiem wystarczająco dużo o git, aby wiedzieć, czy możesz ustawić niestandardowe narzędzia do łączenia na podstawie typu pliku lub wyrażenia regularnego, ale jest to pomysł, który może dać ci to, co chcesz.

Powiązane problemy