Как я могу запустить `git diff --staged` с помощью Fugitive?
Команда :Gdiff
эквивалентна запуску git diff
в этом файле.
Что эквивалентно для git diff --staged
или git diff --cached
?
Ответы
Ответ 1
Я нашел способ сделать это. Запустите :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 ?, в котором будут перечислены все сопоставления, действующие в текущем контексте.
Ответ 2
В то время как 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
. Он не смог получить ни одного Виммьера.
Ответ 3
:Gdiff HEAD
Gdiff
принимает аргумент ревизии. Поэтому вы можете передать его HEAD
. Это не эквивалентно git diff --staged
, но оно может служить аналогичной цели.
Ответ 4
Как уже отмечалось, Gdiff
, Gdiff :
или Gdiff :0
дает вам diff с индексом,
Gdiff -
или Gdiff HEAD
дает diff с HEAD.
Подход с тройным разделением
Итак, сделав diff сначала с :
, затем с -
покажите 3 diff-panes в vim:
- ГОЛОВКА
- index ( "кэшированный" или "поэтапный" )
- рабочее дерево
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
Подход Difftool
В качестве альтернативы, если вам просто нужен хороший vimdiff
вид того, что было поставлено вместо патча, позвольте мне предложить:
command! Greview :exec "Git difftool --tool=vimdiff --staged " . fugitive#buffer().path()
Это запускает новый экземпляр vim, поэтому, когда вы его покидаете, вы возвращаетесь к своим вкладкам и окнам, которые вы уже открыли, что идеально. Это, если быстрее (по крайней мере для меня), чем переход через окно состояния git, но имеет недостаток, который вы не можете отредактировать поэтапный файл.
Ответ 5
Обновление: 3/28/2017,
Текущая версия беглеца будет делать это автоматически, когда вы нажимаете D
в файле.
если файл поставлен, в diff будут отображаться только поэтапные изменения.
Если файл не поставлен, то будут отображаться только изменения, которые не были поставлены.
Ответ 6
Использование :Gtabedit @:% | Gdiff :
:Gtabedit @:% | Gdiff :
Это лучше, чем другие ответы, потому что он открывается в режиме разделенного просмотра, как :Gdiff
, а не сбрасывает синтаксис diff в один буфер. Когда вы закончите, просто :tabc
чтобы вернуться.
объяснение
-
Gtabedit
откройте новую вкладку и отредактируйте беглый объект: - от commit
@
(HEAD), определенный файл :
текущий файл %
.
-
Gdiff
diff текущего буфера против другого беглого объекта: - из индекса
:
(вы можете указать файл снова с помощью :%
но это не нужно).
бонус
Теперь у нас есть беглые эквиваленты для git diff
(:Gdiff
) и git diff --staged
(команда выше). Чтобы узнать поведение git show
для текущего файла, используйте :Gtabedit @~:% | Gdiff @
:Gtabedit @~:% | Gdiff @
.
Рекомендации
Ответ 7
Если кто-то наткнулся на этот вопрос.
: Gdiff --staged
сделает..:)