Хотя большая часть информации в этом вопросе и ответе доступна в StackOverflow , она разбросана по множеству страниц и среди других ответов, которые либо неверны, либо вводят в заблуждение. Мне потребовалось некоторое время, чтобы собрать воедино все, что я хотел знать.
Существует множество различных программ, которые можно использовать в качестве ваших git difftool и mergetool, и, безусловно, нет единого мнения относительно того, какой из них лучший (мнения, требования и операционные системы будут явно различаться).
Meld - это популярный бесплатный кроссплатформенный вариант с открытым исходным кодом (UNIX / Linux, OSX, Windows), как показано в вопросе StackOverflow. Какой лучший инструмент визуального слияния для Git? , в котором ответ на предложение Meld имеет более чем в 3 раза больше голосов, чем любой другой инструмент.
Следующие 2 вопроса будут даны ответы в моем ответе ниже:
- Как мне настроить и использовать Meld в качестве моего git difftool?
- Как мне настроить и использовать Meld в качестве моего git mergetool?
Примечание. Нет необходимости использовать одну и ту же программу как для difftool, так и для mergetool, для обоих можно установить разные программы.
Ответы:
Как мне настроить и использовать Meld в качестве моего git difftool?
git difftool отображает diff, используя программу сравнения GUI (т.е. Meld) вместо отображения результатов diff на вашем терминале.
Хотя вы можете установить программу с графическим интерфейсом в командной строке,
-t <tool> / --tool=<tool>
имеет больше смысла настраивать ее в своем.gitconfig
файле. [Примечание: см. Разделы об экранировании кавычек и путей Windows внизу.][Примечание: эти настройки не изменят поведение,
git diff
которое продолжит функционировать как обычно.]Вы используете
git difftool
точно так же, как вы используетеgit diff
. напримерПри правильной настройке окно Meld откроет отображение различий с использованием интерфейса GUI.
Порядок оконных окон Meld GUI может управляться порядком
$LOCAL
и$REMOTE
вcmd
, то есть, какой файл отображается на левой панели, а какой - на правой. Если вы хотите их наоборот, просто поменяйте их местами так:Наконец,
prompt = false
строка просто не дает git подсказывать вам, хотите ли вы запустить Meld или нет, по умолчанию git выдаст приглашение.Как мне настроить и использовать Meld в качестве моего git mergetool?
git mergetool позволяет вам использовать программу слияния GUI (например, Meld) для разрешения конфликтов слияния, возникших во время слияния.
Как и difftool, вы можете установить программу с графическим интерфейсом в командной строке, используя,
-t <tool> / --tool=<tool>
но, как и прежде, имеет смысл настроить ее в своем.gitconfig
файле. [Примечание: см. Разделы об экранировании кавычек и путей Windows внизу.]Вы НЕ используете
git mergetool
для фактического слияния. Перед использованиемgit mergetool
вы выполняете слияние обычным способом с помощью git. напримерЕсли есть конфликт слияния, git отобразит что-то вроде этого:
На этом этапе
file_name
будет содержаться частично слитый файл с информацией о конфликте слияния (это файл со всеми записями>>>>>>>
и и<<<<<<<
в нем).Mergetool теперь можно использовать для разрешения конфликтов слияния. Вы начинаете это очень легко с:
При правильной настройке откроется окно Meld с отображением 3 файлов. Каждый файл будет содержаться в отдельной панели своего графического интерфейса.
В приведенном
.gitconfig
выше примере в качестве строки предлагается 2 строки[mergetool "meld"]
cmd
. На самом деле у опытных пользователей есть все способы настройкиcmd
линии, но это выходит за рамки этого ответа.Этот ответ имеет 2 альтернативные
cmd
линии, которые между ними будут ориентированы на большинство пользователей и станут хорошей отправной точкой для опытных пользователей, которые хотят поднять инструмент на новый уровень сложности.Во-первых, вот что означают параметры:
$LOCAL
это файл в текущей ветке (например, master).$REMOTE
это файл в объединяемой ветке (например, имя_в ветви).$MERGED
является частично слитым файлом с информацией о конфликте слияния.$BASE
является предком общего коммита$LOCAL
и$REMOTE
, то есть файл, каким он был, когда$REMOTE
изначально создавалась содержащая ветвь .Я предлагаю вам использовать либо:
или:
Выбор - использовать
$MERGED
или$BASE
между$LOCAL
и$REMOTE
.В любом случае Meld будет отображать 3 панели с
$LOCAL
и$REMOTE
в левой и правой панели и либо$MERGED
или$BASE
в средней панели.В обоих случаях средняя панель - это файл, который вы должны отредактировать для разрешения конфликтов слияния. Разница лишь в том, какую начальную позицию редактирования вы бы предпочли;
$MERGED
для файла, который содержит частично слитый файл с информацией о конфликте слияния или$BASE
для предка общего коммита$LOCAL
и$REMOTE
. [Поскольку обеcmd
строки могут быть полезны, я храню их в своем.gitconfig
файле. Большую часть времени я использую$MERGED
строку, и$BASE
строка закомментирована, но закомментирование можно поменять местами, если я хочу использовать$BASE
строку вместо этого.]Note On Output File: Не волнуйтесь , что
--output "$MERGED"
используется вcmd
независимо от того ,$MERGED
или$BASE
использовался ранее вcmd
линии.--output
Вариант просто говорит оплавления , что имя файла мерзавец хочет файл разрешения конфликтов будет сохранен в. Meld сохранит ваши конфликтные изменения в этом файле , независимо от того, используете ли вы$MERGED
или в$BASE
качестве отправной точки для редактирования.После редактирования средней панели для разрешения конфликтов слияния просто сохраните файл и закройте окно Meld. Git выполнит обновление автоматически, и файл в текущей ветке (например, master) теперь будет содержать все, что у вас получилось в средней панели.
git сделает резервную копию частично слитого файла с информацией о конфликте слияний, добавив
.orig
к исходному имени файла. напримерfile_name.orig
. После проверки того, что вы удовлетворены слиянием, и запуска любых тестов, которые вы можете выполнить,.orig
файл можно удалить.На данный момент вы можете сделать коммит, чтобы зафиксировать изменения.
Если во время редактирования конфликтов слияния в Meld вы хотите отказаться от использования Meld, выйдите из Meld, не сохраняя файл разрешения слияния в средней панели. git ответит сообщением
file_name seems unchanged
и затем спроситWas the merge successful? [y/n]
, если вы ответите,n
разрешение конфликта слияния будет прервано и файл останется без изменений. Обратите внимание, что если вы сохранили файл в Meld в любой момент, вы не получите предупреждение и подсказку от git. [Конечно, вы можете просто удалить файл и заменить его.orig
файлом резервной копии , созданным для вас.]Если у вас есть более 1 файла с конфликтами слияния, то git откроет новое окно Meld для каждого, одно за другим, пока они не будут завершены. Не все они будут открыты одновременно, но когда вы закончите редактировать конфликты в одном и закроете Meld, git откроет следующий и так далее, пока все конфликты слияния не будут разрешены.
Было бы разумно создать фиктивный проект, чтобы проверить его использование,
git mergetool
прежде чем использовать его в живом проекте. Обязательно используйте имя файла, содержащее пробел в вашем тесте, на случай, если ваша ОС требует экранирования кавычек вcmd
строке, см. Ниже.Экранирующие символы цитаты
Некоторым операционным системам может потребоваться
cmd
экранировать кавычки . Менее опытные пользователи должны помнить, что командные строки config должны быть проверены с именами файлов, которые содержат пробелы, и еслиcmd
строки не работают с именами файлов, которые содержат пробелы, попробуйте экранировать кавычки. напримерВ некоторых случаях может потребоваться более сложное экранирование кавычек. Первая из ссылок пути Windows ниже содержит пример тройного экранирования каждой кавычки. Это зануда, но иногда необходимо. например
Пути Windows
Пользователям Windows, вероятно, понадобится дополнительная настройка, добавленная к
cmd
линиям Meld . Им может понадобиться использовать полный путь кmeldc
, который предназначен для вызова в Windows из командной строки, или им может понадобиться или захотеть использовать оболочку. Они должны прочитать страницы StackOverflow, ссылки на которые приведены ниже и посвящены настройке правильнойcmd
линии Meld для Windows. Поскольку я пользователь Linux, я не могу протестировать различныеcmd
строки Windows и не имею никакой дополнительной информации по этому вопросу, кроме как рекомендовать использовать мои примеры с добавлением полного пути к Meldmeldc
или добавлением папки программ Meld в вашуpath
.Игнорирование конечных пробелов с Мелдом
У Meld есть ряд параметров, которые можно настроить в графическом интерфейсе.
На
Text Filters
вкладке настроек есть несколько полезных фильтров, которые игнорируют такие вещи, как комментарии, при выполнении сравнения. Хотя есть фильтры, которые нужно игнорировать,All whitespace
и фильтрLeading whitespace
игнорирования отсутствуетTrailing whitespace
(это было предложено в качестве дополнения в списке рассылки Meld, но недоступно в моей версии).Игнорирование конечных пробелов часто очень полезно, особенно при совместной работе, и может быть легко добавлено вручную с помощью простого регулярного выражения на
Text Filters
вкладке настроек Meld .Я надеюсь, что это помогает всем.
источник
[mergetool "meld"]
cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
в~/.gitconfig
, то просто разрешить конфликты , выделенные красным цветом в средней кастрюле и сохранить! Это должна быть настройка по умолчанию.$LOCAL $MERGED $REMOTE
это настройка, которую я использую большую часть времени, когда есть только несколько конфликтов, чтобы решить, это превосходно, и это также по умолчанию.$LOCAL $BASE $REMOTE
действительно приходит в себя, когда есть чем заняться, и вы точно знаете, какие разделы кода поступают из какого файла; предок общего коммита может быть отличной отправной точкой, свободной от беспорядка, иногда на самом деле мешает выделение конфликтов, а чистая основа - это благословение.=
следующее:cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output="$MERGED"
Хотя другой ответ верен, вот самый быстрый способ просто настроить Meld как инструмент визуального сравнения. Просто скопируйте / вставьте это:
Теперь запустите
git difftool
в каталоге, и Meld будет запущен для каждого отдельного файла.Примечание: Мелд удивительно медленно сравнивает CSV-файлы, и ни один инструмент Linux diff, который я обнаружил, не работает быстрее, чем этот инструмент Windows под названием Compare It! (последнее обновление в 2010 году).
источник
git config --global difftool.meld.cmd 'meld "$LOCAL" "$REMOTE"'
линию там тоже. Это «значение по умолчанию», но как только вы настроите amergetool
,difftool
он начнет использовать конфигурацию mergetool в качестве значения по умолчанию, если не найден diff config. Поскольку слияние обычно настроено на передачу трех файлов для трехстороннего слияния, это означает, что в вашемmeld
разностном окне внезапно появятся три панели, которые не имеют никакого смысла.Для Windows . Запустите эти команды в Git Bash:
(Обновите путь к файлу для Meld.exe, если у вас другой.)
Для Linux . Запустите эти команды в Git Bash:
Вы можете проверить путь Мелда, используя эту команду:
источник
git config --global --get-regex diff*
?git config --global difftool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"
?Я предпочитаю настраивать объединение как отдельную команду, например так:
Это делает его похожим на скрипт git-meld.pl здесь: https://github.com/wmanley/git-meld
Вы можете просто запустить
источник
--dir-diff
часть как личное предпочтение.)Для Windows 10 я должен был поместить это в мой .gitconfig:
Все остальное, что вам нужно знать, написано в этом супер ответе Mattst далее выше.
PS: Почему-то это работало только с Meld 3.18.x, Meld 3.20.x выдает ошибку.
источник
Это ответ, ориентированный в первую очередь на разработчиков, использующих Windows, поскольку синтаксис пути инструмента diff отличается от других платформ.
Я использую Kdiff3 в качестве git mergetool, но чтобы настроить git difftool как Meld, я сначала установил последнюю версию Meld с Meldmerge.org, а затем добавил следующее в мой глобальный .gitconfig, используя:
Обратите внимание: если вы предпочитаете Sublime Text 3 вместо Vim по умолчанию в качестве основного редактора, вы можете добавить его в файл .gitconfig:
Затем вы добавляете Inn Meld в качестве difftool
Обратите внимание на косую черту в cmd выше, в Windows это необходимо.
Также можно настроить псевдоним для отображения текущего git diff с параметром --dir-diff . Это выведет список измененных файлов внутри Meld, что удобно, когда вы изменили несколько файлов (действительно очень распространенный сценарий).
Псевдоним выглядит так внутри файла .gitconfig, ниже раздела [alias] :
Чтобы показать изменения, которые я внес в код, я просто введите следующую команду:
На следующем рисунке показано, как эта опция --dir-diff может отображать список измененных файлов (пример):
Затем можно нажать на каждый файл и показать изменения внутри Meld.
источник
Может быть сложно вычислить разницу в вашей голове из различных разделов в $ MERGED и применить это. В моей настройке meld помогает, показывая вам эти различия визуально, используя:
Это выглядит странно, но предлагает очень удобный рабочий процесс, используя три вкладки:
на вкладке 1 вы видите (слева направо) изменение, которое вы должны внести на вкладке 2, чтобы разрешить конфликт слияния.
в правой части вкладки 2 вы применяете «изменения, которые вы должны внести» и копируете все содержимое файла в буфер обмена (используя ctrl-a и ctrl-c).
на вкладке 3 замените правую сторону содержимым буфера обмена. Если все правильно, теперь вы увидите - слева направо - то же самое изменение, как показано на вкладке 1 (но в других контекстах). Сохраните изменения, сделанные на этой вкладке.
Ноты:
источник
$BASE
вместо того,$MERGED
чтобы начать операцию слияния