日本語 ▾ トピック ▾ 最新バージョン ▾ 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をより迅速に返すことができます。ブール値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」を使用すると、サブモジュールへのすべての変更が非表示になります(そして、設定オプション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にオプションがない場合は、それぞれ_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は、共通の祖先に対するマージの各HEADによって導入された状態を示します。これらのパスは_unmerged_(未マージ)と呼ばれます。

  • パスが追跡されていない場合、インデックスには不明であるため、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が使用される場合、短い形式のステータスの前に1行が続きます。

## branchname tracking info

ポーセリン形式バージョン1

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

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

  2. ユーザーのstatus.relativePaths設定は尊重されません。表示されるパスは常にリポジトリのルートを基準とします。

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

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

ポーセリン形式バージョン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>設定変数を尊重して、その出力を色付けします。

config変数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コマンドからのキャッシュされた結果を利用することによって、これを高速化するために利用できる多くの構成オプションがあります。すべての人にとって最適な設定のセットは1つではありません。役立つ関連オプションの概要をリストしますが、リストに入る前に、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=truecore.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