Jak rozwiązywać konflikty scalania w Git

Jak rozwiązywać konflikty scalania w Git?

Rozwiązanie

Spróbuj: git mergetool.

Otwiera GUI, które prowadzi cię przez każdy konflikt, a ty możesz wybrać jak go scalić. Czasami wymaga to trochę ręcznej edycji, ale zazwyczaj jest to wystarczające samo w sobie. Jest to o wiele lepsze niż robienie wszystkiego ręcznie.

Jak na komentarz @JoshGlover:

Polecenie nie'koniecznie otwiera GUI, chyba że je zainstalujesz. Uruchomienie git mergetool dla mnie spowodowało użycie vimdiff. Możesz zainstalować jedno z następujących narzędzi, aby użyć go zamiast tego: meld, opendiff, kdiff3, tkdiff, xxdiff, tortoisemerge, gvimdiff, diffuse, ecmerge, p4merge, araxis, vimdiff, emerge.

Poniżej znajduje się przykładowa procedura użycia vimdiff do rozwiązywania konfliktów scalania. W oparciu o ten link

Krok 1: Uruchom następujące komendy w swoim terminalu

git config merge.tool vimdiff
git config merge.conflictstyle diff3
git config mergetool.prompt false

To ustawi vimdiff jako domyślne narzędzie do scalania.

Krok 2: Uruchom następującą komendę w terminalu

git mergetool

Krok 3: Wyświetli się vimdiff w następującym formacie

  ╔═══════╦══════╦════════╗
  ║       ║      ║        ║
  ║ LOCAL ║ BASE ║ REMOTE ║
  ║       ║      ║        ║
  ╠═══════╩══════╩════════╣
  ║                       ║
  ║        MERGED         ║
  ║                       ║
  ╚═══════════════════════╝

Te 4 widoki to

LOCAL - jest to plik z bieżącej gałęzi

BASE - wspólny przodek, jak wyglądał plik przed obiema zmianami

REMOTE - plik, który scalasz do swojej gałęzi

MERGED - wynik scalania, to jest to co zostanie zapisane w repo

Możesz poruszać się pomiędzy tymi widokami używając ctrl+w. Do widoku MERGED możesz przejść bezpośrednio używając ctrl+w a następnie j.

Więcej informacji o nawigacji vimdiff tutaj i tutaj.

Krok 4. Możesz edytować widok MERGED w następujący sposób

Jeśli chcesz pobrać zmiany z REMOTE

:diffg RE  

Jeśli chcesz otrzymać zmiany z BASE

:diffg BA  

Jeśli chcesz pobrać zmiany z LOCAL

:diffg LO 

Krok 5. Zapisz, Zakończ, Zatwierdź i Wyczyść

:wqa zapisz i wyjdź z vi

git commit -m "message"

git clean Usuń dodatkowe pliki (np. *.orig) utworzone przez narzędzie diff.

Komentarze (20)
  1. Zidentyfikuj, które pliki są w konflikcie (Git powinien Ci to powiedzieć).

  2. Otwórz każdy plik i zbadaj dyferencje; Git je rozgranicza. Mam nadzieję, że będzie oczywiste, którą wersję każdego bloku zachować. Być może będziesz musiał przedyskutować to z innymi programistami, którzy popełnili kod.

  3. Po rozwiązaniu konfliktu w pliku git add the_file.

  4. Gdy już rozwiążesz wszystkie konflikty, wykonaj git rebase --continue lub jakąkolwiek inną komendę Git powiedział, aby zrobić, gdy skończyłeś.

Komentarze (7)

Jeśli często wykonujesz małe commity, zacznij od spojrzenia na komentarze commitów za pomocą git log --merge. Następnie git diff pokaże ci konflikty.

Dla konfliktów, które obejmują więcej niż kilka linii, łatwiej jest zobaczyć, co się dzieje w zewnętrznym narzędziu GUI. Lubię opendiff - Git obsługuje także vimdiff, gvimdiff, kdiff3, tkdiff, meld, xxdiff, emerge po wyjęciu z pudełka i można zainstalować inne: git config merge.tool "your.tool" ustawi wybrane przez nas narzędzie, a następnie git mergetool po nieudanym scaleniu pokaże nam różnice w kontekście.

Za każdym razem, gdy edytujesz plik, aby rozwiązać konflikt, git add filename zaktualizuje indeks i twój diff nie będzie go już pokazywał. Kiedy wszystkie konflikty zostaną rozwiązane, a ich pliki zostaną git add, git commit zakończy scalanie.

Komentarze (1)