Настройка и использование Meld в качестве git difftool и mergetool



хотя большая часть информации в этом вопросе и ответов доступен на сайте StackOverflow, он распространяется на множество страниц и среди других ответов, которые либо неверны, либо вводят в заблуждение. Мне потребовалось некоторое время, чтобы собрать воедино все, что я хотел знать.



есть много различных программ, которые могут быть использованы в качестве вашего git difftool и mergetool, и, конечно, нет единого мнения о том, что такое лучшие (мнений, требований и Операционки будут явно отличаться).



Meld-это популярный кросс-платформенный (UNIX/Linux, OSX, Windows) выбор, как показано в StackOverflow вопрос какой лучший инструмент визуального слияния для Git?, в котором ответ, предлагающий Meld, имеет более чем в 3 раза больше голосов, чем любой другой инструмент.



следующие 2 вопроса будут даны в моем ответе ниже:




  • Как настроить и использовать Meld в качестве моего git difftool?

  • Как настроить и использовать Meld в качестве моего git mergetool?


Примечание: не обязательно использовать ту же программу, что и ваш difftool и mergetool, для обоих могут быть установлены разные программы.

1325   6  

6 ответов:

как настроить и использовать Meld в качестве моего git difftool?

git difftool выводит результат сравнения, используя графический интерфейс программы просмотра различий (т. е. объединить), Вместо вывода diff в вашем терминале.

хотя вы можете установить программу GUI в командной строке с помощью -t <tool> / --tool=<tool> имеет смысл настроить его в вашем . [Примечание: см. разделы об экранировании кавычек и путей к окнам внизу.]

# 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, отображающее diff с помощью графического интерфейса.

порядок окон графического интерфейса Meld может управляться порядком $LOCAL и $REMOTE на cmd, то есть какой файл отображается в левой панели, а какой в правая панель. Если вы хотите, чтобы они наоборот просто поменять их примерно такой:

    cmd = meld "$REMOTE" "$LOCAL"

наконец-то prompt = false line просто останавливает git от запроса вас о том, хотите ли вы запустить Meld или нет, по умолчанию git выдаст приглашение.


как настроить и использовать Meld в качестве моего git mergetool?

git mergetool позволяет использовать программу слияния GUI (т. е. Meld) для разрешения конфликтов слияния, которые произошли во время слияния.

как difftool вы можете установить программу GUI в командной строке с помощью -t <tool> / --tool=<tool> но, как и раньше, имеет смысл настроить его в вашем . [Примечание: см. разделы об экранировании кавычек и путей к окнам внизу.]

# 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 файла. Каждый файл будет содержаться в отдельной панели его GUI взаимодействие.

пример .gitconfig запись выше, 2 строки предлагаются как [mergetool "meld"]cmd линии. На самом деле есть разные способы для опытных пользователей, чтобы настроить cmd строка, но это выходит за рамки этого ответа.

этот ответ имеет 2 альтернативы cmd линии, которые, между ними, будет обслуживать большинство пользователей, и будет хорошей отправной точкой для продвинутых пользователей, которые хотят взять инструмент на следующий уровень сложность.

во-первых, вот что означают параметры:

  • $LOCAL это файл в текущей ветке (например, мастер).
  • $REMOTE является ли файл в ветви объединяется (например, branch_name).
  • $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.

в любом случае Meld будет отображать 3 панели с $LOCAL и $REMOTE в левой и правой панели и либо $MERGED или $BASE в средней области.

в обоих случаях средняя панель-это файл, который вы должны измените, чтобы разрешить конфликты слияния. Разница только в том, в каком начальном положении редактирования вы предпочитаете; $MERGED для файла, который содержит частично объединенный файл с информацией о конфликте слияния или $BASE для общего предка фиксации $LOCAL и $REMOTE. [Так как оба cmd линии могут быть полезны я держу их обоих в моем . Большую часть времени я использую $MERGED линии и $BASE строка закомментирована, но комментирование может быть заменено, если я хочу используйте линии.]

после редактирования средней панели для разрешения конфликтов слияния просто сохраните файл и закройте окно слияния. Git сделает обновление автоматически, и файл в текущей ветке (например, master) теперь будет содержать все, что вы получили в средней панели.

git сделает резервную копию частично объединенного файла с информацией о конфликте слияния в нем, добавив .orig к исходному имени файла. например,file_name.orig. После проверка того, что вы довольны слиянием и запускаете любые тесты, которые вы можете сделать,.orig файл может быть удален.

теперь вы можете сделать фиксацию для фиксации изменений.

примечание: не волнуйтесь, что --output "$MERGED" используется cmd независимо от того, является ли $MERGED или $BASE использовался ранее в cmd линии. Элемент --output опция просто говорит Meld, какое имя файла git хочет, чтобы файл разрешения конфликтов был сохранен. Meld позаботится о том, чтобы ваш конфликтные изменения сохраняются в этом файле независимо от того, используете ли вы $MERGED или $BASE в качестве начальной точки редактирования.

если во время редактирования конфликтов слияния в Meld вы хотите отказаться от использования Meld, то закройте Meld без сохранения файла разрешения слияния в средней панели. ЖКТ будет реагировать с а потом спрашивают Was the merge successful? [y/n], если вы ответите n затем разрешение конфликта слияния будет прервано, и файл останется неизменным. Обратите внимание, что если вы сохранили файл в Meld в любой момент, то вы не получите предупреждение и приглашение от git. [Конечно, вы можете просто удалить файл и заменить его резервной копии .orig файл, который git сделал для вас.]

если у вас есть более 1 файла с конфликтами слияния, то git откроет новое окно Meld для каждого, один за другим, пока все они не будут сделаны. Они не будут открыты одновременно, но когда вы закончите редактирование конфликтов в одном и закроете Meld, git будет тогда откройте следующий и так далее, пока все конфликты слияния не будут разрешены.

было бы разумно создать фиктивный проект для проверки использования git mergetool перед использованием его на live. Обязательно используйте имя файла, содержащее пробел в вашем тесте, в случае, если ваша ОС требует, чтобы вы избегали кавычек в cmd линия, см. ниже.


экранирование символов цитата

некоторые операционные системы могут иметь кавычки в cmd убежал. Менее опытные пользователи должны помнить, что командные строки конфигурации должны быть протестированы с именами файлов, которые содержат пробелы, и если cmd строки не работают с именами файлов, которые включают пробелы, а затем пытаются избежать кавычек. например,

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

в некоторых случаях может потребоваться более сложное экранирование цитаты. 1-я из приведенных ниже ссылок пути Windows содержит пример тройного экранирования каждой цитаты. Это скучно, но иногда необходимо. например,

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

пути Windows

пользователям Windows, вероятно, потребуется дополнительная конфигурация, добавленная в Meld cmd строки. Возможно, им потребуется использовать полный путь к meldc, который предназначен для вызова Windows из командной строки, или они могут понадобиться или хотят использовать оболочку. Они должны прочитать StackOverflow страницы, связанные ниже, которые касаются установки правильного Meld cmd строка для Windows. Поскольку я пользователь Linux я не могу проверьте различные окна cmd строки и не имеют никакой дополнительной информации по этому вопросу, кроме как рекомендовать использовать мои примеры с добавлением полного пути к Meld или meldc, или добавление папки программы Meld в ваш path.

игнорируя конечные пробелы с Meld

Meld имеет ряд предпочтений, которые могут быть настроены в GUI.

в настройках Text Filters tab есть несколько полезных фильтров, чтобы игнорировать такие вещи, как комментарии при выполнении diff. Хотя есть фильтры, чтобы игнорировать All whitespace и Leading whitespace нет игнорировать Trailing whitespace фильтр (это было предложено в качестве дополнения в списке рассылки Meld, но недоступно в моей версии.)

игнорирование конечных пробелов часто очень полезно, особенно при совместной работе, и может быть легко добавлено вручную с помощью простого регулярного выражения в настройках Meld Text Filters tab.

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

я надеюсь, что это помогает всем.

в то время как другой ответ правильный, вот самый быстрый способ просто пойти вперед и настроить Meld в качестве визуального инструмента diff. Просто скопируйте / вставьте это:

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

теперь бегите git difftool в каталоге и Meld будет запущен для каждого отдельного файла.

Примечание: Meld удивительно медленно при сравнении файлов CSV, и ни один инструмент Linux diff, который я нашел, не быстрее, чем этот инструмент 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

вы можете проверить путь Meld с помощью этой команды:

which meld

Я предпочитаю настроить meld как отдельную команду, например:

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

это делает его похожим на git-meld.pl сценарий здесь: https://github.com/wmanley/git-meld

вы можете просто запустить

git meld

может быть сложно вычислить разницу в вашей голове из разных разделов в $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 от Meldmerge.org затем добавил следующее К моему глобальному .gitconfig с помощью:

git config --global -e

Примечание, Если вы скорее хотите Sublime Text 3 вместо Vim по умолчанию в качестве основного ditor, вы можете добавить это к.файл 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, внизу [псевдоним]:

showchanges = difftool --dir-diff

чтобы показать изменения, которые я внес в код, я просто введите следующую команду:

git showchanges

на следующем рисунке показано, как этот параметр --dir-diff может отображать список измененных файлов (пример): Meld showing list of files with changes between the $LOCAL and $REMOTE

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

Comments

    Ничего не найдено.