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.
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.
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!.
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
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
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:
W karcie 1 widzisz (od lewej do prawej) zmianę, którą powinieneś wprowadzić w karcie 2, aby rozwiązać konflikt scalania.
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).
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
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):
Następnie można kliknąć na każdy plik i pokazać zmiany wewnątrz Meld.
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