このコマンドは、そのファイルで: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
を押します。これにより、HEADにあるものとインデックスにあるものを比較して、差分ビューが開きます。下部のバーで、両方のファイル名が特別な逃亡者ファイル名であることがわかります。ShiftD
また、Gstatusプレビューウィンドウでを押すg?と、現在のコンテキストで有効なすべてのマッピングが一覧表示されます。
またはの直接の類似物は提供vim-fugitive
しませんが、任意のコマンドの出力を読み取り専用のVimバッファーにパイプするための汎用Vimコマンドを提供します。git diff --staged
git diff --cached
git
: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
。これはできますか?
私たちができる、またはティム・ポープはヴィム教皇ではありません。の!
-suffixedバリアントはまさにそれを実行し、変更の違いを強調するVimベースの構文を備えたVim内:Git
のすべての段階的な変更の簡単なレビューを可能にします。
:Git! diff --staged
うん。それはかなり素晴らしいです。
しかし、さらに一歩進んでみましょう。どこにでもある怠惰な怠け者の昔ながらの伝統の中で、:Greview
この操作をカプセル化する新しいVimコマンドと、<leader>gr
このコマンドを実行する新しいバインディングを定義しましょう。以下をあなたの中に隠してください.vimrc
:
command Greview :Git! diff --staged
nnoremap <leader>gr :Greview<cr>
であると仮定<leader>
すると,
、すべての段階的な変更を確認すると、になり,gr
ます。Vimmierを取得できませんでした。
:Gdiff HEAD
Gdiff
リビジョン引数を取ります。だからあなたはそれを渡すことができますHEAD
。これはと同等ではありませんgit diff --staged
が、同様の目的を果たすことができます。
更新:2017年3月28日、
現在のバージョンのfugitiveは、ファイルを押すD
と自動的にこれを行います。
ファイルがステージングされている場合、ステージングされた変更のみが差分に表示されます。ファイルがステージングされていない場合は、ステージングされていない変更のみが表示されます。
すでに述べたように、、、またははインデックスとの差分を提供するか、
またはGdiff
HEADGdiff :
との差分を提供します。Gdiff :0
Gdiff -
Gdiff HEAD
したがって、最初にdiffを実行し、:
次に-
vimでshow3diff-panesを使用します。
command! -bar Gvstage :Gvdiff -|Gvdiff : " vertical 3-split
command! -bar Gsstage :Gsdiff -|Gsdiff : " horizontal 3-split
もちろん、Gvdiff -
すでにdiffモードになっている場合も同様です。
現在、変更のプッシュと取得は3つの開いているウィンドウで少し複雑になっていますがdiffput
、HEADがオフになっているため、インデックスから作業ツリーへ、またはその逆を簡単にmodifiable
行うことができるため、ターゲットにすることはできません。
diffput
それ以外の場合は、およびコマンドのショートカットをいくつか追加できます。これらのdiffget
コマンドは、パターン(:help mergeを参照)またはバッファー番号の「バッファー指定子」を取ることができます。前のコマンドを変更して、初期バッファーの数を保存し、他のコマンドのパターンを使用しました。
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ステータスウィンドウを移行するよりも高速ですが、ステージングされたファイルを編集できないという欠点があります。
を使用し:Gtabedit @:% | Gdiff :
ます。
:Gdiff
これは、diff構文を単一のバッファーにダンプするのではなく、のように分割ビューで開くため、他の回答よりも優れています。終わったら、ただ:tabc
戻るために。
Gtabedit
新しいタブを開き、一時的なオブジェクトを編集します。
@
(HEAD)から、特定のファイル:
、現在のファイル%
。Gdiff
現在のバッファを別の逃亡者オブジェクトと比較します。
:
(でファイルを再度指定できますが、必須では:%
ありません)。git diff
これで、 (:Gdiff
)とgit diff --staged
(上記のコマンド)に相当する逃亡者ができました。git show
現在のファイルでの動作を取得するには、を使用します:Gtabedit @~:% | Gdiff @
。
:help fugitive-object
あなたが誰かがこの質問につまずいた場合に備えて。
:Gdiff --staged
しましょう.. :)