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

kdiff3 - compare

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:

console merge info

Wpisuję polecenie git mergetool i zaczynam rozwiązywanie konfliktu:

Na starcie dostajemy jeszcze informacje o występujących konfliktach w pliku:

kdiff3 - number of solved conflicts

Wygląd głównego okna aplikacji (kliknij w zrzut ekranu, aby powiększyć):

kdiff3 main layout

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.

kdiff3 merge conflict line

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ć.

kdiff3 resolving conflict in selected line

Drugim sposobem jest wybranie odpowiedniej opcji z menu głównego:

kdiff3 main menu

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.

Jeśli spodobał Ci się ten wpis i chcesz otrzymywać powiadomienia o nowych treściach dotyczących zagadnień związanych z Gitem, to zachęcam do subskrypcji mojego bloga.

2 thoughts on “Git – szybsze rozwiązywanie konfliktów z narzędziem kdiff3

  1. Pingback: dotnetomaniak.pl
  2. 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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *