vimdiff i łączyć konflikty

14

Podczas łączenia oddziałów pod kontrolą źródła często występuje problem konfliktu scalania z innymi programistami.

Wiem, że możemy użyć vimdiff do różnicowania zmian kodu w stosunku do kontroli źródła , ale jest też sposób, w jaki możemy użyć vimdiff do pomocy w rozwiązywaniu konfliktów łączenia.

Osobiście bardziej interesuje mnie git, ale dobrze byłoby zrozumieć, czy istnieją wtyczki / techniki dla innych narzędzi / systemów kontroli źródła.

Martin York
źródło
Czy kiedykolwiek próbowałeś Melda ?
Eric Sabelhaus,
1
@EricSabelhaus: Czy jest lepsze niż vimdiff w rozwiązywaniu konfliktów? Ta strona dotyczy zadawania / odpowiadania na pytania dotyczące vima.
Martin York,
To zależy od przypadku użycia. Jeśli pracuję nad kodem, który żyje zdalnie, z pewnością użyję vimdiff. Jeśli pracuję lokalnie na moim urządzeniu deweloperskim, użyję Melda, ponieważ zapewnia on bogaty w funkcje interfejs użytkownika, który pomaga deweloperowi w wykonywaniu złożonych połączeń 3-kierunkowych.
Eric Sabelhaus,
1
@EricSabelhaus: Dla mnie termin feature rich UIten wprowadza w błąd; vimdiff może nie mieć przyjemnego interfejsu użytkownika, jest zdecydowanie bogaty w funkcje. Uważam również, że vim jest znacznie bardziej produktywnym środowiskiem niż wszystkie edytory GUI, z których korzystałem (ale używałem go przez długi czas i była to stroma krzywa uczenia się). Bardziej mnie ciekawi, czy Meld robi cokolwiek, czego nie robi vim, co sprawiłoby, że warto było choćby patrzeć.
Martin York,
Nie mogę powiedzieć konkretnie, czy ma bardziej solidny zestaw funkcji, ale zdecydowanie jest w tej samej sferze, co vimdiff.
Eric Sabelhaus,

Odpowiedzi:

18

Zwykle używam git w wierszu poleceń.

Ale kiedy dochodzi do konfliktu scalenia, używam Vima, aby je rozwiązać (osobiście robię to za pomocą wtyczki zbiegającej). Uwaga: zbieg jest dobry dla wielu manipulacji gitami z poziomu Vima. Moją ulubioną funkcją jest trójdrożny konflikt scalania.

git obsługuje to w vimdiff poprzez git scaletool. Zainstalowałem zbieg, ale możesz go skonfigurować ręcznie (Dzięki @Jay Thompson).

Manualna instalacja:

git config --global merge.tool vimdiff
git mergetool <file with conflicts>

Wynik jest nieco inny niż opisany poniżej (nie korzystałem z tego osobiście). Ale zasada jest taka sama, ale u dołu znajduje się czwarte okno zawierające wynik.

wprowadź opis zdjęcia tutaj

Skonfiguruj za pomocą Fugitive

vim-fugitive to wtyczka git otoki / integracji dla Vima; potrafi wiele rzeczy, a jednym z nich jest rozwiązywanie konfliktów.

<Install the Fugitive Plugin>
vim <file with conflicts>
:Gdiff
  1. Widok 2 (po lewej): kod, który był w twoim oddziale.
  2. Widok 1 (w środku): Scalony kod (z konfliktami)
  3. Widok 3 (po prawej): kod, który został scalony z twoim kodem.

Możesz teraz pobrać i przenieść tekst z dwóch pozostałych widoków do widoku centralnego (który będzie zawierał wszystkie poprawki ręczne). Po rozwiązaniu wszystkich konfliktów ręcznie po prostu wyjdź z vimdiff

wprowadź opis zdjęcia tutaj

Chociaż możesz używać :diffget <view number>i :diffput <view number>do ciągnięcia i wypychania rzeczy między widokami. Osobiście nie uważam tego za bardzo przydatne. Cały kod jest już w środkowym widoku. Chciałbym więc edytować ten widok ręcznie, dopóki konflikt nie zostanie rozwiązany. Możliwość oglądania obu wersji kodu po obu stronach okna edytora jest jednak niezwykle przydatna.

Również bardzo dobre demo jego użycia tutaj

Martin York
źródło
1
Jeśli z jakiegoś powodu nie chcesz używać ani instalować Fugitive, możesz po prostu ustawić, git config --global merge.tool vimdiffa następnie uruchomić, git mergetoolaby uruchomić vima w trybie różnicowym.
Jay Thompson,
Czy obsługuje to styl „diff3” konfliktów scalania, w którym pokazane są „połączone wspólne przodki”?
alxndr
@alxndr: Nie słyszałem wcześniej o diff3. Ale po szybkim google. Wyjście konfliktu scalenia w git (i innej kontroli źródła, której użyłem) jest takie samo jak diff3 -E. Tak więc powyższe obrazy są generowane z plików, które zawierają te znaczniki.
Martin York,
Teraz, gdy przyjrzę się uważnie, pierwszy zrzut ekranu pokazuje styl scalania diff3; środkowy górny panel „BASE” jest wspólnym przodkiem, od którego odbiegały lewe i prawe panele.
alxndr
1
Ważne jest, aby pamiętać, że każdy z tych 4 widoków jest tylko buforem. Oznacza to, że możesz otworzyć kolejną kartę (lub nawet pozostać w tym samym oknie) i wybrać tylko bufory, które chcesz przeglądać w danym momencie. Nie ma powodu, aby wszystkie 4 okna były otwarte jednocześnie, jeśli nie korzystasz z nich wszystkich.
Cody Poll