2013-01-06 13 views
12

Załóżmy, że mam konflikt scalania na foo/bar.txt gdy działa w ten sposób:Jak automatycznie rozwiązać konflikt Git, biorąc wersję w bieżącym oddziale?

$ git checkout A 
$ git merge B 

Chciałbym automatycznie rozwiązać konflikt poprzez foo/bar.txt z oddziału A. (wiem, co robię, a ja . trzeba to wersja w gałęzi B jest źle, a ja nie dbam o utratę zmian w drzewie pracujących w tym przypadku) wydaje się, że mogę to zrobić poprzez uruchomienie tych poleceń.

$ git reset foo/bar.txt 
$ git checkout foo/bar.txt 

Is istnieje prostsze rozwiązanie o pojedynczej komendzie?

Niestety, te polecenia zmieniają się foo/bar.txt, nawet jeśli nie ma konfliktu, a ja tego nie chcę. Jeśli nie ma konfliktu, chcę zachować foo/bar.txt w jakimkolwiek stanie, który został mu pozostawiony przez git merge B.

Potrzebuję więc polecenia powłoki uniksowej, które wykryłoby konflikt w foo/bar.txt, a jeśli tak, rozwiąże konflikt, pobierając wersję foo/bar.txt z bieżącej gałęzi. Nie zrobiłoby to nic więcej, tj. Nie zmodyfikowałoby innych plików, nie zatwierdziłoby zmian i nie zmieniłoby się foo/bar.txt, jeśli nie ma konfliktu w tym pliku.

+0

Zdalne: http://stackoverflow.com/questions/528659/git-automatic-conflict-resolution –

Odpowiedz

10

Jeśli chcesz zrobić to jako jednorazowe, polecenie pojedynczej linii jest:

$ git checkout --ours foo/bar.txt # <-- resets it only if the merge found conflicts in this file 
$ git checkout HEAD -- foo/bar.txt # <-- resets it to that specific version no matter what 

Aby skonfigurować seryjnej git, aby trwale ignorować wszystkie upstream zmiany lokalnie zmienionym pliku:

$ git config merge.pin.driver true 
$ echo foo/bar.txt merge=pin >> .git/info/attributes 

(true powyżej jest tylko komenda UNIX true jej sukces sprawił, że mówi to lokalna wersja spojrzeć w prawo, w tym przypadku nic nie robi do niego. Ty oczywiście można uzyskać bardziej wyrafinowane dzięki komendom scalania).

Myślę, że nie chcesz merge --strategy=ours lub --strategy-option=ours, odnoszą się one do całych scaleń.

+0

Dziękuję (+1) za odpowiedź informacyjną, nauczyłem się dużo o Git z tego. – pts

6

Można określić opcję strategii scalania ours na domyślną strategię scalania recursive (domyślnie). Spowoduje to normalne scalenie, ale w przypadku konfliktu porcje wybiorą wersję bieżącego oddziału.

git checkout A 
git merge -Xours B 
+0

Dziękujemy za te dodatkowe informacje. Niestety nie odpowiada na moje pytanie, ponieważ komenda 'git merge B' (i prawdopodobnie wiele innych nieoczekiwanych zmian w systemie plików) została już uruchomiona. – pts

+0

Jeśli już uruchomiłeś polecenie scalania, musisz użyć metody 'reset && checkout'. – knittl

+0

Metoda resetu + kasy również nie jest odpowiedzią na moje pytanie, ponieważ nie jest to tryb "no-op", jeśli nie ma konfliktu (szczegółowe informacje znajdują się w pytaniu). – pts

Powiązane problemy