ステージングされた変更を表示するにはどうすればよいですか?


2141

コミットする変更をいくつかステージングしました。次のコミットのためにステージングされているすべてのファイルの差分をどのように確認できますか?git statusは知っていますが、ステージングされているファイルの名前だけでなく、実際の差分を確認したいと思います。

私はそれを見たのgit-diffが(1)のmanページを語ります

git diff [--options] [-] […]

このフォームは、インデックス(次のコミットのステージング領域)に対して行った変更を表示するためのものです。言い換えると、違いは、インデックスにさらに追加するようにgitに指示できるものです、まだそうしていません。これらの変更は、git-add(1)を使用してステージングできます。

残念ながら、私はこれをまったく理解できません。エイリアスを作成できる便利なワンライナーがあるはずですよね?


76
git status -vも動作します。以下の私の回答を
VonC、2015年

3
@VonC私は常にこれを使用しますがless、次のようににパイプします。– git status -v | less管理可能なチャンク:)
Office氏

回答:


2613

それはただ:

git diff --cached

--cachedは、現在のに対するキャッシュ/インデックスの変更(つまり、段階的な変更)を表示することを意味しHEADます。--stagedはの同義語です--cached

--staged--cached指すのではなくHEAD、に関する違いだけHEADです。git add --patch(またはgit add -p)を使用してコミットするものを選択すると、--stagedステージングされたものが返されます。


35
あなたはファイル名だけをしたい場合は、次の操作を行いgit diff --name-only --cachedでポストごとstackoverflow.com/a/4525025/255187
ミシェル・エベール

4
各ファイルでデフォルトのビジュアル差分ツールを起動するのでgit difftool --stagedはなく、これを使用しgit diff --stagedます。 他の引数difftoolで置き換えることもできますdiff
LightCC、2017

またgit difftool --staged -d、一度に1つのファイルではなく、ビジュアルツールで2つのディレクトリを比較するために使用できます。
Robert Bernstein

これは回答としてマークされ、最初に表示されるため、最初にgit diffが含まれ、次にgit [[others]]、ちょうど2セント
Vitaliy Terziev

そして、動作します以下、ファイルを上演し、単一の変更を表示するには:git diff --cached -- <stagedfile>
ObviousChild

1605

シンプルなグラフィックはこれをより明確にします:

シンプルなGit差分

git diff

作業ディレクトリとインデックス間の変更を表示します。これは何が変更されたかを示していますが、コミットのためにステージングされていません。

git diff --cached

インデックスとHEAD(このブランチの最後のコミット)の間の変更を表示します。これは、インデックスに何が追加され、コミットのためにステージングされたかを示しています。

git diff HEAD

作業ディレクトリとHEAD(インデックスの変更を含む)の間のすべての変更を表示します。これは、コミットのステージングが行われたかどうかに関係なく、最後のコミット以降のすべての変更を示します。

また

365Gitにはもう少し詳細があります。


8
これは素朴です、私は恐れています(通常、どのgitの説明でもそうです)。あなたがローカルの変更を持っている場合foo.cと実行しないでくださいgit add foo.c、そして、foo.cある指標ではありません。コミットの段階ではありません。場合はgit diff foo.c単純作業に比べてfoo.c、インデックスには、それが空/存在しないファイルや全体の内容との間に巨大な差分を表示しなければなりませんfoo.c。したがって、実際には、ファイルがインデックスに存在しない場合、git diffそのファイルの場合、HEADコピーの使用にフォールバックします。
Kaz

9
@Kaz厳密に言えば、インデックスは空白のスレートではありません。これHEADは、段階的な変更が適用されるの仮想コピーです。Gitはファイル全体を保存するのではなく、変更を保存することで機能することに注意してください。ファイルをステージングするときは、加えられた変更のみが保存されます。暗黙のようにインデックスが空白の場合、変更をインデックスに保存する方法がわからず、ファイル全体を「新規追加」として保存する必要がありますが、これは誤りです。
ADTC、2015

8
@Kazインデックスとの両方にHEAD変更されていないバージョンのfoo.cファイルがあります(これらは物理コピーではなく、あなたと私への論理コピーにすぎません。Gitにとって、これらは、そのファイルに関係するすべてのコミットが参照するのと同じデータストリームです)。したがってgit diff完全にステージされていない状態で実行しても、foo.c実際にはフォールバックせず、実際にHEADはインデックスとの差分を実行しています(これには、ファイルとまったく同じバージョンが含まれてHEADいます)。したがって、グラフィックは正しいです。
ADTC、2015

2
こんにちは、この文脈で「インデックス」が何を意味するのか知りたいのですが?ありがとう!
Gab是好人

2
@TomRussell git status -vgit diff --cachedgit statusもちろんもちろん)と同等です
wisbucky 2017年

54

視覚的な並べて表示に興味がある場合は、拡散視覚差分ツールでそれを行うことができます。すべてではなく一部の変更がステージングされている場合は、3つのペインも表示されます。競合が発生した場合は、4つのペインが表示されます。

段階的編集と段階的でない編集を伴う拡散のスクリーンショット

で呼び出す

diffuse -m

あなたのGit作業コピーに。

あなたが私に尋ねると、私が10年間見てきた中で最高のビジュアルは異なります。また、Gitに固有ではありません。SVN、Mercurial、Bazaarなどの他のVCSと相互運用します...

参照:git diffでステージングされたツリーと作業ツリーの両方を表示しますか?


1
おかげで、これは素晴らしいツールのように見えます。これまでのところ、MeldはLinuxにとって最高の視覚的差分ツールであることがわかりましたが、クリップボードからテキストを比較することができませんでした-Meldは入力にファイルを必要とします。拡散はこれを可能にし、手動で再調整します。しばらく試してみます。
Drew Noakes

diffuse.sourceforge.netへのリンクが壊れています。現時点ではsourceforge.net/projects/diffuseを使用してください。
user1133275 2015

1
brew install diffuseOS Xで動作します。ステージングされていない変更とステージングされた変更の両方の場合、3つのペインは表示されません-まだ変更がインデックスにないという意味ですか?
ブレントファウスト

どのバージョンの拡散反射光をお持ちですか?はい。ファイルを追加してローカルで変更すると、3つのペインが表示されます。
krlmlr 2016

また、デフォルトのdifftoolとして拡散をセットアップ、その組み込みメカニズム/ツール/エイリアスを使用してそれを起動することもできます。ここで私の回答を参照してください:< stackoverflow.com/a/45684512/6501141 >
LightCC

50

段階的な変更git status -v 表示されることに注意してください!(つまりgit add、段階的な変更が必要です--一部の変更。段階的な変更はありませんgit status -v
との違いはありません。これは、Git 1.2.0(2006年2月)以降です)

長い形式(デフォルト)にgit statusは、ドキュメント化されていない「冗長」オプションがあり、実際にHEADとインデックスの差分を表示します。

そして、これはさらに完全になるでしょう:git diffでステージングされたツリーと作業ツリーの両方を表示しますか?」(git 2.3.4 +、2015年第2四半期)を参照してください。

git status -v -v

最終行はgit diff HEAD
Artur

2
@arturなんで?答えの要点は、git status -vvgit diff HEADが行われるかについても言及していることです。
VonC、2015年

上では動作しませんgit version 1.8.3.1。古いことは知っていますが、可能であれば、このフラグがいつ導入されたかに注意してください。
onebree

2
@onebree 1.8.3.1は2013年6月です。しかしgit status -v、古いです(github.com/git/git/commit/…、git 1.2.0、2006年2月!)。インデックスとの差分を表示することに注意してください。インデックスにHEAD何かを追加した場合(no git add)、git status -v差分は表示されません。git status -v -vより新しい(Git 2.3.4、2015年3月)
VonC

@VonCそれは私の間違いでしgit diff -vた...私はしました。
onebree

25

このコマンドを使用できます。

git diff --cached --name-only

--cachedオプションgit diffの手段は、ファイル、および段階的な取得するために--name-onlyファイル名だけを取得するには、オプションの手段を。


2
詳細を編集してください。コードのみと「これを試す」の回答は、検索可能なコンテンツが含まれておらず、誰かが「これを試す」必要がある理由を説明していないため、お勧めしません。
abarisone

2
なぜ私がこれを欲するのかわからない、--name-onlyオプションでレギュラーを使うこともできますgit status
Simon Forsberg

16

バージョン1.7以降では、次のようになります。

git diff --staged

15

ビジュアルDIFFツールの使用

デフォルトの回答(コマンドライン)

ここでの上位の回答は、でキャッシュされた/ステージングされた変更を表示する方法を正しく示していますIndex

$ git diff --cached

または$ git diff --stagedどちらがエイリアスです。


代わりにVisual Diffツールを起動する

デフォルトの答えは、git bash(つまり、コマンドラインまたはコンソール)で差分の変更を吐き出します。ステージングされたファイルの違いの視覚的な表現を好む人のために、git内で利用可能なスクリプトがあり、コマンドラインに表示するのではなく、表示される各ファイルの視覚的な差分ツールを起動しますdifftool

$ git difftool --staged

これはと同じgit diff --stagedですが、diffツールが実行されるたびに(つまり、diffによってファイルが処理されるたびに)、デフォルトのビジュアルdiffツールが起動します(私の環境では、これはkdiff3です)。

ツールの起動後、git diffスクリプトは、ビジュアルdiffツールが閉じるまで一時停止します。したがって、次のファイルを表示するには、各ファイルを閉じる必要があります。


gitコマンドのdifftool代わりにいつでも使用できdiffます

すべての視覚的な差分のニーズに対して、すべてのオプションを含むgit difftool任意のgit diffコマンドの代わりに機能します。

たとえば、ファイルごとに実行するかどうかを尋ねずにビジュアルdiffツールを起動するには、-yオプションを追加します(通常、これが必要になると思います!!):

$ git difftool -y --staged

この場合、ビジュアル差分ツールで一度に1つずつ各ファイルをプルアップし、ツールを閉じた後に次のファイルを表示します。

または、でステージングされている特定のファイルの差分を確認しますIndex

$ git difftool -y --staged <<relative path/filename>>

すべてのオプションについては、manページを参照してください。

$ git difftool --help


Visual Gitツールの設定

デフォルト以外のビジュアルgitツールを使用するには、次の-t <tool>オプションを使用します。

$ git difftool -t <tool> <<other args>>

または、別のデフォルトのビジュアル差分ツールを使用するようにgitを構成する方法については、difftoolのマニュアルページを参照してください。


.gitconfig差分/マージツールとしてのvscodeのエントリの例

difftoolの設定の一部には、背後で.gitconfigファイルを変更するgitコマンドを使用してファイルを変更するか、直接編集することが含まれます。

あなたは.gitconfigあなたのホームディレクトリ(例えば~Unixやc:\users\<username>Windowsでは普通)で見つけることができます。

または、を使用.gitconfigして、デフォルトのGitエディターでユーザーを開くことができますgit config -e --global

以下は.gitconfig、VS Codeの私のグローバルユーザーの、diffツールとmergeツールの両方のエントリの例です。

[diff]
    tool = vscode
    guitool = vscode
[merge]
    tool = vscode
    guitool = vscode
[mergetool]
    prompt = true
[difftool "vscode"]
    cmd = code --wait --diff \"$LOCAL\" \"$REMOTE\"
    path = c:/apps/vscode/code.exe
[mergetool "vscode"]
    cmd = code --wait \"$MERGED\"
    path = c:/apps/vscode/code.exe

14

ステージング領域とリポジトリ(最後のコミット)の比較の使用

 $git diff --staged

このコマンドは、staged($ git add fileName)の変更を最後のコミットと比較します。ステージングした内容が次のコミットに入るのを見たい場合は、git diff --stagedを使用できます。このコマンドは、ステージングされた変更を最後のコミットと比較します。

作業とステージングの比較に使用

$ git diff 

このコマンドは、作業ディレクトリにあるものとステージング領域にあるものを比較します。git diff自体は、最後のコミット以降に行われたすべての変更を表示するのではなく、まだステージングされていない変更のみを表示することに注意することが重要です。すべての変更($ git add fileName)をステージングした場合、git diffは何も出力しません。

また、ファイル($ git add fileName)をステージングしてから編集する場合は、git diffを使用して、ステージングされているファイルの変更とステージングされていない変更を確認できます。


「動作中とリポジトリの比較に使用$ git diffgit diff作業中とステージングの比較は確かです。stackoverflow.com/a/1587952を
wisbucky

8

リモートリポジトリブランチをプッシュターゲットするつもりで、コミット変更ログでの最初のパスが不完全だった場合は、このようにプッシュする前にコミットステートメントを修正できます。

ローカルで

...変更を加えます...

git diff # look at unstaged changes

git commit -am"partial description of changes"

...コミットで言及されていない変更をさらに思い出してください...

git diff origin / master#段階的だがプッシュされていない変更を確認する

...ステージングされたコミットステートメントを修正...

git commit --amend -m"i missed mentioning these changes ...."

git push

7

段階的に変更されたファイルが複数ある場合はgit add -i、を使用してからを選択し6: diff、最後に目的のファイルを選択する方が現実的です。


6

デフォルトではgit diffを使用して、git更新ファイルのリストに追加されていない変更を表示します。ただし、追加またはタグ付けされた変更を表示する場合は、タグ付けまたは追加されたファイルdiffに関心があることをgitに通知する追加オプションを提供する必要があります。

$ git diff          # Default Use
$ git diff --cached # Can be used to show difference after adding the files 
$ git diff --staged # Same as 'git diff --cached' mostly used with latest version of git 

$ git diff 
diff --git a/x/y/z.js  b/x/y/z.js index 98fc22b..0359d84 100644
--- a/x/y/z.js 
+++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {

-        if (a)
+        if (typeof a !== 'undefined')
             res = 1;
         else
             res = 2;

$ git add x/y/z.js
$ git diff
$

ファイルを追加すると、デフォルトの「git diff」を使用できなくなります。次のようにする必要があります:-

$ git diff --cached
diff --git a/x/y/z.js  b/x/y/z.js index 98fc22b..0359d84 100644
    --- a/x/y/z.js 
    +++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {

    -        if (a)
    +        if (typeof a !== 'undefined')
                 res = 1;
             else
                 res = 2;

2

git guiおよびgit-colaは、インデックスを表示および操作できるグラフィカルユーティリティです。どちらにも、ステージングされたファイルの単純なビジュアル差分が含まれておりgit-cola、より洗練されたサイドバイサイドのビジュアル差分ツールを起動することもできます。

gitのインデックスからファイルを削除するにどうすればよいですか?また、Git-GUIクライアントのこの公式カタログ。


0

gitkgitで提供され、変更を確認するのに非常に役立つツールについても検討してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.