如何使用Fugitive运行`git diff --staged?

Fli*_*imm 23 vim-fugitive

该命令:Gdiff相当于git diff在该文件上运行.

什么相当于git diff --stagedgit diff --cached

Fli*_*imm 29

我找到了一种方法来做到这一点.运行:Gstatus,你应该得到一个包含如下内容的窗口:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   example.txt
#
Run Code Online (Sandbox Code Playgroud)

向下滚动到暂存文件example.txt,然后按Shift+ D.这将打开一个差异视图,比较HEAD中的内容和索引中的内容.你会注意到底部的栏上有两个文件名都是特殊的逃犯文件名.

此外,在Gstatus预览窗口中,您可以按g?,这将列出当前上下文中有效的所有映射.


Cec*_*rry 19

尽管vim-fugitive用于提供直接的类似物git diff --stagedgit 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
Run Code Online (Sandbox Code Playgroud)

现在我们接近真相了!

:Git将传递的git命令的输出传递给当前的外部寻呼机,允许对Vim外部的所有分阶段变化进行审查.但是有一个问题:Vim的外部.这意味着没有Vim绑定,缓冲区或语法突出显示.理想情况下,我们更喜欢使用只读Vim缓冲区语法来突出显示输出git diff --staged.我们可以这样做吗?

解决方案

我们可以,或蒂姆波普不是Vim教皇.该!的-suffixed变种:Git做到了这一点,允许所有的liesurely回顾上演的变化完成的变化差异基于VIM-语法高亮Vim的:

:Git! diff --staged
Run Code Online (Sandbox Code Playgroud)

是啊.这真是太棒了.

但是,让我们更进一步.在历史悠久的懒惰传统的传统中,让我们定义一个:Greview封装此操作的新Vim命令和一个<leader>gr运行此命令的新绑定.只需将以下内容存入您的.vimrc:

command Greview :Git! diff --staged
nnoremap <leader>gr :Greview<cr>
Run Code Online (Sandbox Code Playgroud)

假设<leader>,,审查所有阶段性更改减少到,gr.它无法得到任何Vimmier.


Fli*_*imm 11

:Gdiff HEAD
Run Code Online (Sandbox Code Playgroud)

Gdiff采取修改论点.所以你可以通过它HEAD.这不等同于git diff --staged,但它可以起到类似的作用.

  • @emaniacs:这不会使用Vim的diff功能像`:Gdiff`一样打开差异。 (2认同)