Настройка и использование 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 - это бесплатный инструмент с открытым исходным кодом. Вы увидите красивое параллельное сравнение файлов и каталогов на предмет любых изменений кода.

  1. Установите meld в свой Linux с помощью yum / apt.
  2. Добавьте следующую строку в свой файл ~ / .gitconfig
       [diff]
    tool = meld
  1. Перейдите в репозиторий кода и введите следующую команду, чтобы увидеть разницу между последними зафиксированными изменениями и текущим рабочим каталогом (неустановленные незавершенные изменения)

git difftool --dir-diff ./

  1. Чтобы увидеть разницу между последним зафиксированным кодом и поэтапным кодом, используйте следующую команду

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. на вкладке 1 вы видите (слева направо) изменение, которое вы должны внести на вкладке 2, чтобы разрешить конфликт слияния.

  2. в правой части вкладки 2 вы применяете "изменения, которые вы должны внести" и копируете все содержимое файла в буфер обмена (используя ctrl-a и ctrl-c).

  3. на вкладке 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, показывающий список файлов с изменениями между $ LOCAL и $ REMOTE

Затем можно нажать на каждый файл и показать изменения внутри Meld.

Не так много, чтобы добавить отличный ответ @mattst, кроме этого. Для людей, использующих подсистему Windows для Linux (WSL2), вы можете разрабатывать в Linux, но использовать Meld для Windows.

      cmd = "/mnt/c/Program Files (x86)/Meld/Meld.exe" "$LOCAL" "$REMOTE"

Одно предостережение: весь мой код находится на диске Windows, а не на виртуальном диске WLS2, поэтому YMMV.

Другие вопросы по тегам