28

このコマンドは、そのファイルで:Gdiff実行するのと同じです。git diff

git diff --stagedまたはに相当するものは何git diff --cachedですか?

4

7 に答える 7

34

私はこれを行う方法を見つけました。を実行:Gstatusすると、次のような内容のウィンドウが表示されます。

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

ステージングされたファイルまでスクロールダウンし、+example.txtを押します。これにより、HEADにあるものとインデックスにあるものを比較して、差分ビューが開きます。下部のバーで、両方のファイル名が特別な逃亡者ファイル名であることがわかります。ShiftD

また、Gstatusプレビューウィンドウでを押すg?と、現在のコンテキストで有効なすべてのマッピングが一覧表示されます。

于 2014-08-22T08:57:16.200 に答える
21

またはの直接の類似物は提供vim-fugitiveしません任意のコマンドの出力を読み取り専用のVimバッファーにパイプするための汎用Vimコマンドを提供します。git diff --stagedgit diff --cachedgit: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。これはできますか?

ソリューション

私たちができる、またはティム・ポープはヴィム教皇ではありません。の!-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を取得できませんでした。

于 2015-04-05T05:35:25.457 に答える
15
:Gdiff HEAD

Gdiffリビジョン引数を取ります。だからあなたはそれを渡すことができますHEAD。これはと同等ではありませんgit diff --stagedが、同様の目的を果たすことができます。

于 2013-07-18T10:22:34.020 に答える
2

更新:2017年3月28日、

現在のバージョンのfugitiveは、ファイルを押すDと自動的にこれを行います。

ファイルがステージングされている場合、ステージングされた変更のみが差分に表示されます。ファイルがステージングされていない場合は、ステージングされていない変更のみが表示されます。

于 2017-03-29T03:37:53.323 に答える
2

すでに述べたように、、、またははインデックスとの差分を提供するか、 またはGdiffHEADGdiff :との差分を提供します。Gdiff :0Gdiff -Gdiff HEAD

トリプルスプリットアプローチ

したがって、最初にdiffを実行し、:次に-vimでshow3diff-panesを使用します。

  1. インデックス(「キャッシュ」または「ステージング」)
  2. ワーキングツリー
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

Difftoolアプローチ

vimdiffまたは、パッチの代わりにステージングされたものの見栄えを良くしたい場合は、次のことをお勧めします。

command! Greview :exec "Git difftool --tool=vimdiff --staged " . fugitive#buffer().path()

これによりvimの新しいインスタンスが開始されるため、終了すると、既に開いているタブとウィンドウに戻ります。これは完璧です。これは、(少なくとも私にとっては)gitステータスウィンドウを移行するよりも高速ですが、ステージングされたファイルを編集できないという欠点があります。

于 2017-11-10T19:16:28.087 に答える
2

を使用し:Gtabedit @:% | Gdiff :ます。

:Gdiffこれは、diff構文を単一のバッファーにダンプするのではなく、のように分割ビューで開くため、他の回答よりも優れています。終わったら、ただ:tabc戻るために。

説明

  1. Gtabedit新しいタブを開き、一時的なオブジェクトを編集します。
    • コミット@(HEAD)から、特定のファイル:、現在のファイル%
  2. Gdiff現在のバッファを別の逃亡者オブジェクトと比較します。
    • インデックスから:(でファイルを再度指定できますが、必須では:%ありません)。

ボーナス

git diffこれで、 (:Gdiff)とgit diff --staged(上記のコマンド)に相当する逃亡者ができました。git show現在のファイルでの動作を取得するには、を使用します:Gtabedit @~:% | Gdiff @

参考文献

于 2018-12-14T21:32:24.160 に答える
-3

あなたが誰かがこの質問につまずいた場合に備えて。

:Gdiff --staged

しましょう.. :)

于 2013-07-18T09:58:10.397 に答える