Просмотр всех `git diffs` с помощью vimdiff

Я настроил git diff на перенос в vimdiff, используя "Git Diff с Vimdiff "в качестве руководства, и он работает должным образом, если только не будет много файлов с изменениями.

Когда есть несколько файлов с изменениями и я запускаю git diff, он открывает первый файл, и после выхода из первого экземпляра vimdiff я получаю следующее сообщение:

external diff died, stopping at filename

Это совершенно другое поведение, чем я привык. В прошлом у меня была аналогичная установка с SVN, и при сравнении нескольких файлов я просматривал первый файл, затем записывал и заканчивал использование :wq, и открывался следующий файл с различиями.

В случае с Git дело обстоит иначе. Я пробовал :n[ext], но при этом не заполняется левое окно исходным файлом, чтобы его можно было сравнить с измененной версией.


person chuckg    schedule 14.09.2010    source источник


Ответы (6)


git config --global diff.tool vimdiff
git config --global difftool.prompt false

Ввод git difftool дает ожидаемое поведение.

Команды навигации,

  • :qa в vim переходит к следующему файлу в наборе изменений, ничего не сохраняя.

Псевдоним (пример)

git config --global alias.d difftool

.. позволит вам набрать git d для вызова vimdiff.

Расширенные варианты использования,

  • По умолчанию git вызывает vimdiff с параметром -R. Вы можете переопределить его с помощью git config --global difftool.vimdiff.cmd 'vimdiff $ LOCAL $ REMOTE'. Это откроет vimdiff в режиме записи, который позволяет редактировать во время сравнения.
  • :wq в vim переходит к следующему файлу в наборе изменений с сохраненными изменениями.
person chuckg    schedule 15.09.2010
comment
Только мои два цента: у меня df псевдоним diff и dt псевдоним difftool. Кроме того, ввод :qa в Vim приведет к переходу к следующему набору изменений без каких-либо сохранений. - person J.C. Yamokoski; 27.11.2012
comment
Это отличное решение, за исключением того, что при сохранении изменений вам нужно набрать: w! вместо: w - person Asenar; 26.09.2013
comment
@jonyamo Псевдоним настройки всегда должен основываться на том, как часто мы используем некоторые команды. Я чаще использую git diff, чем git difftool. Итак, я присвоил d псевдониму 'diff' и 'dt' to difftool '. Юзабилити важнее, чем создание псевдонимов с помощью шаблона. - person Mohammed H; 08.01.2014
comment
Как заставить git diff использовать vimdiff ?, этот ответ заставляет меня использовать псевдоним. Если у меня псевдоним diff не работает. - person Rombus; 04.05.2016
comment
@Asenar Это отличное решение, за исключением того, что при сохранении изменений вам нужно вводить :w! вместо :w. Это потому, что git вызывает vimdiff с параметром -R. Вы можете изменить это с помощью git config --global difftool.vimdiff.cmd 'vimdiff "$LOCAL" "$REMOTE"'. Это откроет vimdiff в режиме записи. - person wisbucky; 26.04.2018
comment
Также удобно поместить map <F4> :qa!<CR> в ваш .vimrc, а затем просто удерживать F4, если вы закончили с вашим vimdiff, потому что git vimdiff будет открывать каждое сравнение файлов одно за другим. - person ericcurtin; 20.08.2019
comment
Некоторые из этих комментариев перенесены в ответ. Спасибо. - person Shyam Habarakada; 17.12.2020
comment
Для тех, кто хочет установить другие инструменты: git difftool --tool-help показывает список. - person Nader Ghanbari; 16.05.2021

Вы можете попробовать git difftool, он предназначен для этого.

Во-первых, вам нужно настроить инструмент diff на vimdiff

git config diff.tool vimdiff

Затем, когда вы захотите провести различие, просто используйте git difftool вместо git diff. Он будет работать так, как вы ожидаете.

person czchen    schedule 15.09.2010
comment
Почти готово! Немного изменены, это именно то, что я ищу. +1 хотя! - person chuckg; 15.09.2010
comment
Недавно был обновлен mergetool vimdiff: git. .org /? p = git / (и еще несколько коммитов, но это самый крупный). Не уверен, когда будет следующий выпуск обслуживания, но если вы хотите строить из git.git, обновления будут вашими! - person Cascabel; 29.10.2010

Для людей, которые хотят использовать другой инструмент сравнения, не указанный в git, скажем, с nvim. вот что я в итоге использовал:

git config --global alias.d difftool -x <tool name>

В моем случае я устанавливаю <tool name> на nvim -d и вызываю команду diff с

git d <file>
person salty-cat-fish    schedule 19.04.2020
comment
nvimdiff теперь поддерживается как инструмент, так что вы можете делать git config --global diff.tool nvimdiff. - person Nader Ghanbari; 16.05.2021

Если вы хотите постоянно использовать vimdiff для git diff, вы можете установить файл ~/.gitconfig:

git config --global diff.tool vimdiff

а затем вы можете использовать git difftool для сравнения.

Если вы хотите использовать vimdiff только временно, вы можете запускать команду каждый раз:

git difftool --tool=vimdiff
person Victor    schedule 13.05.2021

Выполните однострочную команду.

git config --global diff.tool vimdiff && git config --global difftool.prompt false && git config --global alias.d difftool
person amarveer    schedule 28.06.2021
comment
Это фактически повторяет принятый ответ десятилетней давности, но с другим синтаксисом и гораздо меньшим количеством объяснений. Это могло бы быть лучше служить комментарием или предлагаемым изменением. - person Jeremy Caney; 28.06.2021

person    schedule
comment
Вы отвечаете за mergetool, а не за difftool. Но это все же полезный ответ. +1. - person dotancohen; 21.08.2013
comment
@dotancohen Действительно спасибо, я никогда не замечал, что из-за глупой ошибки теперь я могу отредактировать свой ответ. - person Nanhe Kumar; 22.08.2013
comment
@NanheKumar, @dotancohen, замена merge на diff в приведенных выше ответах поможет, т.е. git config --global diff.tool vimdiff. - person Will; 03.09.2013