Каковы различные difftools/mergetools «vimdiff»?

#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 , который вызовет команду, указанную нами выше.