Настройка и использование Meld в качестве вашего git difftool и mergetool
Хотя большая часть информации в этом вопросе и ответе доступна в Stackru, она разбросана по множеству страниц и среди других ответов, которые либо неверны, либо вводят в заблуждение. Мне понадобилось время, чтобы собрать воедино все, что я хотел знать.
Существует множество различных программ, которые можно использовать в качестве ваших git difftool и mergetool, и, безусловно, нет единого мнения относительно того, какой из них лучший (мнения, требования и операционные системы будут явно различаться).
Meld - это популярный кроссплатформенный (UNIX/Linux, OSX, Windows) вариант, как показано в вопросе Stackru. Какой лучший инструмент визуального слияния для Git?, в котором ответ на предложение Meld имеет более чем в 3 раза больше голосов, чем любой другой инструмент.
Следующие 2 вопроса будут даны ответы в моем ответе ниже:
- Как мне установить и использовать Meld в качестве моего git difftool?
- Как мне настроить и использовать Meld в качестве моего git mergetool?
Примечание. Нет необходимости использовать одну и ту же программу как для difftool, так и для mergetool, для обеих программ могут быть установлены разные программы.
9 ответов
Как мне установить и использовать Meld в качестве моего git difftool?
git difftool отображает diff, используя программу сравнения GUI (т.е. Meld) вместо отображения результатов diff на вашем терминале.
Хотя вы можете установить программу с графическим интерфейсом в командной строке, используя -t <tool> / --tool=<tool>
имеет смысл настроить его в своем .gitconfig
файл. [Примечание: см. Разделы об экранировании кавычек и путей Windows внизу.]
# Add the following to your .gitconfig file.
[diff]
tool = meld
[difftool]
prompt = false
[difftool "meld"]
cmd = meld "$LOCAL" "$REMOTE"
[Примечание: эти настройки не изменят поведение git diff
который продолжит функционировать как обычно.]
Ты используешь git difftool
точно так же, как вы используете git diff
, например
git difftool <COMMIT_HASH> file_name
git difftool <BRANCH_NAME> file_name
git difftool <COMMIT_HASH_1> <COMMIT_HASH_2> file_name
При правильной настройке откроется окно Meld с отображением различий с использованием интерфейса GUI.
Порядок оконных окон Meld GUI можно контролировать по порядку $LOCAL
а также $REMOTE
в cmd
то есть, какой файл показан на левой панели, а какой на правой панели. Если вы хотите их наоборот, просто поменяйте их местами так:
cmd = meld "$REMOTE" "$LOCAL"
Наконец то prompt = false
line просто останавливает git от подсказки, хотите ли вы запустить Meld или нет, по умолчанию git выдаст приглашение.
Как мне настроить и использовать Meld в качестве моего git mergetool?
git mergetool позволяет вам использовать программу слияния GUI (например, Meld) для разрешения конфликтов слияния, возникших во время слияния.
Как и difftool, вы можете установить программу с графическим интерфейсом в командной строке, используя -t <tool> / --tool=<tool>
но, как и прежде, имеет смысл настроить его в своем .gitconfig
файл. [Примечание: см. Разделы об экранировании кавычек и путей Windows внизу.]
# 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"
Вы НЕ используете git mergetool
выполнить фактическое слияние. Перед использованием git mergetool
вы выполняете слияние обычным способом с помощью git. например
git checkout master
git merge branch_name
Если есть конфликт слияния, git отобразит что-то вроде этого:
$ 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.
С этой точки зрения file_name
будет содержать частично слитый файл с информацией о конфликте слияния (это файл со всеми >>>>>>>
а также <<<<<<<
записи в нем).
Mergetool теперь можно использовать для разрешения конфликтов слияния. Вы начинаете это очень легко с:
git mergetool
При правильной настройке откроется окно Meld, отображающее 3 файла. Каждый файл будет содержаться в отдельной панели своего графического интерфейса.
В примере .gitconfig
запись выше, в качестве [mergetool "meld"]
cmd
линия. На самом деле, для продвинутых пользователей существует множество способов настройки cmd
линия, но это выходит за рамки этого ответа.
Этот ответ имеет 2 альтернативы cmd
линии, которые между ними будут обслуживать большинство пользователей, и будут хорошей отправной точкой для опытных пользователей, которые хотят вывести инструмент на новый уровень сложности.
Во-первых, вот что означают параметры:
$LOCAL
это файл в текущей ветке (например, master).$REMOTE
является файлом в объединяемой ветви (например, имя_в ветви).$MERGED
является частично слитым файлом с информацией о конфликте слияния.$BASE
предок общего коммита$LOCAL
а также$REMOTE
, это так сказать файл, как это было, когда ветвь, содержащая$REMOTE
был изначально создан.
Я предлагаю вам использовать либо:
[mergetool "meld"]
cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
или же:
[mergetool "meld"]
cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"
Выбор стоит ли использовать $MERGED
или же $BASE
между $LOCAL
а также $REMOTE
,
В любом случае Мелд покажет 3 панели с $LOCAL
а также $REMOTE
в левой и правой панелях и либо $MERGED
или же $BASE
в средней панели.
В обоих случаях средняя панель - это файл, который вы должны отредактировать для разрешения конфликтов слияния. Разница лишь в том, какую начальную позицию редактирования вы бы предпочли; $MERGED
для файла, который содержит частично объединенный файл с информацией о конфликте объединения или $BASE
для общего предка коммит $LOCAL
а также $REMOTE
, [Поскольку оба cmd
линии могут быть полезны, я держу их обоих в моем .gitconfig
файл. Большую часть времени я использую $MERGED
линия и $BASE
строка закомментирована, но комментирование можно поменять местами, если я хочу использовать $BASE
линия вместо.]
После редактирования средней панели для разрешения конфликтов слияния просто сохраните файл и закройте окно Meld. Git выполнит обновление автоматически, и файл в текущей ветке (например, master) теперь будет содержать все, что у вас получилось в средней панели.
git сделает резервную копию частично слитого файла с информацией о конфликте слияния в нем, добавив .orig
к исходному имени файла. например file_name.orig
, После проверки того, что вы удовлетворены слиянием и выполнением любых тестов, которые вы можете выполнить, .orig
файл может быть удален.
На данный момент вы можете сделать коммит, чтобы зафиксировать изменения.
ПРИМЕЧАНИЕ: не волнуйтесь, что --output "$MERGED"
используется в cmd
несмотря на погоду $MERGED
или же $BASE
был использован ранее в cmd
линия. --output
опция просто сообщает Meld, в каком имени файла git хочет сохранить файл разрешения конфликта. Meld позаботится о том, чтобы ваши изменения конфликта были сохранены в этом файле независимо от того, используете ли вы $MERGED
или же $BASE
как ваша начальная точка редактирования.
Если во время редактирования конфликтов слияния в Meld вы хотите отказаться от использования Meld, выйдите из Meld, не сохраняя файл разрешения слияния в средней панели. Git ответит сообщением file_name seems unchanged
а затем спросите Was the merge successful? [y/n]
, если вы ответите n
тогда разрешение конфликта слияния будет прервано, а файл останется без изменений. Обратите внимание, что если вы сохранили файл в Meld в любой момент, вы не получите предупреждение и подсказку от git. [Конечно, вы можете просто удалить файл и заменить его резервной копией .orig
файл, который Git сделал для вас.]
Если у вас есть более 1 файла с конфликтами слияния, то git откроет новое окно Meld для каждого, одно за другим, пока они все не будут завершены. Не все они будут открыты одновременно, но когда вы закончите редактировать конфликты в одном и закроете Meld, git откроет следующий и так далее, пока все конфликты слияния не будут разрешены.
Было бы разумно создать фиктивный проект для проверки использования git mergetool
перед использованием его в живом проекте. Обязательно используйте имя файла, содержащее пробел в вашем тесте, на случай, если ваша ОС требует экранирования кавычек в cmd
линия, см. ниже.
Экранирующие символы цитаты
Некоторые операционные системы могут иметь кавычки в cmd
убежали. Менее опытные пользователи должны помнить, что командные строки конфигурации должны быть проверены с именами файлов, которые включают пробелы, и если cmd
строки не работают с именами файлов, которые содержат пробелы, затем попробуйте экранировать кавычки. например
cmd = meld \"$LOCAL\" \"$REMOTE\"
В некоторых случаях может потребоваться более сложное экранирование кавычек. Первая из ссылок пути Windows ниже содержит пример тройного экранирования каждой кавычки. Это зануда, но иногда необходимо. например
cmd = meld \\\"$LOCAL\\\" \\\"$REMOTE\\\"
Пути Windows
Пользователям Windows, вероятно, понадобится дополнительная настройка, добавленная в Meld cmd
линий. Возможно, им придется использовать полный путь к meldc
, который предназначен для вызова в Windows из командной строки, или они могут нуждаться или хотят использовать оболочку. Они должны прочитать страницы Stackru, ссылки на которые приведены ниже, посвященные настройке правильного Meld cmd
Линия для Windows. Так как я пользователь Linux, я не могу тестировать различные Windows cmd
линий и не имеют никакой дополнительной информации по этому вопросу, кроме как рекомендовать использовать мои примеры с добавлением полного пути к Meld или meldc
или добавив папку программы Meld в ваш path
,
Игнорирование конечных пробелов с Мелдом
У Meld есть ряд параметров, которые можно настроить в графическом интерфейсе.
В настройках Text Filters
На вкладке есть несколько полезных фильтров, позволяющих игнорировать такие вещи, как комментарии, при выполнении сравнения. Хотя есть фильтры, которые нужно игнорировать All whitespace
а также Leading whitespace
Нельзя игнорировать Trailing whitespace
фильтр (это было предложено в качестве дополнения в списке рассылки Meld, но недоступно в моей версии).
Игнорирование конечных пробелов часто очень полезно, особенно при совместной работе, и может быть легко добавлено вручную с помощью простого регулярного выражения в настройках Meld. Text Filters
Вкладка.
# Use either of these regexes depending on how comprehensive you want it to be.
[ \t]*$
[ \t\r\f\v]*$
Я надеюсь, что это помогает всем.
Хотя другой ответ правильный, вот самый быстрый способ просто настроить Meld в качестве инструмента визуального сравнения. Просто скопируйте / вставьте это:
git config --global diff.tool meld
git config --global difftool.prompt false
Теперь беги git difftool
в каталоге и Meld будет запущен для каждого отдельного файла.
Примечание: Мелд удивительно медленно сравнивает CSV-файлы, и ни один инструмент сравнения Linux, который я обнаружил, не работает быстрее, чем этот инструмент Windows-версии 2009 года под названием CompareIt!.
Для Windows. Запустите эти команды в 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
(Обновите путь к файлу для Meld.exe, если у вас другой.)
Для Linux. Запустите эти команды в 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
Вы можете проверить путь Мелда, используя эту команду:
which meld
Я предпочитаю настраивать объединение как отдельную команду, например так:
git config --global alias.meld '!git difftool -t meld --dir-diff'
Это делает его похожим на скрипт git-meld.pl здесь: https://github.com/wmanley/git-meld
Вы можете просто запустить
git meld
Для Windows 10 поместите это в ваш.gitconfig:
[merge]
tool = meld
[mergetool "meld"]
cmd = 'C:/Program Files (x86)/Meld/Meld.exe' $LOCAL $BASE $REMOTE --output=$MERGED
[mergetool]
prompt = false
Все остальное, что вам нужно знать, написано в этом супер ответе Mattst далее выше.
PS: Почему-то это работало только с Meld 3.18.x, Meld 3.20.x выдает ошибку.
Я следую этой простой настройке с помощью meld. Meld - это бесплатный инструмент с открытым исходным кодом. Вы увидите красивое параллельное сравнение файлов и каталогов на предмет любых изменений кода.
- Установите meld в свой Linux с помощью yum / apt.
- Добавьте следующую строку в свой файл ~ / .gitconfig
[diff] tool = meld
- Перейдите в репозиторий кода и введите следующую команду, чтобы увидеть разницу между последними зафиксированными изменениями и текущим рабочим каталогом (неустановленные незавершенные изменения)
git difftool --dir-diff ./
- Чтобы увидеть разницу между последним зафиксированным кодом и поэтапным кодом, используйте следующую команду
git difftool --cached --dir-diff ./
Может быть сложно вычислить diff в вашей голове из различных разделов в $MERGED и применить это. В моей настройке meld помогает, показывая вам эти различия визуально, используя:
[merge]
tool = mymeld
conflictstyle = diff3
[mergetool "mymeld"]
cmd = meld --diff $BASE $REMOTE --diff $REMOTE $LOCAL --diff $LOCAL $MERGED
Это выглядит странно, но предлагает очень удобный рабочий процесс, используя три вкладки:
на вкладке 1 вы видите (слева направо) изменение, которое вы должны внести на вкладке 2, чтобы разрешить конфликт слияния.
в правой части вкладки 2 вы применяете "изменения, которые вы должны внести" и копируете все содержимое файла в буфер обмена (используя ctrl-a и ctrl-c).
на вкладке 3 замените правую сторону содержимым буфера обмена. Если все правильно, теперь вы увидите - слева направо - то же самое изменение, как показано на вкладке 1 (но в других контекстах). Сохраните изменения, сделанные на этой вкладке.
Заметки:
- не редактируйте ничего на вкладке 1
- не сохраняйте ничего на вкладке 2, потому что это приведет к раздражающим всплывающим окнам на вкладке 3
Это ответ, ориентированный в первую очередь на разработчиков, использующих Windows, поскольку синтаксис пути инструмента diff отличается от других платформ.
Я использую Kdiff3 в качестве git mergetool, но чтобы настроить git difftool как Meld, я сначала установил последнюю версию Meld из http://meldmerge.org/ затем добавил следующее в мой глобальный.gitconfig, используя:
git config --global -e
Обратите внимание, что если вы предпочитаете Sublime Text 3 вместо Vim по умолчанию в качестве основного редактора, вы можете добавить его в файл.gitconfig:
[core]
editor = 'c:/Program Files/Sublime Text 3/sublime_text.exe'
Затем вы добавляете Inn Meld в качестве 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
Обратите внимание на косую черту в cmd выше, в Windows это необходимо.
Также можно настроить псевдоним для отображения текущего git diff с параметром --dir-diff. Это выведет список измененных файлов в Meld, что удобно, когда вы изменили несколько файлов (действительно очень распространенный сценарий).
Псевдоним выглядит так внутри файла.gitconfig, под разделом [alias]:
showchanges = difftool --dir-diff
Чтобы показать изменения, внесенные в код, я просто введите следующую команду:
git showchanges
На следующем рисунке показано, как эта опция --dir-diff может отображать список измененных файлов (пример):
Затем можно нажать на каждый файл и показать изменения внутри Meld.
Не так много, чтобы добавить отличный ответ @mattst, кроме этого. Для людей, использующих подсистему Windows для Linux (WSL2), вы можете разрабатывать в Linux, но использовать Meld для Windows.
cmd = "/mnt/c/Program Files (x86)/Meld/Meld.exe" "$LOCAL" "$REMOTE"
Одно предостережение: весь мой код находится на диске Windows, а не на виртуальном диске WLS2, поэтому YMMV.