Настройка и использование 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, для обоих могут быть установлены разные программы.
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 = falseline просто останавливает 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 страницы, связанные ниже, которые касаются установки правильного Meldcmdстрока для Windows. Поскольку я пользователь Linux я не могу проверьте различные окнаcmdстроки и не имеют никакой дополнительной информации по этому вопросу, кроме как рекомендовать использовать мои примеры с добавлением полного пути к Meld илиmeldc, или добавление папки программы Meld в вашpath.игнорируя конечные пробелы с Meld
Meld имеет ряд предпочтений, которые могут быть настроены в GUI.
в настройках
Text Filterstab есть несколько полезных фильтров, чтобы игнорировать такие вещи, как комментарии при выполнении diff. Хотя есть фильтры, чтобы игнорироватьAll whitespaceиLeading whitespaceнет игнорироватьTrailing whitespaceфильтр (это было предложено в качестве дополнения в списке рассылки Meld, но недоступно в моей версии.)игнорирование конечных пробелов часто очень полезно, особенно при совместной работе, и может быть легко добавлено вручную с помощью простого регулярного выражения в настройках Meld
Text Filterstab.# 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 вы видите (слева направо) изменение, которое вы должны сделать на вкладке 2, чтобы решить конфликт слияния.
в правой части вкладки 2 установки "изменить, что вы должны сделать" и скопировать все содержимое файла в буфер обмена (с помощью ctrl-a и ctrl-c).
на вкладке 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.

Comments