Git – szybsze rozwiązywanie konfliktów z narzędziem kdiff3
Jak zacząłem korzystać z Gita to większość poleceń wykonywałem z linii poleceń. Visual Studio używałem tylko do rozwiązywania konfliktów. Jednak taki tryb pracy był trochę niewygodny. Gdy trzeba było rozwiązać konflikt, to:
- musiałem przełączyć się do Visual Studio (a przeważnie mam kilka programów otwartych, czasem trzeba trochę się nawciskać CTRL+TAB 🙂 ),
- odpalić zakładkę Team Explorer (przeważnie mam ją ukrytą),
- wybrać opcję Changes,
- następnie wybrać Conflicts,
- wybrać odpowiedni plik i nacisnąć Merge,
- w tym dopiero następowało rozwiązywanie konfliktu w wybranym pliku,
- jeśli to był jedyny plik z konfliktem to już był koniec 🙂 .
Byłem pewny, że da się ten proces jakoś usprawnić i przyśpieszyć. Znalazłem narzędzie kdiff3 i od tego czasu już nie korzystam z Visuala do obsługi gita. Wszystko robię albo przez konsolę albo przy pomocy kdiff3.
Teraz, jak powstaje konflikt, wpisuję polecenie git mergetool
i otwiera się narzędzie. Rozwiązuje konflikt na wybranym pliku. Naciskam CTRL + S (zapis zmian), następnie CTRL + Q (zamknięcie kdiff3).
I już. Konflikt w danym pliku rozwiązany. Automatycznie w kdiff3 zostaje otwarty następny plik, w którym znajduje się kolejny konflikt.
Instalacja i konfiguracja kdiff3
Ale od początku. Skąd wziąć to narzędzie i jak go skonfigurować. Ja pracuję na Windowsie, więc opis instalacji i konfiguracji będzie dotyczył tego systemu.
Program ściągamy stąd: https://sourceforge.net/projects/kdiff3/files/. Instalator jest standardowy, nie ma tam ukrytych instalacji różnych dziwnych programów, można bez stresu klikać “Dalej”. Po zainstalowaniu programu trzeba go skonfigurować w gicie.
Można to zrobić edytując plik konfiguracyjny albo wpisując w konsoli poniższe polecenia:
git config --global merge.tool kdiff3
git config --global mergetool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
W drugim poleceniu trzeba podać ścieżkę, gdzie zainstalowaliście aplikację. Jeśli podczas instalacji nic nie zmienialiście to można skopiować polecenia i wykonać je bez zmian.
Dodatkowo narzędzie może być używane do porównywania zmian. Teraz zamiast git diff
, wystarczy wpisać git difftool
i porównanie waszych zmian pokaże się w programi kdiff3 zamiast w konsoli. Dodatkowo, żeby git nie pytał się za każdym razem czy uruchomić kdiff3, wystarczy jeszcze dodać do konfiguracji:
git config --global difftool.prompt false
W przypadku drobnych zmian, moim zdaniem wystarczy porównanie w konsoli (git diff
). Jednak przy większych zmianach na pewno wygodniej będzie porównywać zmiany w kdiff3.
Rozwiązywanie konfliktów
Jak korzystać z kdiff3 w przypadku wystąpienia konfliktu? Stworzę sobię sytuację konfilktową. Do mojej klasy User
dodam lokalnie właściwość:
public string Salt { get; set; }
A zdalnie (czyli przez github, taka symulacja pracy w zespole 🙂 ) dodam w tym samym miejscu właściwość:
public DateTime EntryDate { get; set; }
W momencie jak zrobię git pull
, dostanę informację o konflikcie:
Wpisuję polecenie git mergetool
i zaczynam rozwiązywanie konfliktu:
Na starcie dostajemy jeszcze informacje o występujących konfliktach w pliku:
Wygląd głównego okna aplikacji (kliknij w zrzut ekranu, aby powiększyć):
Na samej górze mamy główne menu programu. Poniżej tego znajdują się panele:
- A – czyli to jest nasz plik przed zmianami.
- B – tutaj są pokazane nasze zmiany lokalne.
- C – tutaj widać zmiany popełnione przez kogoś (remote)
Poniżej tych 3 paneli mamy dużo szerszy panel pokazujący kod po rozwiązaniu konfliktu. Podświetlona linia oznacza miejsce aktualnie rozwiązywanego konfliktu.
Jak rozwiązać konflikt?
Możliwości jest kilka.
Można kliknąć prawym klawiszem myszy w tę linię. Pojawi się menu kontekstowe, w którym wybieramy, którą zmianę chcemy zachować.
Drugim sposobem jest wybranie odpowiedniej opcji z menu głównego:
Można również wybrać opcję A. Pojawi się wtedy odpowiedni napis:
Ten panel jest całkowicie edytowalny, więc oprócz zmian wybranych przy rozwiązywaniu konfliktu, można dopisać swoje zmiany.
Jednak w tym przypadku chcielibyśmy zachować obie wprowadzone zmiany, zarówno z B, jak i C. I można tak zrobić. Zaznaczamy po prostu obie opcje:
Można to zrobić zarówno poprzez menu kontekstowe, jak i główne w górnej części aplikacji.
Oczywiście w jednym pliku może być więcej niż jeden konflikt. Wtedy każdą linię bądź sekcję trzeba rozwiązać w ten sposób. Między kolejnymi konfliktami możemy przechodzić używając odpowiednich opcji w menu głównym. Można również użyć skrótów klawiszowych CTRL+PgUp / CTRL+PgDown.
Na koniec musimy tylko zapisać zmiany i to by było na tyle. Mnie używanie kdiff3 usprawniło codzienną pracę deweloperską. Mam nadzieję, że ten post pomoże również Wam.
2 Komentarze
Patryk · 20 sierpnia 2018 o 14 h 27 min
W kdiff3 podoba mi się to właśnie, że nie trzeba rozwiązywać konfliktów całymi blokami kodu. Na dodatek, w przypadku konfliktu bardziej skomplikowanego (jakaś większa funkcja, jej modyfikacja przez dwie osoby na raz) można wybrać która linia z czyich zmian, gdzie ma być. Nie raz mi to uratowało tyłek, dzięki czemu nie trzeba było robić tego ręcznie :). Oczywiście, im bardziej skomplikowany przypadek, tym częściej trzeba samemu zakasać rękawy.
dotnetomaniak.pl · 20 sierpnia 2018 o 13 h 11 min
Git – szybsze rozwiązywanie konfliktów z narzędziem kdiff3 – Tomasz Prasołek
Dziękujemy za dodanie artykułu – Trackback z dotnetomaniak.pl