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

时间:2013-03-14 11:13:44

标签: vim-fugitive

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

git diff --stagedgit diff --cached的等效内容是什么?

7 个答案:

答案 0 :(得分:27)

我找到了办法。运行:Gstatus,您应该会看到一个包含以下内容的窗口:

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

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

同样在Gstatus预览窗口中,您可以按 g ,它将列出当前上下文中有效的所有映射。

答案 1 :(得分:19)

虽然vim-fugitive git diff --stagedgit diff --cached提供直接类似物,但 提供通用Vim命令用于将任意git命令的输出传递到只读Vim缓冲区::Git!

不适用的答案

在我们开始之前,让我们明确重申一下这个问题。 git diff --stagedgit diff --cached是同一基础操作的同义词:将索引的内容(所有分阶段更改的集合)与HEAD的内容(当前分支的最新提交)进行区分,通常用于在提交之前查看更改。所述问题随后变为:

  

审核vim-fugitive中所有阶段性更改的最有效方法是什么?

应该清楚的是,目前接受的自我回答未能解决这个问题。排名第二的自我回答并不好。

:Gstatus绑定仅适用于当前行上的文件,因此不能按定义用于查看所有分阶段的更改。此外,:Gstatus D绑定甚至不会检查当前行上文件的所有暂存更改。它只区分该文件的索引和工作树副本,而不是区分该文件的索引和最近提交的副本(这是一个完全不同的野兽)。

:Gdiff HEAD同样不适用。它仅区分对应于当前缓冲区的文件的最近提交和工作树副本。没有参数的:Gdiff等同于:Gstatus D绑定,再次区分该文件的索引和工作树副本。没有评论所有上演的变化。

适用的答案

emaniacs最接近一个有效的解决方案,对后一个答案发表评论:

:Git diff --staged

现在我们接近真相了!

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

解决方案

我们可以,或蒂姆波普不是Vim教皇。 !的{​​{1}} - 后缀变体就是这样,允许对 Vim中的所有分阶段更改进行一个简单的审核,并使用基于Vim的语法突出显示更改差异:

:Git

是的。非常棒。

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

即可
.vimrc

假设command Greview :Git! diff --staged nnoremap <leader>gr :Greview<cr> <leader>,则审核所有已暂存的更改会缩减为,。它无法获得任何Vimmier。

答案 2 :(得分:10)

:Gdiff HEAD

Gdiff采用修订参数。所以你可以传递它HEAD。这不等同于git diff --staged,但它可以起到类似的作用。

答案 3 :(得分:2)

如前所述,GdiffGdiff :Gdiff :0为您提供了索引的差异, Gdiff -Gdiff HEAD给出了HEAD的差异。

三重分割方法

首先使用:进行差异,然后使用-在vim中显示3个diff-panes:

  1. HEAD
  2. 索引(&#34;缓存&#34;或&#34;上演&#34;)
  3. 工作树
  4. command! -bar Gvstage :Gvdiff -|Gvdiff : " vertical 3-split
    command! -bar Gsstage :Gsdiff -|Gsdiff : " horizontal 3-split
    

    当然,如果你已经处于差异模式,你也可以Gvdiff -

    现在,通过3个打开的窗口推送和获取更改会更加复杂,但是,您可以轻松地从索引到工作树diffput,反之亦然,就像HEAD modifiable关闭一样,所以它永远不会成为目标。

    否则,您可以为diffputdiffget命令添加一些快捷方式,因为他们知道他们可以使用&#34;缓冲区说明符&#34;,这可以是一种模式(请参阅:help合并)或缓冲区号码。我修改了以前的命令以保存初始缓冲区的编号并使用其他模式:

    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状态窗口转换更快(至少对我而言),但缺点是您无法编辑分阶段文件。

答案 4 :(得分:1)

更新:2017年3月28日,

当您在文件上按D时,当前版本的逃犯会自动执行此操作。

如果文件已暂存,则只会在差异中显示暂存的更改。 如果文件没有暂存,则只显示未暂存的更改。

答案 5 :(得分:1)

使用:Gtabedit @:% | Gdiff :

这比其他答案要好,因为它像:Gdiff一样在拆分视图中打开,而不是将diff语法转储到单个缓冲区中。完成后,只需:tabc即可返回。

说明

  1. Gtabedit打开新标签并编辑逃犯对象:
    • 从提交@(HEAD),特定文件:,当前文件%开始。
  2. Gdiff将当前缓冲区与另一个逃犯对象进行比较:
    • 从索引:开始(您可以使用:%重新指定文件,但这不是必需的。)

奖金

我们现在有git diff:Gdiff)和git diff --staged(上面的命令)的逃犯等效物。要获取当前文件上git show的行为,请使用:Gtabedit @~:% | Gdiff @

参考文献

答案 6 :(得分:-3)

如果你有人偶然发现了这个问题。

:Gdiff - 暂存

会做..:)