Konfigurowanie i używanie Meld jako git difftool i mergetool

Chociaż wiele informacji zawartych w tym pytaniu i odpowiedzi jest dostępnych na StackOverflow, jest ono rozłożone na wiele stron i wśród innych odpowiedzi, które są błędne lub wprowadzające w błąd. Trochę Zajęło mi ułożenie wszystkiego, co chciałem wiedzieć.

Istnieje wiele różnych programów, które mogą być używane jako git difftool i mergetool, i z pewnością nie ma konsensusu co do tego, który jest najlepszy (opinie, wymagania i osy będą wyraźnie widoczne different).

Meld jest popularnym wieloplatformowym wyborem (UNIX/Linux, OSX, Windows), jak pokazano w pytaniu StackOverflow , Jakie jest najlepsze narzędzie do scalania wizualnego Dla Gita?, w którym odpowiedź proponująca Meld ma ponad 3 razy więcej głosów niż każde inne narzędzie.

Na poniższe 2 pytania odpowiemy w mojej Odpowiedzi poniżej:

  • Jak skonfigurować i używać Meld jako git difftool?
  • Jak skonfigurować i używać Meld jako mojego Gita mergetool?

Uwaga: nie jest konieczne używanie tego samego programu co difftool i mergetool, różne programy mogą być ustawione dla obu.

 128
Author: Community, 2015-12-06

6 answers

Jak skonfigurować i używać Meld jako git difftool?

Git difftool wyświetla różnice używając programu RÓŻNICUJĄCEGO GUI (np. Meld)zamiast wyświetlania danych wyjściowych różnic w terminalu.

Chociaż można ustawić program GUI w linii poleceń za pomocą -t <tool> / --tool=<tool>, bardziej sensowne jest skonfigurowanie go w pliku .gitconfig. [Uwaga: zobacz sekcje o cudzysłowach specjalnych i ścieżkach okien na dole.]

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

[Uwaga: ustawienia te nie zmienią zachowania z git diff, który będzie działał jak zwykle.]

Używasz git difftool dokładnie tak samo jak używasz git diff. np.

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

Jeśli zostanie poprawnie skonfigurowane, otworzy się okno Meld wyświetlające różnice przy użyciu interfejsu GUI.

Kolejność okien interfejsu graficznego Meld może być kontrolowana przez kolejność $LOCAL i $REMOTE w cmd, to znaczy, który plik jest wyświetlany w lewym okienku, a który w prawym. Jeśli chcesz, aby były na odwrót, po prostu wymień je tak:

    cmd = meld "$REMOTE" "$LOCAL"

W końcu linia prompt = false po prostu zatrzymuje git przed pytaniem, czy chcesz uruchomić Meld, czy nie, domyślnie git wystawi monit.


Jak skonfigurować i używać Meld jako git mergetool?

Git mergetool pozwala na użycie programu scalającego 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 linii poleceń używając -t <tool> / --tool=<tool> ale, jako wcześniej bardziej sensowne jest skonfigurowanie go w pliku .gitconfig. [Uwaga: zobacz sekcje o cudzysłowach specjalnych i ścieżkach okien na dole.]

# 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 mergetool do wykonania rzeczywistego połączenia. Przed użyciem git mergetool wykonujesz merge w zwykły sposób z Gitem. np.

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_name będzie zawierać częściowo scalony Plik z informacją o konflikcie scalania (to plik ze wszystkimi wpisami >>>>>>> i <<<<<<<).

Mergetool może być teraz używany do rozwiązywania konfliktów scalania. Zaczynasz bardzo łatwo z:

git mergetool

Jeśli poprawnie skonfigurowane zostanie okno Meld wyświetlające 3 pliki. Każdy plik będzie zawarty w osobnym okienku interfejsu GUI.

W przykładzie .gitconfig powyżej, 2 linie są sugerowane jako [mergetool "meld"] cmd Kolejka W rzeczywistości istnieją różne sposoby dla zaawansowanych użytkowników, aby skonfigurować linię cmd, ale to wykracza poza zakres tej odpowiedzi.

Ta odpowiedź ma 2 alternatywne linie cmd, 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 oto co oznaczają parametry:

  • $LOCAL jest plikiem w bieżącej gałęzi (np. master).
  • $REMOTE jest plikiem w gałęzi, który jest scalany (np. nazwa gałęzi).
  • $MERGED jest częściowo scalonym plikiem z zawartą w nim informacją o konflikcie scalania.
  • $BASE jest współdzielonym przodkiem commitów $LOCAL i $REMOTE, to znaczy, że plik jest taki, jaki był, gdy gałąź zawierająca $REMOTE została pierwotnie utworzona.

Proponuję użyć albo:

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

Lub:

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

Wybór polega na tym, czy użyć $MERGED czy $BASE pomiędzy $LOCAL A $REMOTE.

Tak czy inaczej Meld wyświetli 3 panele z $LOCAL i $REMOTE po lewej i prawa szyba i $MERGED lub $BASE w środkowej szybie.

W obu przypadkach środkowy panel jest plikiem, który należy edytować, aby rozwiązać konflikty scalania. Różnica polega tylko na tym, w której początkowej pozycji edycji wolisz; $MERGED dla pliku, który zawiera częściowo scalony Plik z informacjami o konflikcie scalania lub $BASE dla wspólnego przodka commitów $LOCAL i $REMOTE. [Ponieważ obie linie cmd mogą być przydatne, przechowuję je w moim pliku .gitconfig. Większość czasu używam $MERGED linia i {[36] } linia jest komentowana, ale komentowanie może zostać zamienione, jeśli chcę zamiast tego użyć linii $BASE.]

Po edycji środkowego panelu, aby rozwiązać konflikty 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ł to, co znalazłeś w środkowym okienku.

Git zrobi kopię zapasową częściowo scalonego pliku z merge informacje o konflikcie w nim poprzez dodanie .orig do oryginalnej nazwy pliku. np. file_name.orig. Po sprawdzeniu, czy jesteś zadowolony z połączenia i uruchomieniu jakichkolwiek testów, które chcesz wykonać, plik .orig może zostać usunięty.

W tym momencie możesz wykonać commit, aby zatwierdzić zmiany.

Uwaga: nie martw się, że {[60] } jest używany w cmd niezależnie od tego, czy $MERGED lub $BASE był używany wcześniej w linii cmd. Opcja --output po prostu informuje Meld, jaką nazwę pliku git chce mieć konflikt plik rozdzielczości do zapisania. Meld upewni się, że edycje konfliktu zostaną zapisane w tym pliku niezależnie od tego, czy używasz $MERGED czy $BASE jako początkowego punktu edycji.

Jeśli podczas edycji konfliktów scalania w programie Meld chcesz zrezygnować z użycia programu Meld, zamknij program Meld bez zapisywania pliku rozdzielczości scalania w środkowym okienku. git odpowie Komunikatem file_name seems unchanged, a następnie zapyta Was the merge successful? [y/n], jeśli odpowiesz {[70] } wtedy rozwiązanie konfliktu scalania zostanie przerwane i plik pozostanie niezmieniony. Zauważ, że jeśli w dowolnym momencie zapisałeś plik w Meld, nie otrzymasz ostrzeżenia i monitu od git. [Oczywiście możesz po prostu usunąć plik i zastąpić go plikiem kopii zapasowej .orig stworzonym dla ciebie przez git.]

Jeśli masz więcej niż 1 Plik z konfliktami scalania, git otworzy nowe okno meldowania dla każdego, jeden po drugim, dopóki wszystkie nie zostaną zakończone. Nie wszystkie zostaną otwarte w tym samym czasie, ale po zakończeniu edycji konfliktów w jednym, i zamknij Meld, git otworzy następny, i tak dalej, dopóki wszystkie konflikty scalenia nie zostaną rozwiązane.

Rozsądne byłoby stworzenie atrapy projektu, aby przetestować użycie git mergetool przed użyciem go naNA ŻYWO . Pamiętaj, aby używać nazwy pliku zawierającej spację w teście, na wypadek, gdyby Twój system operacyjny wymagał ucieczki cudzysłowów w linii cmd, patrz poniżej.


Unikanie znaków cytatu

Niektóre systemy operacyjne mogą potrzebować cudzysłowów w cmd uciekł. Mniej doświadczeni użytkownicy powinni pamiętać, że linie komend konfiguracyjnych powinny być testowane z nazwami plików zawierającymi spacje, a jeśli linie cmd nie działają z nazwami plików zawierającymi spacje, spróbuj usunąć cudzysłowy. np.

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

W niektórych przypadkach może być potrzebna bardziej złożona Ucieczka cytatów. 1. z poniższych linków do ścieżki Windows zawiera przykład potrójnej ucieczki każdego cytatu. To nudne, ale czasami konieczne. np.

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

Okna ścieżki

Użytkownicy systemu Windows będą prawdopodobnie potrzebować dodatkowej konfiguracji dodanej do linii Meld cmd. Może być konieczne użycie pełnej ścieżki do meldc, która jest przeznaczona do wywoływania w systemie Windows z wiersza poleceń, lub może być konieczne lub chcieć użyć wrappera. Powinni przeczytać strony StackOverflow , pod którymi znajdują się linki dotyczące ustawiania właściwej linii Meld cmd dla systemu Windows. Ponieważ jestem użytkownikiem Linuksa, nie jestem w stanie przetestować różnych linii Windows cmd i nie mam więcej informacje na ten temat inne niż zalecane użycie moich przykładów z dodaniem pełnej ścieżki do Meld lub meldc, lub dodanie folderu programu Meld do path.

Ignorowanie ciągłych białych spacji za pomocą Meld

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

W zakładce Preferencje Text Filters Znajduje się kilka przydatnych filtrów do ignorowania komentarzy podczas wykonywania różnic. Chociaż istnieją filtry do ignorowania All whitespace i Leading whitespace, nie ma filtra ignorowania Trailing whitespace (został on zasugerowany jako dodatek na liście dyskusyjnej Meld, ale nie jest dostępny w mojej wersji).

Ignorowanie końcowych spacji jest często bardzo przydatne, szczególnie podczas współpracy. można je łatwo dodać ręcznie za pomocą prostego wyrażenia regularnego w Meld preferences Text Filters tab.

# 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.
 247
Author: mattst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-02 11:24:43

Podczas gdy druga odpowiedź jest poprawna, oto najszybszy sposób na skonfigurowanie Meld jako wizualnego narzędzia różnicującego. Po prostu skopiuj/wklej to:

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

Teraz uruchom git difftool w katalogu i Meld zostanie uruchomiony dla każdego innego pliku.

Uwaga na marginesie: Meld jest zaskakująco powolny w porównywaniu plików CSV, a żadne narzędzie do różnicowania Linuksa, które znalazłem, nie jest szybsze niż to narzędzie Windows z 2009 roku o nazwie CompareIt!.

 48
Author: Dan Dascalescu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-06 07:10:44

Dla Windows . Uruchom te 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 Linuksa . Uruchom te 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ę Meld używając tego polecenia:

which meld
 33
Author: MarredCheese,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-06 15:02:39

Wolę ustawić meld jako osobne polecenie, TAK:

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

To sprawia, że jest podobny do git-meld.pl skrypt tutaj: https://github.com/wmanley/git-meld

Możesz po prostu uruchomić

git meld
 13
Author: Ulf Adams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-19 11:08:19

Może być skomplikowane obliczenie różnicy w głowie z różnych sekcji w $ MERGED i zastosowanie tego. W mojej konfiguracji meld pomaga, pokazując wizualnie te diffy, 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, za pomocą trzech zakładek:

  1. W karcie 1 widzisz (od lewej do prawej) zmianę, którą powinieneś wprowadzić w karcie 2, aby rozwiązać konflikt scalania.

  2. Po prawej stronie Zakładki 2 znajduje się " zmiana, którą należy wprowadzić" i skopiować całą zawartość pliku do schowka (za pomocą ctrl-A i Ctrl-C).

  3. W zakładce 3 zastąp prawą stronę zawartością schowka. Jeśli wszystko jest poprawne, zobaczysz teraz - Od lewej do prawej-tę samą zmianę, Jak pokazano w karcie 1 (ale z różnymi kontekstami). Zapisz zmiany wprowadzone na tej karcie.

Uwagi:

  • nie edytuj niczego w zakładce 1
  • nie zapisuj niczego w karcie 2, ponieważ spowoduje to irytujące wyskakujące okienka w karcie 3
 0
Author: mnieber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-12 22:05:45

Jest to odpowiedź skierowana przede wszystkim do programistów korzystających z systemu Windows, jako składnia ścieżki narzędzia diff różni się od innych platform.

Używam Kdiff3 jako git mergetool, ale aby skonfigurować git difftool jako Meld, najpierw zainstalowano najnowszą wersję Meld z Meldmerge.org następnie dodano następujące do mojego globalnego .gitconfig using:

git config --global -e

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

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

Następnie dodajemy inn 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

Zwróć uwagę na ukośnik wiodący w cmd powyżej, w Windows jest to konieczne.

Możliwe jest również skonfigurowanie aliasu, aby wyświetlał bieżący git diff za pomocą --dir-diff opcja. Spowoduje to listę zmienionych plików wewnątrz Meld, co jest przydatne, gdy zmienisz wiele plików(bardzo powszechny scenariusz).

Alias wygląda tak w środku .plik gitconfig, pod [alias] Sekcja:

showchanges = difftool --dir-diff

Aby pokazać wprowadzone przeze mnie zmiany w kodzie wystarczy wpisać następujące polecenie:

git showchanges

Poniższy obrazek pokazuje, w jaki sposób opcja --dir-diff może wyświetlać listę zmienionych plików (przykład): Meld pokazuje listę plików ze zmianami pomiędzy $LOCAL i $REMOTE

Następnie można kliknąć na każdy plik i pokazać zmiany wewnątrz Meld.

 0
Author: Tore Aurstad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-24 15:14:08