Заставить git show показывать различия с помощью vimdiff

Как мне это сделать? После внесения изменений через git config я могу сравнить свои поэтапные и зафиксированные изменения с помощью vimdiff, но когда я делаю git show, я все еще вижу разницу в старом простом стиле. Как мне заставить это работать и для git show?


person username_4567    schedule 24.05.2016    source источник
comment
Возможный дубликат stackoverflow.com/questions/28048270/   -  person anujm    schedule 24.05.2016


Ответы (4)


По умолчанию git show без параметров, а также git show <object> отображают изменения для всех файлов в фиксации. Поскольку vimdiff может одновременно сравнивать только один файл, вы не можете использовать его с этими параметрами.

Однако git show <object> -- <file> показывает изменения в одном файле в фиксации. Вы можете отобразить изменения в vimdiff, запустив вместо этого difftool:

git difftool SHA~:SHA -- <file>

Если вам нужно больше гибкости, вы всегда можете использовать git show для получения определенных версий файла и передачи их в vimdiff через Замена процесса

export FILE=path/to/file; vimdiff <(git show SHA1:$FILE) <(git show SHA2:$FILE)
person diwo    schedule 29.05.2016

С помощью git show вы можете показывать такие объекты, как коммиты (см. справочную страницу). Таким образом, вы показываете не разницу двух файлов, а изменения в (возможно, нескольких) файлах. Так что нет двух файлов, которые можно сравнить. Но это именно то, что делает vimdiff, он открывает два файла бок о бок и выделяет различия.
Когда вы используете git difftool или что-то подобное, он создает файлы для обеих сторон diff и использует инструмент (в вашем случае vimdiff), чтобы сравнить их. git show не создает эти файлы, поэтому vimdiff не может отобразить его вывод.

Вкратце: git show — это инструмент для отображения объектов git, а не для создания различий, поэтому его вывод нельзя отобразить как разницу с помощью vimdiff.

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

person toydarian    schedule 24.05.2016

Попробуйте использовать псевдонимы git. Это для git show

git config --global alias.s difftool\ HEAD^\ HEAD

А это для git show <revision>

git config --global alias.s '!f() { rev=${1-HEAD}; git difftool $rev^ $rev; }; f'

Чтобы увидеть, как это работает, ознакомьтесь с этой страницей.

person Yuriy Pozniak    schedule 12.02.2017
comment
На самом деле это довольно хороший ответ, и это именно то, что я искал. Это работает не только с HEAD, но и с любой фиксацией, и принимает имена файлов для отображения с помощью '--'. Отключение приглашения Launch 'vimdiff' [Y/n] с помощью 'git config difftool.prompt false' работает еще лучше. Спасибо. - person egelev; 04.04.2019

Следующие работы для меня:

git difftool SHA^..SHA -- <file>
person Deqing    schedule 03.06.2019