Команда :Gdiff
эквивалентна запуску git diff
в этом файле.
Что эквивалентно для git diff --staged
или git diff --cached
?
Команда :Gdiff
эквивалентна запуску git diff
в этом файле.
Что эквивалентно для git diff --staged
или git diff --cached
?
Я нашел способ сделать это. Запустите :Gstatus
, вы должны получить окно со следующим содержимым:
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: example.txt
#
Прокрутите вниз до поэтапного файла, example.txt
и нажмите Shift + D. Это откроет представление diff, сравнивающее то, что в HEAD и что в индексе. Вы заметите на нижней панели, что оба имени файла являются специальными именами Fugitive.
Также в окне предварительного просмотра Gstatus вы можете нажать g ?, в котором будут перечислены все сопоставления, действующие в текущем контексте.
В то время как vim-fugitive
не предоставляет прямых аналогов для git diff --staged
или git diff --cached
, он предоставляет команду Vim общего назначения для подачи вывода произвольных команд git
в буферы Vim только для чтения: :Git!
.
Прежде чем мы дойдем до этого, давайте явно переформулируем вопрос. git diff --staged
и git diff --cached
являются синонимами для одной и той же основной операции: различают содержимое индекса (совокупность всех поэтапных изменений) по сравнению с содержимым HEAD (последняя фиксация для текущей ветки), как правило, для просмотра изменений до фиксации. Затем заданный вопрос становится следующим:
Что является наиболее эффективным средством просмотра всех поэтапных изменений в
vim-fugitive
?
Должно быть ясно, что принятый в настоящее время автоответ не может решить этот вопрос. Следующий наивысший рейтинг автоответчика не лучше.
:Gstatus
привязки применяются только к файлу текущей строки и, следовательно, по определению не могут использоваться для просмотра всех поэтапных изменений. Более того, привязка :Gstatus
D
даже не просматривает все поэтапные изменения для файла в текущей строке. Он различает только индексные и рабочие деревовые копии этого файла, а не отличается индексом и последними зафиксированными копиями этого файла (который является совсем другим зверем).
:Gdiff HEAD
аналогично неприменим. Он только различает самые последние исправленные и рабочие копии дерева файла, соответствующие текущему буферу. :Gdiff
без аргумента эквивалентно привязке :Gstatus
D
, снова различая копии индекса и рабочего дерева этого файла. Ни один из них не рассматривает все поэтапные изменения.
emaniacs ударил ближайшего к рабочему решению с этим комментарием к последнему ответу:
:Git diff --staged
Теперь мы приближаемся к правде!
:Git
выводит вывод переданной команды git
на текущий внешний пейджер, позволяя без проблем просматривать все поэтапные изменения, внешние по отношению к Vim. Но там rub: внешний для Vim. Это означает отсутствие привязок Vim, буферов или подсветки синтаксиса. В идеале мы предпочли бы синтаксис буфера только для чтения Vim, выделяющий вывод git diff --staged
. Можем ли мы это сделать?
Мы можем, или Тим Папа не Вим Папа. Вариант !
-suffixed от :Git
делает именно это, позволяя без проблем просматривать все поэтапные изменения внутри Vim в комплекте с синтаксическим синтаксисом на основе Vim различий в изменении:
:Git! diff --staged
Да. Это довольно удивительно.
Но отпустите шаг дальше. В вековой традиции ленивых бездельников повсюду давайте определим новую команду Vim :Greview
, инкапсулирующую эту операцию, и новую привязку <leader>gr
, выполняющую эту команду. Просто запишитесь в свой .vimrc
:
command Greview :Git! diff --staged
nnoremap <leader>gr :Greview<cr>
Предполагая, что <leader>
будет ,
, просмотр всех поэтапных изменений сводится к ,gr
. Он не смог получить ни одного Виммьера.
:Gdiff HEAD
Gdiff
принимает аргумент ревизии. Поэтому вы можете передать его HEAD
. Это не эквивалентно git diff --staged
, но оно может служить аналогичной цели.
Как уже отмечалось, Gdiff
, Gdiff :
или Gdiff :0
дает вам diff с индексом,
Gdiff -
или Gdiff HEAD
дает diff с HEAD.
Итак, сделав diff сначала с :
, затем с -
покажите 3 diff-panes в vim:
command! -bar Gvstage :Gvdiff -|Gvdiff : " vertical 3-split
command! -bar Gsstage :Gsdiff -|Gsdiff : " horizontal 3-split
Конечно, вы также можете просто Gvdiff -
, если вы уже находитесь в режиме diff.
Теперь нажатие и получение изменений сложнее с 3 открытыми окнами, однако вы можете diffput
от индекса к рабочему дереву и наоборот легко, так как на HEAD modifiable
выключено, поэтому он никогда не может быть целенаправленными.
В противном случае вы можете добавить несколько ярлыков для команд diffput
и diffget
, зная, что они могут взять "спецификатор буфера", который может быть шаблоном (см. слияние справки) или номер буфера. Я изменил предыдущие команды, чтобы сохранить начальный номер буфера и использовать шаблоны для остальных:
command! -bar Gvstage :let t:working_copy=bufnr('%')|Gvdiff -|Gvdiff : " vertical 3-split
command! -bar Gsstage :let t:working_copy=bufnr('%')|Gsdiff -|Gsdiff : " horizontal 3-split
nnoremap <Leader>hg :diffget fugitive://*/.git//[0-9a-f][0-9a-f]*/<CR> " HEAD get
nnoremap <Leader>ig :diffget fugitive://*/.git//0/<CR> " index get
nnoremap <Leader>ip :diffput fugitive://*/.git//0/<CR> " index put
nnoremap <Leader>wg :diffget <C-R>=t:working_copy<CR><CR> " work get
nnoremap <Leader>wp :diffput <C-R>=t:working_copy<CR><CR> " work put
В качестве альтернативы, если вам просто нужен хороший vimdiff
вид того, что было поставлено вместо патча, позвольте мне предложить:
command! Greview :exec "Git difftool --tool=vimdiff --staged " . fugitive#buffer().path()
Это запускает новый экземпляр vim, поэтому, когда вы его покидаете, вы возвращаетесь к своим вкладкам и окнам, которые вы уже открыли, что идеально. Это, если быстрее (по крайней мере для меня), чем переход через окно состояния git, но имеет недостаток, который вы не можете отредактировать поэтапный файл.
Обновление: 3/28/2017,
Текущая версия беглеца будет делать это автоматически, когда вы нажимаете D
в файле.
если файл поставлен, в diff будут отображаться только поэтапные изменения. Если файл не поставлен, то будут отображаться только изменения, которые не были поставлены.
Использование :Gtabedit @:% | Gdiff :
:Gtabedit @:% | Gdiff :
Это лучше, чем другие ответы, потому что он открывается в режиме разделенного просмотра, как :Gdiff
, а не сбрасывает синтаксис diff в один буфер. Когда вы закончите, просто :tabc
чтобы вернуться.
Gtabedit
откройте новую вкладку и отредактируйте беглый объект: @
(HEAD), определенный файл :
текущий файл %
.Gdiff
diff текущего буфера против другого беглого объекта: :
(вы можете указать файл снова с помощью :%
но это не нужно). Теперь у нас есть беглые эквиваленты для git diff
(:Gdiff
) и git diff --staged
(команда выше). Чтобы узнать поведение git show
для текущего файла, используйте :Gtabedit @~:% | Gdiff @
:Gtabedit @~:% | Gdiff @
.
:help fugitive-object
Если кто-то наткнулся на этот вопрос.
: Gdiff --staged
сделает..:)