命令:Gdiff
相当于在该文件上运行git diff
。
git diff --staged
或git diff --cached
的等效内容是什么?
答案 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 --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外部的所有分阶段更改进行一个简单的审查。但是有一个问题: 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)
如前所述,Gdiff
,Gdiff :
或Gdiff :0
为您提供了索引的差异,
Gdiff -
或Gdiff HEAD
给出了HEAD的差异。
首先使用:
进行差异,然后使用-
在vim中显示3个diff-panes:
command! -bar Gvstage :Gvdiff -|Gvdiff : " vertical 3-split
command! -bar Gsstage :Gsdiff -|Gsdiff : " horizontal 3-split
当然,如果你已经处于差异模式,你也可以Gvdiff -
。
现在,通过3个打开的窗口推送和获取更改会更加复杂,但是,您可以轻松地从索引到工作树diffput
,反之亦然,就像HEAD modifiable
关闭一样,所以它永远不会成为目标。
否则,您可以为diffput
和diffget
命令添加一些快捷方式,因为他们知道他们可以使用&#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
或者,如果您只想要一个很好的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
即可返回。
Gtabedit
打开新标签并编辑逃犯对象:
@
(HEAD),特定文件:
,当前文件%
开始。Gdiff
将当前缓冲区与另一个逃犯对象进行比较:
:
开始(您可以使用:%
重新指定文件,但这不是必需的。)我们现在有git diff
(:Gdiff
)和git diff --staged
(上面的命令)的逃犯等效物。要获取当前文件上git show
的行为,请使用:Gtabedit @~:% | Gdiff @
。
:help fugitive-object
答案 6 :(得分:-3)
如果你有人偶然发现了这个问题。
:Gdiff - 暂存
会做..:)