#git #vimdiff #mergetool
Вопрос:
Когда я бегу git difftool --tool-help
или git mergetool --tool-help
, я вижу:
vimdiff
vimdiff1
vimdiff2
vimdiff3
Что это за разные «версии»? Я предполагаю, что все они запускают Vim с разными вариантами, но каковы варианты? Они где-нибудь задокументированы?
Ответ №1:
К сожалению, они, похоже, нигде не задокументированы.
Соответствующий исходный код находится здесь. Обратите внимание, как vimdiff
, nvimdiff
, и gvimdiff
все они реализованы с помощью одного и того же сценария.
Difftool
При вызове в качестве difftool все они делают одно и то же:
vim -R -f -d
-c 'wincmd l'
-c 'cd $GIT_PREFIX'
"$LOCAL" "$REMOTE"
Это запускает Vim в режиме только для чтения -R
и в режиме различий -d
. Для получения информации о режиме diff см. справочную vimdiff(1)
страницу и страницу справки Vim diff.txt
.
Mergetool
При вызове в качестве mergetool поведение этих параметров меняется.
На приведенных ниже диаграммах Local
соответствует «нашим», Remote
соответствует «их», Base
соответствует «базе слияния» и Merge
является файлом, который фактически будет сохранен в рабочем дереве (и помещен в индекс, если разрешение будет успешным).
vimdiff
Если присутствует «база слияния», макет окна:
# | Local | Base | Remote |
# | --------------------- |
# | Merge |
vim -f -d
-c '4wincmd w | wincmd J'
"$LOCAL" "$BASE" "$REMOTE" "$MERGED"
Если база слияния отсутствует, макет:
# | | | |
# | Local | Merge | Remote |
# | | | |
vim -f -d
-c 'wincmd l'
"$LOCAL" "$MERGED" "$REMOTE"
vimdiff1
Планировка такова:
# | | |
# | Local | Remote |
# | | |
vim -f -d "$LOCAL" "$REMOTE"
ret="$?"
if test "$ret" -eq 0
then
cp -- "$LOCAL" "$MERGED"
fi
Local
затем будет сохранен в дереве работ после успеха, заняв место Merged
.
vimdiff2
Макет идентичен vimdiff
без базы слияния.
vimdiff3
Каждый из Local
, Remote
, Base
(если присутствует) будет открыт, но скрыт. Merged
будет открыт и виден. Вы можете переключаться между этими буферами с :buffer
помощью команды.
# With Base
vim -f -d
-c 'hid | hid | hid'
"$LOCAL" "$REMOTE" "$BASE" "$MERGED"
# Without Base
vim -f -d
-c 'hid | hid'
"$LOCAL" "$REMOTE" "$MERGED"
Создайте свой собственный mergetool!
Давайте создадим a vimdiff4
, который использует тот же макет, vimdiff
что и с базой, но без базовой части.
Добавьте следующее в свою конфигурацию Git (например $XDG_CONFIG_HOME/git/config
):
[mergetool "nvimdiff4"]
# Like "nvimdiff", but always ignore $BASE.
cmd = nvim -f -d -c '$wincmd w' -c 'wincmd J' $LOCAL $REMOTE $MERGED
При вызове вы git mergetool --tool-help
увидите новую строку в выводе:
user-defined:
nvimdiff4.cmd nvim -d -c '$wincmd w' -c 'wincmd J' $LOCAL $REMOTE $MERGED
Теперь вы можете выполнить git mergetool --tool=nvimdiff4
, который вызовет команду, указанную нами выше.