Как мне настроить и использовать 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]*$
Я надеюсь, что это помогает всем.