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:
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 B
A 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ę :)
Rozwiązywanie konfliktów i nieskończona pętla wyjścia (vimdiff) – Jakub Gutkowski
Dziękujemy za dodanie artykułu – Trackback z dotnetomaniak.pl
Najlepszy sposób na vimdiff to zamknąć vimdiffa i skonfigurować git’a aby korzystał z KDiffa3
Vimdiff nie jest zły, a kdiff3 nie był dostępny :)
Kwestia podejścia do myszy :)
Ja tam używam vimdiffa jako jedyny mergetool już ponad rok, sprawdza sie super.
?? No prostu :) aż bym Cie uściskał :)
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.
ty to dopiero jesteś luzak :)
“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.