Как мне настроить и использовать 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
строка просто не дает 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
выше примере в качестве строки предлагается 2 строки [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"
# See 'Note On Output File' which explains --output "$MERGED".
Выбор - использовать $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
строки не работают с именами файлов, которые содержат пробелы, попробуйте экранировать кавычки. например
cmd = meld \"$LOCAL\" \"$REMOTE\"
В некоторых случаях может потребоваться более сложное экранирование кавычек. Первая из ссылок пути Windows ниже содержит пример тройного экранирования каждой кавычки. Это зануда, но иногда необходимо. например
cmd = meld \\\"$LOCAL\\\" \\\"$REMOTE\\\"
Пути Windows
Пользователям Windows, вероятно, понадобится дополнительная настройка, добавленная к cmd
линиям Meld . Им может понадобиться использовать полный путь к meldc
, который предназначен для вызова в Windows из командной строки, или им может понадобиться или захотеть использовать оболочку. Они должны прочитать страницы StackOverflow, ссылки на которые приведены ниже и посвящены настройке правильной cmd
линии Meld для Windows. Поскольку я пользователь Linux, я не могу протестировать различные cmd
строки Windows и не имею никакой дополнительной информации по этому вопросу, кроме как рекомендовать использовать мои примеры с добавлением полного пути к Meld meldc
или добавлением папки программ Meld в вашу path
.
Игнорирование конечных пробелов с Мелдом
У Meld есть ряд параметров, которые можно настроить в графическом интерфейсе.
На Text Filters
вкладке настроек есть несколько полезных фильтров, которые игнорируют такие вещи, как комментарии, при выполнении сравнения. Хотя есть фильтры, которые нужно игнорировать, All whitespace
и фильтр Leading whitespace
игнорирования отсутствует Trailing whitespace
(это было предложено в качестве дополнения в списке рассылки Meld, но недоступно в моей версии).
Игнорирование конечных пробелов часто очень полезно, особенно при совместной работе, и может быть легко добавлено вручную с помощью простого регулярного выражения на Text Filters
вкладке настроек Meld .
# Use either of these regexes depending on how comprehensive you want it to be.
[ \t]*$
[ \t\r\f\v]*$
Я надеюсь, что это помогает всем.