Konfigurowanie i używanie Melda jako narzędzia git difftool i scaletool

255

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.

mat
źródło

Odpowiedzi:

423

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 .gitconfigpliku. [Uwaga: patrz sekcje dotyczące ucieczkowych cytatów i ścieżek systemu Windows u dołu.]

# Add the following to your .gitconfig file.
[diff]
    tool = meld
[difftool]
    prompt = false
[difftool "meld"]
    cmd = meld "$LOCAL" "$REMOTE"

[Uwaga: te ustawienia nie zmienią zachowania, git diffktórego działanie będzie nadal działać jak zwykle.]

Używasz git difftooldokładnie w taki sam sposób, jak używasz git diff. na przykład

git difftool <COMMIT_HASH> file_name
git difftool <BRANCH_NAME> file_name
git difftool <COMMIT_HASH_1> <COMMIT_HASH_2> file_name

Jeś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 $LOCALi $REMOTEw cmd, 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:

    cmd = meld "$REMOTE" "$LOCAL"

Wreszcie prompt = falselinia 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 .gitconfigpliku. [Uwaga: patrz sekcje dotyczące ucieczkowych cytatów i ścieżek systemu Windows u dołu.]

# Add the following to your .gitconfig file.
[merge]
    tool = meld
[mergetool "meld"]
    # Choose one of these 2 lines (not both!) explained below.
    cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
    cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"

NIE używasz git mergetooldo faktycznego scalenia. Przed użyciem git mergetoolwykonaj scalanie w zwykły sposób za pomocą git. na przykład

git checkout master
git merge branch_name

Jeśli występuje konflikt scalania, git wyświetli coś takiego:

$ git merge branch_name
Auto-merging file_name
CONFLICT (content): Merge conflict in file_name
Automatic merge failed; fix conflicts and then commit the result.

W tym momencie file_namebę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:

git mergetool

Jeśli prawidłowo skonfigurowane, otworzy się okno Meld z 3 plikami. Każdy plik będzie zawarty w osobnym panelu interfejsu GUI.

W .gitconfigpowyższym przykładzie 2 linie są sugerowane jako [mergetool "meld"] cmdlinia. W rzeczywistości istnieją różne sposoby konfigurowania cmdlinii przez zaawansowanych użytkowników , ale to wykracza poza zakres tej odpowiedzi.

Ta odpowiedź ma 2 alternatywne cmdlinie, 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.
  • $BASEjest wspólnym przodkiem zatwierdzenia $LOCALi $REMOTE, co oznacza, że ​​plik był taki, jak wtedy, gdy gałąź zawierająca $REMOTEbyła pierwotnie utworzona.

Sugeruję użycie:

[mergetool "meld"]
    cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"

lub:

[mergetool "meld"]
    cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"
    # See 'Note On Output File' which explains --output "$MERGED".

Wybór jest czy do użytku $MERGEDlub $BASEw między $LOCALi $REMOTE.

Tak czy inaczej, Meld wyświetli 3 panele z $LOCALoraz $REMOTEw lewym i prawym panelu oraz w jednym $MERGEDlub $BASEw ś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; $MERGEDdla pliku zawierającego częściowo scalony plik z informacjami o konflikcie scalania lub $BASEdla przodka wspólnego zatwierdzenia $LOCALi $REMOTE. [Ponieważ obie cmdlinie mogą być przydatne, trzymam je obie w moim .gitconfigpliku. Przez większość czasu używam $MERGEDlinii i $BASElinia jest komentowana, ale komentowanie może zostać zamienione, jeśli $BASEzamiast tego chcę użyć linii.]

Uwaga dotycząca pliku wyjściowego: nie martw się, że --output "$MERGED"jest używany cmdniezależnie od tego, $MERGEDczy $BASEbył używany wcześniej w cmdlinii. Ta --outputopcja 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, $MERGEDczy $BASEjako 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 .origdo oryginalnej nazwy pliku. np file_name.orig. Po sprawdzeniu, czy jesteś zadowolony ze scalenia i uruchomieniu dowolnych testów, które możesz wykonać, .origplik 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 unchangeda następnie zapyta Was the merge successful? [y/n], jeśli odpowiesz, nrozwią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 .origplikiem 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 mergetoolprzed 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 w cmdlinii, 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śli cmdlinie nie działają z nazwami plików zawierającymi spacje, spróbuj uciec od cudzysłowów. na przykład

cmd = meld \"$LOCAL\" \"$REMOTE\"

W 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

cmd = meld \\\"$LOCAL\\\" \\\"$REMOTE\\\"

Ścieżki systemu Windows

Użytkownicy systemu Windows prawdopodobnie będą potrzebować dodatkowej konfiguracji dodanej do cmdlinii Meld . Może być konieczne użycie pełnej ścieżki do meldc, 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łowej cmdlinii Meld dla Windows. Ponieważ jestem użytkownikiem Linuksa, nie jestem w stanie przetestować różnych cmdlinii 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 Meld meldclub dodaniem folderu programu Meld do twojego path.

Ignorowanie końcowych białych znaków w Meld

Meld ma wiele preferencji, które można skonfigurować w GUI.

Na Text Filterskarcie preferencji znajduje się kilka przydatnych filtrów do ignorowania takich rzeczy jak komentarze podczas wykonywania porównania. Chociaż istnieją filtry do zignorowania All whitespacei Leading whitespacenie ma Trailing whitespacefiltru 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 Filterskarcie preferencji Meld .

# Use either of these regexes depending on how comprehensive you want it to be.
[ \t]*$
[ \t\r\f\v]*$

Mam nadzieję, że to pomoże wszystkim.

mat
źródło
2
Dzięki, że tak wiele łatwiejsze w użyciu [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.
KrisWebDev
1
$LOCAL $MERGED $REMOTEto 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 $REMOTEnaprawdę 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.
Mattst
4
Uwaga: Jeśli korzystasz z OSX i zainstalowałeś meld poprzez homebrew, parametr wyjściowy będzie wymagał =następującego:cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output="$MERGED"
Alteisen
2
Użytkownicy komputerów Mac, którzy zainstalowali plik .dmg i stwierdzili, że „meld” nie jest na ich ścieżce, postępuj zgodnie z alternatywnym zestawem instrukcji tutaj: yousseb.github.io/meld
KC Baltz
3
To o wiele lepsze niż wyjaśnienie w Git Configuration - git scaletool . Dziękujemy szczególnie za wyjaśnienie różnicy między $ MERGED a $ BASE. Uratował mnie od szaleństwa!
ChrisG
81

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:

git config --global diff.tool meld
git config --global difftool.prompt false

Teraz uruchom git difftoolw 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.).

Dan Dascalescu
źródło
13
Prawdopodobnie chcesz git config --global difftool.meld.cmd 'meld "$LOCAL" "$REMOTE"'tam również linię. Jest to „domyślny”, ale jak tylko skonfigurujesz mergetool, difftoolzacznie 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 okno meld różnicowe nagle będzie miało trzy panele, co nie ma żadnego sensu.
BeeOnRope,
Dlaczego nie sprawdzić konfiguracji, po ustawieniu $ git config -l
agfe2 10.04.19
56

Dla systemu Windows . Uruchom następujące polecenia w Git Bash:

git config --global diff.tool meld
git config --global difftool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"
git config --global difftool.prompt false

git config --global merge.tool meld
git config --global mergetool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"
git config --global mergetool.prompt false

(Zaktualizuj ścieżkę do pliku Meld.exe, jeśli twój jest inny.)

Dla systemu Linux . Uruchom następujące polecenia w Git Bash:

git config --global diff.tool meld
git config --global difftool.meld.path "/usr/bin/meld"
git config --global difftool.prompt false

git config --global merge.tool meld
git config --global mergetool.meld.path "/usr/bin/meld"
git config --global mergetool.prompt false

Możesz zweryfikować ścieżkę Melda za pomocą tego polecenia:

which meld
MarredCheese
źródło
1
Wystąpił błąd po uruchomieniu git difftool „Połączenie narzędzia różnic nie jest dostępne jako„ D: \ software \ melddiff \ Meld.exe ””
Allen Vork
@AllenVork: Czy potwierdziłeś, że Meld.exe znajduje się w określonym folderze? Czy możesz pomyślnie uruchomić go poza Git? Co zwraca Git po uruchomieniu git config --global --get-regex diff*?
MarredCheese,
Rozwiązałem to. Zmieniam go na „D: /software/melddiff/Meld.exe” i działa. Format .gitconfig to Ubuntu, a nie Windows.
Allen Vork
Nie powinno to być: git config --global difftool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"?
Jonathan Rosenne,
@AllenVork, używasz git do cygwina?
Adrian
25

Wolę ustawić meld jako osobne polecenie, na przykład:

git config --global alias.meld '!git difftool -t meld --dir-diff'

Dzięki temu jest podobny do skryptu git-meld.pl tutaj: https://github.com/wmanley/git-meld

Następnie możesz po prostu biec

git meld
Ulf Adams
źródło
Właśnie nawiązałem kontakt z Cygwin, a teraz jest zepsuty. To naprawiło to. Dzięki! (Chociaż usunąłem tę --dir-diffporcję jako osobiste preferencje.)
PfunnyGuy,
3

W przypadku systemu Windows 10 musiałem umieścić to w moim .gitconfig:

[merge]
  tool = meld
[mergetool "meld"]
  cmd = 'C:/Program Files (x86)/Meld/Meld.exe' $LOCAL $BASE $REMOTE --output=$MERGED
[mergetool]
  prompt = false

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.

Jeremy Benks
źródło
1

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ą:

git config --global -e

Uwaga: jeśli wolisz Sublime Text 3 zamiast domyślnego Vima jako core ditor, możesz dodać to do pliku .gitconfig:

[core]
editor = 'c:/Program Files/Sublime Text 3/sublime_text.exe'

Następnie dodajesz zajazd Meld jako difftool

[diff]
tool = meld
guitool = meld 

[difftool "meld"]
cmd = \"C:/Program Files (x86)/Meld/Meld.exe\" \"$LOCAL\" \"$REMOTE\" --label \"DIFF 
(ORIGINAL MY)\"
prompt = false
path = C:\\Program Files (x86)\\Meld\\Meld.exe

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] :

showchanges = difftool --dir-diff

Aby pokazać zmiany, które wprowadziłem w kodzie, wprowadzam następujące polecenie:

git showchanges

Poniższy obraz pokazuje, jak ta opcja --dir-diff może wyświetlać listę zmienionych plików (przykład): Połącz pokazującą listę plików ze zmianami między $ LOCAL i $ REMOTE

Następnie można kliknąć każdy plik i wyświetlić zmiany w Meld.

Tore Aurstad
źródło
0

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:

[merge]
    tool = mymeld
    conflictstyle = diff3

[mergetool "mymeld"]
    cmd = meld --diff $BASE $REMOTE --diff $REMOTE $LOCAL --diff $LOCAL $MERGED

Wygląda dziwnie, ale oferuje bardzo wygodny przepływ pracy, przy użyciu trzech zakładek:

  1. na karcie 1 widać (od lewej do prawej) zmianę, którą należy wprowadzić na karcie 2, aby rozwiązać konflikt scalania.

  2. 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).

  3. 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:

  • nie edytuj niczego w zakładce 1
  • nie zapisuj niczego na karcie 2, ponieważ spowoduje to irytujące wyskakujące okienka na karcie 3
mnieber
źródło
Czy jest to lepsze niż łączenie trójstronne (lokalne / podstawowe / zdalne) w jednej zakładce?
André Werlang
@ AndréWerlang Zaletą 3-kierunkowego scalania w jednej zakładce jest to, że wystarczy poradzić sobie ze sprzecznymi zmianami (pozostałe zmiany są scalane automatycznie). Ale wolę „moje” podejście w przypadkach, gdy trudno jest zrozumieć w 3-kierunkowym scaleniu tego, co się zmieniło i jak połączyć w sposób, który zachowuje wszystkie zmiany. Jeśli w którymś momencie połączenie 3-kierunkowe mnie już nie myli, to mogę wrócić do niego.
mnieber
Jak zauważył użytkownik Mattst, $BASEzamiast $MERGEDrozpocząć scalanie można użyć
André Werlang,