Chociaż wiele informacji zawartych w tym pytaniu i odpowiedzi jest dostępnych na StackOverflow , są one rozmieszczone na wielu stronach i wśród innych odpowiedzi, które są błędne lub mylące. Zajęło mi trochę czasu, aby poskładać wszystko, co chciałem wiedzieć.
Istnieje wiele różnych programów, które mogą być używane jako git difftool i Hybridool, i na pewno nie ma konsensusu co do tego, który jest najlepszy (opinie, wymagania i systemy operacyjne będą wyraźnie różne).
Meld jest popularnym wyborem darmowym, otwartym i wieloplatformowym (UNIX / Linux, OSX, Windows), jak pokazano w pytaniu StackOverflow. Jakie jest najlepsze wizualne narzędzie do scalania dla Git? , w którym odpowiedź proponująca Meld ma więcej niż 3-krotność głosów, jak każde inne narzędzie.
W mojej odpowiedzi poniżej odpowiedzą na 2 poniższe pytania:
- Jak skonfigurować i używać Meld jako mojego git difftool?
- Jak skonfigurować i używać Melda jako mojego narzędzia Git Fibletool?
Uwaga: Nie jest konieczne używanie tego samego programu, co zarówno difftool, jak i scaletool, dla obu programów można ustawić różne programy.
Odpowiedzi:
Jak skonfigurować i używać Meld jako mojego git difftool?
git difftool wyświetla różnicę za pomocą programu różnicowego GUI (tj. Meld) zamiast wyświetlania wyjścia różnicowego w twoim terminalu.
Chociaż można ustawić program GUI w wierszu polecenia, używając
-t <tool> / --tool=<tool>
go, bardziej sensowne jest skonfigurowanie go w.gitconfig
pliku. [Uwaga: patrz sekcje dotyczące ucieczkowych cytatów i ścieżek systemu Windows u dołu.][Uwaga: te ustawienia nie zmienią zachowania,
git diff
którego działanie będzie nadal działać jak zwykle.]Używasz
git difftool
dokładnie w taki sam sposób, jak używaszgit diff
. na przykładJeśli właściwie skonfigurowane, okno Meld otworzy się, wyświetlając różnicę za pomocą interfejsu GUI.
Kolejność paneli okna Meld GUI można kontrolować według kolejności
$LOCAL
i$REMOTE
wcmd
, to znaczy, który plik jest wyświetlany w lewym okienku, a który w prawym okienku. Jeśli chcesz je na odwrót, po prostu zamień je w ten sposób:Wreszcie
prompt = false
linia po prostu przestaje pytać gita, czy chcesz uruchomić Meld, czy domyślnie git wydaje monit.Jak skonfigurować i używać Melda jako mojego narzędzia Git Fibletool?
git Combetool pozwala używać programu do scalania GUI (tj. Meld) do rozwiązywania konfliktów scalania, które wystąpiły podczas scalania.
Podobnie jak difftool, możesz ustawić program GUI w wierszu poleceń,
-t <tool> / --tool=<tool>
ale, jak poprzednio, bardziej sensowne jest skonfigurowanie go w.gitconfig
pliku. [Uwaga: patrz sekcje dotyczące ucieczkowych cytatów i ścieżek systemu Windows u dołu.]NIE używasz
git mergetool
do faktycznego scalenia. Przed użyciemgit mergetool
wykonaj scalanie w zwykły sposób za pomocą git. na przykładJeśli występuje konflikt scalania, git wyświetli coś takiego:
W tym momencie
file_name
będzie zawierał częściowo scalony plik z informacjami o konflikcie scalania (jest to plik ze wszystkimi wpisami>>>>>>>
i<<<<<<<
).Mergetool może być teraz używany do rozwiązywania konfliktów scalania. Bardzo łatwo zaczynasz od:
Jeśli prawidłowo skonfigurowane, otworzy się okno Meld z 3 plikami. Każdy plik będzie zawarty w osobnym panelu interfejsu GUI.
W
.gitconfig
powyższym przykładzie 2 linie są sugerowane jako[mergetool "meld"]
cmd
linia. W rzeczywistości istnieją różne sposoby konfigurowaniacmd
linii przez zaawansowanych użytkowników , ale to wykracza poza zakres tej odpowiedzi.Ta odpowiedź ma 2 alternatywne
cmd
linie, które między nimi zaspokoją większość użytkowników i będą dobrym punktem wyjścia dla zaawansowanych użytkowników, którzy chcą przenieść narzędzie na wyższy poziom złożoności.Po pierwsze, co oznaczają parametry:
$LOCAL
to plik w bieżącej gałęzi (np. master).$REMOTE
to plik w łączonej gałęzi (np. nazwa_gałęzi).$MERGED
to częściowo scalony plik z zawartymi w nim informacjami o konflikcie scalania.$BASE
jest wspólnym przodkiem zatwierdzenia$LOCAL
i$REMOTE
, co oznacza, że plik był taki, jak wtedy, gdy gałąź zawierająca$REMOTE
była pierwotnie utworzona.Sugeruję użycie:
lub:
Wybór jest czy do użytku
$MERGED
lub$BASE
w między$LOCAL
i$REMOTE
.Tak czy inaczej, Meld wyświetli 3 panele z
$LOCAL
oraz$REMOTE
w lewym i prawym panelu oraz w jednym$MERGED
lub$BASE
w środkowym panelu.W obu przypadkach środkowy panel to plik, który należy edytować, aby rozwiązać konflikty scalania. Różnica polega na tym, w której pozycji początkowej edytowania wolisz;
$MERGED
dla pliku zawierającego częściowo scalony plik z informacjami o konflikcie scalania lub$BASE
dla przodka wspólnego zatwierdzenia$LOCAL
i$REMOTE
. [Ponieważ obiecmd
linie mogą być przydatne, trzymam je obie w moim.gitconfig
pliku. Przez większość czasu używam$MERGED
linii i$BASE
linia jest komentowana, ale komentowanie może zostać zamienione, jeśli$BASE
zamiast tego chcę użyć linii.]Uwaga dotycząca pliku wyjściowego: nie martw się, że
--output "$MERGED"
jest używanycmd
niezależnie od tego,$MERGED
czy$BASE
był używany wcześniej wcmd
linii. Ta--output
opcja informuje Meld, w której nazwie pliku git ma zostać zapisany plik rozwiązywania konfliktu. Meld zapisze zmiany konfliktu w tym pliku, niezależnie od tego, czy używasz go,$MERGED
czy$BASE
jako początkowego punktu edycji.Po edycji środkowego panelu w celu rozwiązania konfliktów scalania, po prostu zapisz plik i zamknij okno Meld. Git wykona aktualizację automatycznie, a plik w bieżącej gałęzi (np. Master) będzie teraz zawierał wszystko, co skończyło się w środkowym okienku.
git utworzy kopię zapasową częściowo scalonego pliku z zawartymi w nim informacjami o konflikcie scalania, dołączając
.orig
do oryginalnej nazwy pliku. npfile_name.orig
. Po sprawdzeniu, czy jesteś zadowolony ze scalenia i uruchomieniu dowolnych testów, które możesz wykonać,.orig
plik można usunąć.W tym momencie możesz teraz wykonać zatwierdzenie, aby zatwierdzić zmiany.
Jeśli podczas edytowania konfliktów scalania w Meld chcesz zrezygnować z używania Meld, a następnie wyjdź z Meld bez zapisywania pliku rozdzielczości scalania w środkowym panelu. git odpowie komunikatem,
file_name seems unchanged
a następnie zapytaWas the merge successful? [y/n]
, jeśli odpowiesz,n
rozwiązywanie konfliktów scalania zostanie przerwane, a plik pozostanie niezmieniony. Zauważ, że jeśli zapisałeś plik w Meld w dowolnym momencie, nie otrzymasz ostrzeżenia i monitu od git. [Oczywiście, możesz po prostu usunąć plik i zastąpić go.orig
plikiem kopii zapasowej , który Git przygotował dla Ciebie.]Jeśli masz więcej niż 1 plik z konfliktami scalania, git otworzy nowe okno Meld dla każdego z nich, jeden po drugim, aż wszystkie zostaną zakończone. Nie wszystkie zostaną otwarte w tym samym czasie, ale kiedy zakończysz edycję konfliktów w jednym i zamkniesz Meld, git otworzy następny i tak dalej, aż wszystkie konflikty scalenia zostaną rozwiązane.
Rozsądnie byłoby stworzyć fikcyjny projekt do przetestowania użycia
git mergetool
przed użyciem go w projekcie na żywo . Pamiętaj, aby w teście użyć nazwy pliku zawierającej spację, na wypadek gdyby Twój system operacyjny wymagał od ciebie znaków cudzysłowu wcmd
linii, patrz poniżej.Ucieczka znaków cytatu
W niektórych systemach operacyjnych może być konieczne wstawianie cudzysłowów
cmd
. Mniej doświadczeni użytkownicy powinni pamiętać, że wiersze poleceń config powinny być testowane z nazwami plików zawierającymi spacje, a jeślicmd
linie nie działają z nazwami plików zawierającymi spacje, spróbuj uciec od cudzysłowów. na przykładW niektórych przypadkach może być potrzebna bardziej złożona zmiana znaczenia cytatów. Pierwszy z linków do ścieżki Windows poniżej zawiera przykład potrójnego ucieczki każdego cytatu. To nuda, ale czasem konieczna. na przykład
Ścieżki systemu Windows
Użytkownicy systemu Windows prawdopodobnie będą potrzebować dodatkowej konfiguracji dodanej do
cmd
linii Meld . Może być konieczne użycie pełnej ścieżki domeldc
, która została zaprojektowana do wywoływania w systemie Windows z wiersza polecenia, lub mogą potrzebować lub chcą użyć opakowania. Powinni przeczytać poniższe strony StackOverflow, które dotyczą ustawiania prawidłowejcmd
linii Meld dla Windows. Ponieważ jestem użytkownikiem Linuksa, nie jestem w stanie przetestować różnychcmd
linii systemu Windows i nie mam żadnych dodatkowych informacji na ten temat, poza zaleceniem użycia moich przykładów z dodaniem pełnej ścieżki do Meldmeldc
lub dodaniem folderu programu Meld do twojegopath
.Ignorowanie końcowych białych znaków w Meld
Meld ma wiele preferencji, które można skonfigurować w GUI.
Na
Text Filters
karcie preferencji znajduje się kilka przydatnych filtrów do ignorowania takich rzeczy jak komentarze podczas wykonywania porównania. Chociaż istnieją filtry do zignorowaniaAll whitespace
iLeading whitespace
nie maTrailing whitespace
filtru ignorowania (zasugerowano to jako dodatek do listy mailingowej Meld, ale nie jest dostępny w mojej wersji).Ignorowanie końcowych białych znaków jest często bardzo przydatne, szczególnie podczas współpracy, i można je łatwo dodać ręcznie za pomocą prostego wyrażenia regularnego na
Text Filters
karcie preferencji Meld .Mam nadzieję, że to pomoże wszystkim.
źródło
[mergetool "meld"]
cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
w~/.gitconfig
, a potem po prostu rozwiązać konflikty podświetlony na czerwono w środku patelni i zaoszczędzić! To powinno być ustawienie domyślne.$LOCAL $MERGED $REMOTE
to ustawienie, którego używam przez większość czasu, gdy jest tylko kilka konfliktów do rozwiązania, jest doskonałe i jest to również moje domyślne.$LOCAL $BASE $REMOTE
naprawdę wchodzi w grę, gdy jest wiele do zrobienia i wiesz dokładnie, które sekcje kodu pochodzą z którego pliku; wspólny przodek zatwierdzenia może być świetnym punktem wyjścia wolnym od bałaganu, czasem wyróżnianie konfliktu przeszkadza, a czystsza podstawa jest błogosławieństwem.=
następującego:cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output="$MERGED"
Podczas gdy druga odpowiedź jest poprawna, oto najszybszy sposób, aby po prostu skonfigurować Meld jako narzędzie wizualnego porównywania. Po prostu skopiuj / wklej to:
Teraz uruchom
git difftool
w katalogu, a Meld zostanie uruchomiony dla każdego innego pliku.Uwaga dodatkowa: Meld jest zaskakująco powolny w porównywaniu plików CSV, a żadne narzędzie do porównywania Linuksa nie jest szybsze niż to narzędzie Windows o nazwie Porównaj! (ostatnia aktualizacja w 2010 r.).
źródło
git config --global difftool.meld.cmd 'meld "$LOCAL" "$REMOTE"'
tam również linię. Jest to „domyślny”, ale jak tylko skonfigurujeszmergetool
,difftool
zacznie on używać domyślnej konfiguracji Hybridool, jeśli nie zostanie znaleziona konfiguracja diff. Ponieważ scalanie jest na ogół skonfigurowane do przekazywania trzech plików do scalenia 3-kierunkowego, oznacza to, że twoje oknomeld
różnicowe nagle będzie miało trzy panele, co nie ma żadnego sensu.Dla systemu Windows . Uruchom następujące polecenia w Git Bash:
(Zaktualizuj ścieżkę do pliku Meld.exe, jeśli twój jest inny.)
Dla systemu Linux . Uruchom następujące polecenia w Git Bash:
Możesz zweryfikować ścieżkę Melda za pomocą tego polecenia:
źródło
git config --global --get-regex diff*
?git config --global difftool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"
?Wolę ustawić meld jako osobne polecenie, na przykład:
Dzięki temu jest podobny do skryptu git-meld.pl tutaj: https://github.com/wmanley/git-meld
Następnie możesz po prostu biec
źródło
--dir-diff
porcję jako osobiste preferencje.)W przypadku systemu Windows 10 musiałem umieścić to w moim .gitconfig:
Wszystko inne, co musisz wiedzieć, jest napisane w tej super odpowiedzi przez Mattst dalej powyżej.
PS: Z jakiegoś powodu działało to tylko z Meld 3.18.x, Meld 3.20.x daje mi błąd.
źródło
Jest to odpowiedź skierowana przede wszystkim do programistów używających systemu Windows, ponieważ składnia ścieżki narzędzia diff różni się od innych platform.
Używam Kdiff3 jako git Hybridool, ale aby skonfigurować Git Difftool jako Meld, najpierw zainstalowałem najnowszą wersję Meld z Meldmerge.org, a następnie dodałem następujące elementy do mojego globalnego .gitconfig za pomocą:
Uwaga: jeśli wolisz Sublime Text 3 zamiast domyślnego Vima jako core ditor, możesz dodać to do pliku .gitconfig:
Następnie dodajesz zajazd Meld jako difftool
Uwaga wiodący ukośnik na cmd powyżej, w systemie Windows jest to konieczne.
Możliwe jest również skonfigurowanie aliasu, aby pokazać bieżący git diff z opcją --dir-diff . Spowoduje to wyświetlenie listy zmienionych plików w Meld, co jest przydatne, gdy zmieniłeś wiele plików (rzeczywiście bardzo częsty scenariusz).
Alias wygląda następująco w pliku .gitconfig, poniżej sekcji [alias] :
Aby pokazać zmiany, które wprowadziłem w kodzie, wprowadzam następujące polecenie:
Poniższy obraz pokazuje, jak ta opcja --dir-diff może wyświetlać listę zmienionych plików (przykład):
Następnie można kliknąć każdy plik i wyświetlić zmiany w Meld.
źródło
Obliczenie różnicy w głowie z różnych sekcji w $ MERGED może być skomplikowane i zastosować to. W moim ustawieniu meld pomaga wizualnie pokazać te różnice, używając:
Wygląda dziwnie, ale oferuje bardzo wygodny przepływ pracy, przy użyciu trzech zakładek:
na karcie 1 widać (od lewej do prawej) zmianę, którą należy wprowadzić na karcie 2, aby rozwiązać konflikt scalania.
po prawej stronie zakładki 2 stosujesz „zmianę, którą powinieneś wprowadzić” i kopiujesz całą zawartość pliku do schowka (używając ctrl-a i ctrl-c).
w zakładce 3 zamień prawą stronę na zawartość schowka. Jeśli wszystko jest w porządku, zobaczysz teraz - od lewej do prawej - taką samą zmianę, jak pokazano na karcie 1 (ale w różnych kontekstach). Zapisz zmiany wprowadzone na tej karcie.
Uwagi:
źródło
$BASE
zamiast$MERGED
rozpocząć scalanie można użyć