日本語 ▾ トピック ▾ 最新バージョン ▾ git-status は 2.45.0 で最終更新されました

名前

git-status - ワーキングツリーのステータスを表示する

概要

git status [<options>] [--] [<pathspec>…​]

説明

インデックスファイルと現在のHEADコミットの間で差分があるパス、ワーキングツリーとインデックスファイルの間で差分があるパス、そしてGitに追跡されていない(かつgitignore[5]で無視されていない)ワーキングツリー内のパスを表示します。最初のものはgit commitを実行することでコミットされるだろうものであり、2番目と3番目のものはgit commitを実行する前にgit addを実行することでコミットできるだろうものです。

オプション

-s
--short

出力をショートフォーマットで表示します。

-b
--branch

ショートフォーマットでもブランチと追跡情報を表示します。

--show-stash

現在スタッシュされているエントリの数を表示します。

--porcelain[=<version>]

スクリプトで解析しやすい形式で出力を表示します。これはショート出力に似ていますが、Gitのバージョン間で安定しており、ユーザー設定に依存しません。詳細は以下を参照してください。

バージョンパラメータは、フォーマットのバージョンを指定するために使用されます。これはオプションであり、デフォルトは元のバージョンv1フォーマットです。

--long

出力をロングフォーマットで表示します。これがデフォルトです。

-v
--verbose

変更されたファイル名の他に、コミットされるようにステージングされたテキストの変更(つまり、git diff --cachedの出力と同様)も表示します。-vを2回指定すると、まだステージングされていないワーキングツリー内の変更(つまり、git diffの出力と同様)も表示します。

-u[<mode>]
--untracked-files[=<mode>]

追跡されていないファイルを表示します。

modeパラメータは、追跡されていないファイルの扱いを指定するために使用されます。これはオプションです。デフォルトはallであり、指定する場合はオプションに続けて記述する必要があります(例: -uno-u noは不可)。

指定可能なオプションは以下の通りです

  • no - 追跡されていないファイルを何も表示しません。

  • normal - 追跡されていないファイルとディレクトリを表示します。

  • all - 追跡されていないディレクトリ内の個々のファイルも表示します。

-uオプションが使用されていない場合、新しく作成されたファイルの追加忘れを防ぐために、追跡されていないファイルとディレクトリが表示されます(つまり、normalを指定した場合と同じです)。ファイルシステムで追跡されていないファイルを見つけるには余分な作業が必要なため、このモードでは大規模なワーキングツリーでは時間がかかる場合があります。サポートされている場合は、アン・トラッキングキャッシュと分割インデックスを有効にすることを検討してください(git update-index --untracked-cachegit update-index --split-indexを参照)。そうでない場合は、noを使用してgit statusをより速く返し、追跡されていないファイルを表示しないようにすることができます。Boolean値のtrueのすべての通常の綴りはnormalとして、falsenoとして扱われます。

デフォルトはgit-config[1]に記述されているstatus.showUntrackedFiles設定変数を使用して変更できます。

--ignore-submodules[=<when>]

変更を探す際にサブモジュールへの変更を無視します。<when>は"none"、"untracked"、"dirty"、またはデフォルトの"all"のいずれかです。"none"を使用すると、サブモジュールに追跡されていないファイルまたは変更されたファイルが含まれている場合、あるいはそのHEADがスーパープロジェクトに記録されているコミットと異なる場合に、サブモジュールが変更されたとみなされます。これはgit-config[1]またはgitmodules[5]ignoreオプションの設定を上書きするために使用できます。"untracked"を使用した場合、サブモジュールは追跡されていないコンテンツのみを含む場合にはダーティとみなされません(しかし、変更されたコンテンツについては引き続きスキャンされます)。"dirty"を使用すると、サブモジュールのワーキングツリーへのすべての変更が無視され、スーパープロジェクトに格納されているコミットへの変更のみが表示されます(これは1.7.0より前の動作でした)。"all"を使用すると、サブモジュールへのすべての変更が非表示になります(およびconfigオプションstatus.submoduleSummaryが設定されている場合、サブモジュールの概要の出力が抑制されます)。

--ignored[=<mode>]

無視されたファイルも表示します。

modeパラメータは、無視されたファイルの扱いを指定するために使用されます。これはオプションであり、デフォルトはtraditionalです。

指定可能なオプションは以下の通りです

  • traditional - 無視されたファイルとディレクトリを表示します。ただし、--untracked-files=allが指定されている場合は、無視されたディレクトリ内の個々のファイルが表示されます。

  • no - 無視されたファイルは何も表示しません。

  • matching - 無視パターンに一致する無視されたファイルとディレクトリを表示します。

matchingモードが指定されている場合、無視パターンに明示的に一致するパスが表示されます。ディレクトリが無視パターンに一致する場合、そのディレクトリは表示されますが、無視されたディレクトリに含まれるパスは表示されません。ディレクトリが無視パターンに一致しないが、すべての内容が無視されている場合、そのディレクトリは表示されませんが、すべての内容が表示されます。

-z

エントリをLFではなくNULで終了します。他のフォーマットが指定されていない場合、これは--porcelain=v1出力フォーマットを意味します。

--column[=<options>]
--no-column

追跡されていないファイルをカラム表示します。オプションの構文については、設定変数column.statusを参照してください。オプションなしの--column--no-columnは、それぞれalwaysneverと同じです。

--ahead-behind
--no-ahead-behind

ブランチとその上流ブランチに対する詳細な先行/遅延の数を表示するかどうかを決定します。デフォルトはtrueです。

--renames
--no-renames

ユーザー設定に関わらず、名前変更検出を有効/無効にします。git-diff[1]--no-renamesも参照してください。

--find-renames[=<n>]

名前変更検出を有効にし、必要に応じて類似度しきい値を設定します。git-diff[1]--find-renamesも参照してください。

<pathspec>…​

gitglossary[7]pathspecエントリを参照してください。

出力

このコマンドの出力は、コミットテンプレートコメントとして使用されるように設計されています。デフォルトのロングフォーマットは、人間が読みやすく、冗長で、記述的になるように設計されています。その内容とフォーマットはいつでも変更される可能性があります。

出力で言及されているパスは、他の多くのGitコマンドとは異なり、サブディレクトリで作業している場合は現在のディレクトリを基準とします(これは、切り取りと貼り付けを助けるため、意図的なものです)。以下のstatus.relativePaths設定オプションを参照してください。

ショートフォーマット

ショートフォーマットでは、各パスのステータスは以下のいずれかの形式で表示されます。

XY PATH
XY ORIG_PATH -> PATH

ここでORIG_PATHは、名前が変更またはコピーされたコンテンツの元の場所です。ORIG_PATHはエントリの名前が変更またはコピーされた場合にのみ表示されます。XYは2文字のステータスコードです。

フィールド(->を含む)は単一スペースで区切られます。ファイル名に空白やその他の表示不可能な文字が含まれている場合、そのフィールドはC言語の文字列リテラルのように引用符で囲まれます: ASCII二重引用符 (34) 文字で囲まれ、内部の特殊文字はバックスラッシュでエスケープされます。

このフォーマットを使用して表示される状態には3つの異なるタイプがあり、それぞれがXY構文を異なる方法で使用します。

  • マージが進行中でマージが成功した場合、またはマージ状況以外では、Xはインデックスのステータスを示し、Yはワーキングツリーのステータスを示します。

  • マージ競合が発生し、まだ解決されていない場合、XYは、共通の祖先に対する各マージヘッドによって導入された状態を示します。これらのパスは未マージであると言われます。

  • パスが追跡されていない場合、インデックスには不明であるため、XYは常に同じです。追跡されていないパスには??が使用されます。無視されたファイルは--ignoredが使用されない限りリストされません。使用される場合、無視されたファイルは!!で示されます。

ここでいうマージという用語には、デフォルトの--merge戦略を使用するリベース、cherry-pick、およびその他のマージ機構を使用するものも含まれることに注意してください。

次の表では、これら3つのクラスは別々のセクションで示されており、追跡されたパスを示す最初の2つのセクションでは、XおよびYフィールドにこれらの文字が使用されます。

  • ' ' = 未変更

  • M = 変更済み

  • T = ファイルタイプが変更された(通常ファイル、シンボリックリンク、またはサブモジュール)

  • A = 追加済み

  • D = 削除済み

  • R = 名前変更済み

  • C = コピー済み (configオプションstatus.renamesが"copies"に設定されている場合)

  • U = 更新済みだが未マージ

X          Y     Meaning
-------------------------------------------------
	 [AMD]   not updated
M        [ MTD]  updated in index
T        [ MTD]  type changed in index
A        [ MTD]  added to index
D                deleted from index
R        [ MTD]  renamed in index
C        [ MTD]  copied in index
[MTARC]          index and work tree matches
[ MTARC]    M    work tree changed since index
[ MTARC]    T    type changed in work tree since index
[ MTARC]    D    deleted in work tree
	    R    renamed in work tree
	    C    copied in work tree
-------------------------------------------------
D           D    unmerged, both deleted
A           U    unmerged, added by us
U           D    unmerged, deleted by them
U           A    unmerged, added by them
D           U    unmerged, deleted by us
A           A    unmerged, both added
U           U    unmerged, both modified
-------------------------------------------------
?           ?    untracked
!           !    ignored
-------------------------------------------------

サブモジュールはより多くの状態を持ち、代わりに次を報告します。

  • M = サブモジュールがインデックスに記録されているものと異なるHEADを持っている

  • m = サブモジュールが変更されたコンテンツを持っている

  • ? = サブモジュールが追跡されていないファイルを持っている

これは、サブモジュール内の変更されたコンテンツや追跡されていないファイルは、コミットを準備するためにスーパープロジェクトでgit addを介して追加できないためです。

m?は再帰的に適用されます。例えば、サブモジュール内のネストされたサブモジュールに追跡されていないファイルが含まれている場合も、これも?として報告されます。

-bが使用されている場合、ショートフォーマットのステータスの前に以下の行が表示されます。

## branchname tracking info

Porcelain フォーマット バージョン 1

Porcelainフォーマットのバージョン1はショートフォーマットに似ていますが、Gitのバージョン間やユーザー設定によって後方互換性のない変更が行われないことが保証されています。そのため、スクリプトによる解析に最適です。上記のショートフォーマットの説明は、Porcelainフォーマットも説明していますが、いくつかの例外があります。

  1. ユーザーのcolor.status設定は尊重されません。色は常にオフになります。

  2. ユーザーのstatus.relativePaths設定は尊重されません。表示されるパスは常にリポジトリのルートに対する相対パスになります。

マシン解析用に推奨される別の-zフォーマットもあります。そのフォーマットでは、ステータスフィールドは同じですが、他のいくつかの変更点があります。まず、名前変更エントリから->が省略され、フィールドの順序が逆になります(例: from -> toto fromになります)。次に、各ファイル名の後にNUL(ASCII 0)が続き、フィールドセパレータと終端の改行の代わりにスペース(ただし、ステータスフィールドと最初のファイル名の間は引き続きスペースで区切られます)が使用されます。第三に、特殊文字を含むファイル名は特別にフォーマットされません。引用符やバックスラッシュエスケープは行われません。

サブモジュールの変更は、mや単一の?ではなく、変更済みMとして報告されます。

Porcelain フォーマット バージョン 2

バージョン2フォーマットでは、ワーキングツリーの状態と変更されたアイテムに関するより詳細な情報が追加されます。バージョン2では、解析しやすいオプションヘッダーの拡張可能なセットも定義されています。

ヘッダー行は「#」で始まり、特定のコマンドライン引数に応じて追加されます。パーサーは認識しないヘッダーを無視する必要があります。

ブランチヘッダー

--branchが指定されている場合、現在のブランチに関する情報を持つ一連のヘッダー行が出力されます。

Line                                     Notes
------------------------------------------------------------
# branch.oid <commit> | (initial)        Current commit.
# branch.head <branch> | (detached)      Current branch.
# branch.upstream <upstream-branch>      If upstream is set.
# branch.ab +<ahead> -<behind>           If upstream is set and
					 the commit is present.
------------------------------------------------------------

スタッシュ情報

--show-stashが指定されている場合、スタッシュエントリの数がゼロでない場合は、その数を示す1行が出力されます。

# stash <N>

変更された追跡済みエントリ

ヘッダーに続いて、追跡されたエントリに関する一連の行が出力されます。変更の種類に応じて、3つの異なる行フォーマットのいずれかがエントリを記述するために使用されます。追跡されたエントリは未定義の順序で出力されます。パーサーは3種類の行が任意の順序で混在することを許容する必要があります。

通常の変更されたエントリは以下のフォーマットを持ちます。

1 <XY> <sub> <mH> <mI> <mW> <hH> <hI> <path>

名前が変更された、またはコピーされたエントリは以下のフォーマットを持ちます。

2 <XY> <sub> <mH> <mI> <mW> <hH> <hI> <X><score> <path><sep><origPath>
Field       Meaning
--------------------------------------------------------
<XY>        A 2 character field containing the staged and
	    unstaged XY values described in the short format,
	    with unchanged indicated by a "." rather than
	    a space.
<sub>       A 4 character field describing the submodule state.
	    "N..." when the entry is not a submodule.
	    "S<c><m><u>" when the entry is a submodule.
	    <c> is "C" if the commit changed; otherwise ".".
	    <m> is "M" if it has tracked changes; otherwise ".".
	    <u> is "U" if there are untracked changes; otherwise ".".
<mH>        The octal file mode in HEAD.
<mI>        The octal file mode in the index.
<mW>        The octal file mode in the worktree.
<hH>        The object name in HEAD.
<hI>        The object name in the index.
<X><score>  The rename or copy score (denoting the percentage
	    of similarity between the source and target of the
	    move or copy). For example "R100" or "C75".
<path>      The pathname.  In a renamed/copied entry, this
	    is the target path.
<sep>       When the `-z` option is used, the 2 pathnames are separated
	    with a NUL (ASCII 0x00) byte; otherwise, a tab (ASCII 0x09)
	    byte separates them.
<origPath>  The pathname in the commit at HEAD or in the index.
	    This is only present in a renamed/copied entry, and
	    tells where the renamed/copied contents came from.
--------------------------------------------------------

未マージのエントリは以下のフォーマットを持ちます。最初の文字は通常の変更されたエントリと区別するために「u」です。

u <XY> <sub> <m1> <m2> <m3> <mW> <h1> <h2> <h3> <path>
Field       Meaning
--------------------------------------------------------
<XY>        A 2 character field describing the conflict type
	    as described in the short format.
<sub>       A 4 character field describing the submodule state
	    as described above.
<m1>        The octal file mode in stage 1.
<m2>        The octal file mode in stage 2.
<m3>        The octal file mode in stage 3.
<mW>        The octal file mode in the worktree.
<h1>        The object name in stage 1.
<h2>        The object name in stage 2.
<h3>        The object name in stage 3.
<path>      The pathname.
--------------------------------------------------------

その他のアイテム

追跡されたエントリ(および要求された場合)に続いて、ワーキングツリーで見つかった追跡されていないアイテム、次いで無視されたアイテムに関する一連の行が出力されます。

追跡されていないアイテムは以下のフォーマットを持ちます。

? <path>

無視されたアイテムは以下のフォーマットを持ちます。

! <path>

パス名フォーマットに関する注記と -z

-zオプションが指定されている場合、パス名は引用符なしでそのまま出力され、行はNUL(ASCII 0x00)バイトで終了します。

-zオプションがない場合、"特殊"文字を含むパス名は、設定変数core.quotePathgit-config[1]を参照)で説明されているように引用符で囲まれます。

設定

このコマンドは、出力を色付けするためにcolor.status(またはstatus.color — これらは同じ意味で、後者は後方互換性のために残されています)とcolor.status.<slot>の設定変数を尊重します。

設定変数status.relativePathsがfalseに設定されている場合、表示されるすべてのパスは、現在のディレクトリではなく、リポジトリルートからの相対パスになります。

status.submoduleSummaryがゼロ以外の数値またはtrue(-1または無制限の数値と同じ)に設定されている場合、ロングフォーマットのサブモジュール概要が有効になり、変更されたサブモジュールのコミットの概要が表示されます(git-submodule[1]の--summary-limitオプションを参照)。diff.ignoreSubmodulesallに設定されている場合、またはsubmodule.<name>.ignore=allが設定されているサブモジュールのみ、statusコマンドからの概要出力はすべてのサブモジュールで抑制されることに注意してください。無視されたサブモジュールの概要も表示するには、--ignore-submodules=dirtyコマンドラインオプションを使用するか、同様の出力を表示するがこれらの設定を尊重しないgit submodule summaryコマンドを使用できます。

バックグラウンドでのリフレッシュ

デフォルトでは、git statusは自動的にインデックスをリフレッシュし、ワーキングツリーからキャッシュされたstat情報を更新し、結果を書き出します。更新されたインデックスを書き出すのは、厳密には必要ない最適化です(statusはそれ自体で値を計算しますが、書き出すのは後続のプログラムが私たちの計算を繰り返す手間を省くためです)。statusがバックグラウンドで実行される場合、書き込み中に保持されるロックが他の同時プロセスと競合し、それらを失敗させる可能性があります。バックグラウンドでstatusを実行するスクリプトは、git --no-optional-locks statusを使用することを検討すべきです(詳細についてはgit[1]を参照してください)。

追跡されていないファイルとパフォーマンス

git statusは、追跡されていないファイルやディレクトリを検索する必要がある場合に、大規模なワーキングツリーで非常に遅くなることがあります。作業を回避するか、以前のGitコマンドのキャッシュ結果を利用することによって、これを高速化するための多くの設定オプションが利用可能です。すべての人にとって最適な設定の組み合わせは一つではありません。関連するオプションの概要を説明しますが、リストに入る前に、git statusを再度実行することをお勧めします。設定によっては、すでにgit statusの結果がキャッシュされている場合があり、その後の実行が速くなる可能性があるためです。

  • --untracked-files=noフラグまたはstatus.showUntrackedFiles=no設定(両方については上記を参照):git statusが追跡されていないファイルを報告しないように指示します。これが最速のオプションです。git statusは追跡されていないファイルをリストしないため、新しくファイルを作成した場合は手動でgit addするのを忘れないように注意する必要があります。

  • advice.statusUoption=falsegit-config[1]を参照):この変数をfalseに設定すると、追跡されていないファイルを列挙するのに2秒以上かかった場合に表示される警告メッセージが無効になります。大規模なプロジェクトでは、さらに時間がかかる場合があり、ユーザーはすでにトレードオフを受け入れている可能性があります(例:「-uno」の使用はユーザーにとって許容できないオプションかもしれません)。このような場合、警告メッセージを発行する意味がなく、警告を無効にするのが最善かもしれません。

  • core.untrackedCache=truegit-update-index[1]を参照):追跡されていないキャッシュ機能を有効にし、以前のgit statusコマンド以降に修正されたディレクトリのみを検索します。Gitは各ディレクトリ内の追跡されていないファイルのセットを記憶し、ディレクトリが修正されていない場合、その中の追跡されていないファイルのセットも変更されていないと仮定します。これはすべてのディレクトリの内容を列挙するよりもはるかに高速ですが、Gitが変更されたディレクトリのセットを検索する必要があるため、コストがかからないわけではありません。追跡されていないキャッシュは.git/indexファイルに保存されます。追跡されていないファイルの検索コストの削減は、インデックスサイズの増加と、それを最新の状態に保つコストによってわずかに相殺されます。通常、検索時間の短縮は、追加のサイズに見合う価値があります。

  • core.untrackedCache=trueおよびcore.fsmonitor=trueまたはcore.fsmonitor=<hook-command-pathname>git-update-index[1]を参照):追跡されていないキャッシュ機能とFSMonitor機能の両方を有効にし、以前のgit statusコマンド以降に修正されたディレクトリのみを検索します。これは、Gitが修正されたディレクトリの検索も回避できるため、追跡されていないキャッシュのみを使用する場合よりも高速です。Gitは、最近変更されたディレクトリの正確なセットを列挙するだけで済みます。FSMonitor機能は追跡されていないキャッシュなしで有効にできますが、その場合、利点は大幅に減少します。

追跡されていないキャッシュやFSMonitor機能を有効にした後、コマンド時間の改善が見られるまでに、いくつかのgit statusコマンドで様々なキャッシュがウォームアップする必要がある場合があることに注意してください。これは正常です。

関連項目

GIT

git[1] スイートの一部

scroll-to-top