Niezależne z jakiej kontroli wersji korzystamy, od czasu do czasu jesteśmy zmuszeni do rozwiązywania konfliktów powstałych w ramach mergowania plików. Przy okienkowych systemach jest to dość proste gdyż narzędzie z miejsca otwiera aplikację która to umożliwia (no chyb, że to TFS to wtedy mamy opcję do wyboru którą wersję zachować a nie ma możliwości mergowania). Do wbudowanych narzędzi możemy dodać wiele dodatkowych które nam umożliwią w łatwy przyjazny sposób zrobić mergowanie plików niezależnie od kontroli wersji.

Są jednak sytuacje, gdzie nie mamy wyboru i nie możemy nic innego zainstalować i musimy skorzystać z wbudowanego/domyślnego narzędzia które nie koniecznie jest… przyjazne :) Ja ostatnio miałem taką sytuację z git gdzie ku mojej radości byłem poproszony o wykorzystanie vimdiff – ach, serduszku puka w rytmie cza cza.

Więc dla mnie jak i dla tych wszystkich szczęśliwców których taka radość spotka, krótki przewodnik po ciemnych zakamarkach.

Niezależnie jak wam się udało tam trafić, a może się wam to udać na kilka sposobów, powinniście skończyć z takim o to ekranem:

vimdiff - rozwiązywanie konfliktów :)
vimdiff – rozwiązywanie konfliktów :)

Ekran podzielony jest na 4 sekcje, każda reprezentuje inny stan pliku. Po lewej to plik aktualny w danym branchu. Czasami na dole (tam gdzie jasno szare), może istnieć napis LOCAL. Po środku to plik aktualny który jest przechowywany w git, tak zwany BASE – tak jak przy LOCAL, tutaj BASE może być też w nazwie pliku. Po prawej stronie zaś mamy plik z gałęzi z której próbujemy zrobić merge/rebase. Jest to tak zwany REMOTE. Na dole zaś to plik wynikowy, MERGED.

Pomiędzy różnymi sekcjami możemy się poruszać za pomocą klawiszy CTRL+W+[W|J] gdzie W to następny a J poprzedni. To przechodzenie może się przydać by dotrzeć do okna MERGED. Co zresztą zrobić powinniśmy. Następnie możemy się poruszać poleceniami:

  • ]c – następny konflikt
  • [c – poprzedni konflikt

Na każdym konflikcie zaś możemy wykonać polecenie które zadecyduje jaką wersję mamy wykorzystać. Mamy do wyboru trzy LOCAL, BASE i REMOTE. Każdej odpowiada odpowiedni skrót LO (LOCAL), BA (BASE), RE (REMOTE).

Jak mamy linijkę konfliktu zaznaczoną – czy to przez ]c [c czy normalnie przez strzałki lub hjkl to piszemy:

:diffget SKRÓT

Komenda ta, wykorzysta wersję z danego okna. :diffget RE weźmie linijkę/fragment z REMOTE, :diffget BA z BASE i :diffget LO z LOCAL.

Oczywiście, możemy plik edytować sami jak potrzeba. Po wszystkich naszych operacjach możemy wykonać komendę:

:diffupdate

To powinno usunąć leftover spacing issues. Ja tam nie widziałem różnicy ale może tego problemu nie miałem. Ogólnie ma to czyścić spacje i entery i odświeżyć widok MERGED. Na końcu zaś komenda:

:only

Pokarze nam jedynie nasz plik z okna MERGED po wszystkich zmianach. A potem to już sami wykombinujcie jak wyjść z vim! :)

:wq

Nie jest to trudne, trzeba tylko poznać komendy. Działa sprawnie, szybko i pewnie jest dostępne nawet o klienta na kompie jak jest dostępny git. To na co trzeba zwrócić uwagę, to na przykład jak coś nam się popsuje w trakcie pracy nad MERGED to ja nie znamy vim to będzie robić z 4 razy :q! a potem jeszcze w gicie parę rzeczy. Ale daje radę :)

9 KOMENTARZE

  1. Ja po prostu otwieram plik, potem /=== i szukam tagów dodanych przez git-a i ręcznie rozwiązuję konflikty. Żaden tool nie jest dla mnie wygodny.

  2. “no chyba, że to TFS to wtedy mamy opcję do wyboru którą wersję zachować a nie ma możliwości mergowania” – możesz rozwinąć? bo jak używam tfs przez Visual Studio od jakiś 6 lat, to nie spotkałem się z czymś takim. Zawsze pojawiało mi się okienko do mergowania. No chyba że to jakiś uszczypliwy komentarz w stronę tfs, którego “nie-hejter-tfs’a” nie rozumie.

    • tak, hejtowy i uszczypliwy, ale oparty na moich doświadczeniach. a mi to co ma prawo nie zadziałąć, nie zadziałą. U mnie okienko do mergowania pojawia się raz na ruski rok. przeważnie mam opcję: zachować swoją, wziąć z serwera. Albo raz miałem ponad 1000 plików do mergowania ręcznego – różniły się encodingiem, w sród tego 1000 były pliki które miały więcej zmian. itp. Różne dziwne rzeczy mi się z TFS przydarzają.

Comments are closed.