Git
英語 ▾ トピック ▾ 最新バージョン ▾ 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[=<バージョン>]

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

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

--long

出力を長形式で表示します。これがデフォルトです。

-v
--verbose

変更されたファイルの名前だけでなく、コミットされるようにステージングされたテキストの変更も表示します(つまり、`git diff --cached` の出力のように)。 `-v` が 2 回指定された場合、ステージングされていない作業ツリーの変更も表示します(つまり、`git diff` の出力のように)。

-u[<モード>]
--untracked-files[=<モード>]

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

モードパラメータは、追跡されていないファイルの処理方法を指定するために使用されます。これはオプションです。デフォルトは *all* で、指定する場合はオプションに付ける必要があります(例: `-uno`、`-u no` ではありません)。

可能なオプションは次のとおりです

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

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

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

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

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

--ignore-submodules[=<タイミング>]

変更を探す際に、サブモジュールの変更を無視します。<タイミング> は、「none」、「untracked」、「dirty」、またはデフォルトの「all」のいずれかになります。「none」を使用すると、サブモジュールに変更されていないファイルまたは追跡されていないファイルが含まれている場合、またはその HEAD がスーパープロジェクトに記録されているコミットと異なる場合に、サブモジュールが変更されたと見なされ、git-config[1] または gitmodules[5] の *ignore* オプションの設定をオーバーライドするために使用できます。「untracked」が使用されている場合、サブモジュールは追跡されていないコンテンツのみを含んでいる場合はダーティとは見なされません(ただし、変更されたコンテンツのスキャンは引き続き行われます)。「dirty」を使用すると、サブモジュールの作業ツリーに対するすべての変更が無視され、スーパープロジェクトに保存されているコミットの変更のみが表示されます(これは 1.7.0 より前の動作でした)。「all」を使用すると、サブモジュールのすべての変更が非表示になります(また、設定オプション `status.submoduleSummary` が設定されている場合、サブモジュールサマリの出力が抑制されます)。

--ignored[=<モード>]

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

モードパラメータは、無視されたファイルの処理方法を指定するために使用されます。これはオプションです。デフォルトは *traditional* です。

可能なオプションは次のとおりです

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

  • *no* - 無視されたファイルを表示しません。

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

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

-z

LF の代わりに NUL でエントリを終了します。他の形式が指定されていない場合、これは `--porcelain=v1` 出力形式を意味します。

--column[=<オプション>]
--no-column

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

--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戦略を使用したリベース、チェリーピック、およびマージ機構を使用するその他のものが含まれます。

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

  • ' ' = 変更なし

  • M = 変更済み

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

  • A = 追加済み

  • D = 削除済み

  • R = 名前変更済み

  • C = コピー済み(設定オプション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

バージョン1のPorcelain形式は短縮形式に似ていますが、Gitのバージョン間またはユーザー設定に基づいて後方互換性のない方法で変更されないことが保証されています。これにより、スクリプトによる解析に最適です。上記の短縮形式の説明は、いくつかの例外を除いて、Porcelain形式についても説明しています。

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

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

マシンによる解析に推奨される代替の-z形式もあります。この形式では、ステータスフィールドは同じですが、他の点が変更されます。まず、名前変更エントリから* -> *が省略され、フィールドの順序が逆になります(例:* from -> to *は* to from *になります)。次に、各ファイル名の後にNUL(ASCII 0)が続き、フィールド区切り文字としてスペースと末尾の改行が置き換えられます(ただし、スペースはステータスフィールドと最初のファイル名を区切ります)。3つ目は、特殊文字を含むファイル名は特別な形式でフォーマットされません。引用符やバックスラッシュエスケープは実行されません。

サブモジュールの変更は、`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.quotePath`について説明されているように引用符で囲まれます(git-config [1]を参照)。

設定

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

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

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

バックグラウンド更新

デフォルトでは、`git status`はインデックスを自動的に更新し、作業ツリーからキャッシュされた統計情報を更新し、結果を書き出します。更新されたインデックスの書き出しは、厳密には必要のない最適化です(`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 = false`(git-config [1]を参照):この変数を`false`に設定すると、追跡されていないファイルの列挙に2秒以上かかった場合に表示される警告メッセージが無効になります。大規模なプロジェクトでは、時間がかかる場合があり、ユーザーはすでにトレードオフを受け入れている可能性があります(たとえば、 "-uno"を使用することはユーザーにとって許容できるオプションではない場合があります)。その場合、警告メッセージを出す意味はなく、そのような場合は警告を無効にするのが最善です。

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

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

untracked cache または FSMonitor 機能、あるいはその両方を有効にした後、コマンドの実行時間が改善されるまで、数回の git status コマンドの実行が必要になる場合があります。 これは正常な動作です。

関連項目

GIT

git[1] スイートの一部

scroll-to-top