git-status(1)
=============

NAME
----
git-status - Show the working tree status


SYNOPSIS
--------

[synopsis]
git status [<options>] [--] [<pathspec>...]

DESCRIPTION
-----------
Displays paths that have differences between the index file and the
current HEAD commit, paths that have differences between the working
tree and the index file, and paths in the working tree that are not
tracked by Git (and are not ignored by linkgit:gitignore[5]). The first
are what you _would_ commit by running `git commit`; the second and
third are what you _could_ commit by running `git add` before running
`git commit`.

OPTIONS
-------

`-s`::
`--short`::
	Give the output in the short-format.

`-b`::
`--branch`::
	Show the branch and tracking info even in short-format.

`--show-stash`::
	Show the number of entries currently stashed away.

`--porcelain[=<version>]`::
	Give the output in an easy-to-parse format for scripts.
	This is similar to the short output, but will remain stable
	across Git versions and regardless of user configuration. See
	below for details.
+
The _<version>_ parameter is used to specify the format version.
This is optional and defaults to the original version `v1` format.

`--long`::
	Give the output in the long-format. This is the default.

`-v`::
`--verbose`::
	In addition to the names of files that have been changed, also
	show the textual changes that are staged to be committed
	(i.e., like the output of `git diff --cached`). If `-v` is specified
	twice, then also show the changes in the working tree that
	have not yet been staged (i.e., like the output of `git diff`).

`-u[<mode>]`::
`--untracked-files[=<mode>]`::
	Show untracked files.
+
--
The mode parameter is used to specify the handling of untracked files.
It is optional: it defaults to `all`, and if specified, it must be
stuck to the option (e.g. `-uno`, but not `-u no`).

The possible options are:

`no`:: Show no untracked files.
`normal`:: Show untracked files and directories.
`all`:: Also show individual files in untracked directories.

When `-u` option is not used, untracked files and directories are
shown (i.e. the same as specifying `normal`), to help you avoid
forgetting to add newly created files.  Because it takes extra work
to find untracked files in the filesystem, this mode may take some
time in a large working tree.
Consider enabling untracked cache and split index if supported (see
`git update-index --untracked-cache` and `git update-index
--split-index`), Otherwise you can use `no` to have `git status`
return more quickly without showing untracked files.
All usual spellings for Boolean value `true` are taken as `normal`
and `false` as `no`.

The default can be changed using the `status.showUntrackedFiles`
configuration variable documented in linkgit:git-config[1].
--

`--ignore-submodules[=<when>]`::
	Ignore changes to submodules when looking for changes. _<when>_ can be
	either `none`, `untracked`, `dirty` or `all`, which is the default.
`none`;; will consider the submodule modified when it either contains
	untracked or modified files or its HEAD differs from the commit recorded
	in the superproject and can be used to override any settings of the
	`ignore` option in linkgit:git-config[1] or linkgit:gitmodules[5].
`untracked`;; submodules are not considered dirty when they only
	contain untracked content (but they are still scanned for modified
	content).
`dirty`;; ignore all changes to the work tree of submodules,
	only changes to the commits stored in the superproject are shown (this was
	the behavior before 1.7.0).
`all`;; hide all changes to submodules
	(and suppresses the output of submodule summaries when the config option
	`status.submoduleSummary` is set).

`--ignored[=<mode>]`::
	Show ignored files as well.
+
--
The mode parameter is used to specify the handling of ignored files.
It is optional: it defaults to `traditional`.

The possible options are:

`traditional`:: Show ignored files and directories, unless
`--untracked-files=all` is specified, in which case
 individual files in ignored directories are
 displayed.
`no`:: Show no ignored files.
`matching`:: Show ignored files and directories matching an
ignore pattern.
+
Paths that explicitly match an
ignored pattern are shown. If a directory matches an ignore pattern,
then it is shown, but not paths contained in the ignored directory. If
a directory does not match an ignore pattern, but all contents are
ignored, then the directory is not shown, but all contents are shown.
--

`-z`::
	Terminate entries with _NUL_, instead of _LF_.  This implies
	the `--porcelain=v1` output format if no other format is given.

`--column[=<options>]`::
`--no-column`::
	Display untracked files in columns. See configuration variable
	`column.status` for option syntax. `--column` and `--no-column`
	without options are equivalent to `always` and `never`
	respectively.

`--ahead-behind`::
`--no-ahead-behind`::
	Display or do not display detailed ahead/behind counts for the
	branch relative to its upstream branch.  Defaults to `true`.

`--renames`::
`--no-renames`::
	Turn on/off rename detection regardless of user configuration.
	See also linkgit:git-diff[1] `--no-renames`.

`--find-renames[=<n>]`::
	Turn on rename detection, optionally setting the similarity
	threshold.
	See also linkgit:git-diff[1] `--find-renames`.

`<pathspec>...`::
	See the 'pathspec' entry in linkgit:gitglossary[7].

OUTPUT
------
The output from this command is designed to be used as a commit
template comment.
The default, long format, is designed to be human readable,
verbose and descriptive.  Its contents and format are subject to change
at any time.

The paths mentioned in the output, unlike many other Git commands, are
made relative to the current directory if you are working in a
subdirectory (this is on purpose, to help cutting and pasting). See
the status.relativePaths config option below.

Short Format
~~~~~~~~~~~~

In the short-format, the status of each path is shown as one of these
forms

	<xy> <path>
	<xy> <orig-path> -> <path>

where _<orig-path>_ is where the renamed/copied contents came
from. _<orig-path>_ is only shown when the entry is renamed or
copied. The _<xy>_ is a two-letter status code `XY`.

The fields (including the `->`) are separated from each other by a
single space. If a filename contains whitespace or other nonprintable
characters, that field will be quoted in the manner of a C string
literal: surrounded by ASCII double quote (34) characters, and with
interior special characters backslash-escaped.

There are three different types of states that are shown using this format, and
each one uses the _<xy>_ syntax differently:

* When a merge is occurring and the merge was successful, or outside of a merge
	situation, `X` shows the status of the index and `Y` shows the status of the
	working tree.
* When a merge conflict has occurred and has not yet been resolved, `X` and `Y`
	show the state introduced by each head of the merge, relative to the common
	ancestor. These paths are said to be _unmerged_.
* When a path is untracked, `X` and `Y` are always the same, since they are
	unknown to the index. `??` is used for untracked paths. Ignored files are
	not listed unless `--ignored` is used; if it is, ignored files are indicated
	by `!!`.

Note that the term _merge_ here also includes rebases using the default
`--merge` strategy, cherry-picks, and anything else using the merge machinery.

In the following table, these three classes are shown in separate sections, and
these characters are used for `X` and `Y` fields for the first two sections that
show tracked paths:

' ':: unmodified
`M`:: modified
`T`:: file type changed (regular file, symbolic link or submodule)
`A`:: added
`D`:: deleted
`R`:: renamed
`C`:: copied (if config option status.renames is set to "copies")
`U`:: updated but unmerged

[cols="^1m,^1m,<2",options="header"]
|===
|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
|===

Submodules have more state and instead report

`M`:: the submodule has a different HEAD than recorded in the index
`m`:: the submodule has modified content
`?`:: the submodule has untracked files

This is since modified content or untracked files in a submodule cannot be added
via `git add` in the superproject to prepare a commit.

`m` and `?` are applied recursively. For example if a nested submodule
in a submodule contains an untracked file, this is reported as `?` as well.

If `-b` is used the short-format status is preceded by a line

[synopsis]
{empty}## <branchname> <tracking-info>


Porcelain Format Version 1
~~~~~~~~~~~~~~~~~~~~~~~~~~

Version 1 porcelain format is similar to the short format, but is guaranteed
not to change in a backwards-incompatible way between Git versions or
based on user configuration. This makes it ideal for parsing by scripts.
The description of the short format above also describes the porcelain
format, with a few exceptions:

1. The user's `color.status` configuration is not respected; color will
   always be off.

2. The user's `status.relativePaths` configuration is not respected; paths
   shown will always be relative to the repository root.

There is also an alternate `-z` format recommended for machine parsing. In
that format, the status field is the same, but some other things
change.  First, the `->` is omitted from rename entries and the field
order is reversed (e.g `from -> to` becomes `to from`). Second, a _NUL_
(ASCII 0) follows each filename, replacing space as a field separator
and the terminating newline (but a space still separates the status
field from the first filename).  Third, filenames containing special
characters are not specially formatted; no quoting or
backslash-escaping is performed.

Any submodule changes are reported as modified `M` instead of `m` or single `?`.

Porcelain Format Version 2
~~~~~~~~~~~~~~~~~~~~~~~~~~

Version 2 format adds more detailed information about the state of
the worktree and changed items.  Version 2 also defines an extensible
set of easy to parse optional headers.

Header lines start with `#` and are added in response to specific
command line arguments.  Parsers should ignore headers they
don't recognize.

Branch Headers
^^^^^^^^^^^^^^

If `--branch` is given, a series of header lines are printed with
information about the current branch.

[cols="<1,<1",options="header"]
|===
|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.
|===

Stash Information
^^^^^^^^^^^^^^^^^

If `--show-stash` is given, one line is printed showing the number of stash
entries if non-zero:

    # stash <N>

Changed Tracked Entries
^^^^^^^^^^^^^^^^^^^^^^^

Following the headers, a series of lines are printed for tracked
entries.  One of three different line formats may be used to describe
an entry depending on the type of change.  Tracked entries are printed
in an undefined order; parsers should allow for a mixture of the 3
line types in any order.

Ordinary changed entries have the following format:

[synopsis]
1 <XY> <sub> <mH> <mI> <mW> <hH> <hI> <path>

Renamed or copied entries have the following format:

[synopsis]
2 <XY> <sub> <mH> <mI> <mW> <hH> <hI> <X><score> <path><sep><origPath>

[cols="<1,<1a",options="header"]
|===
|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.
|===

Unmerged entries have the following format; the first character is
a "u" to distinguish from ordinary changed entries.

[synopsis]
u <XY> <sub> <m1> <m2> <m3> <mW> <h1> <h2> <h3> <path>

[cols="<1,<1a",options="header"]
|===
|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.
|===

Other Items
^^^^^^^^^^^

Following the tracked entries (and if requested), a series of
lines will be printed for untracked and then ignored items
found in the worktree.

Untracked items have the following format:

    ? <path>

Ignored items have the following format:

    ! <path>

Pathname Format Notes and -z
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

When the `-z` option is given, pathnames are printed as is and
without any quoting and lines are terminated with a _NUL_ (ASCII 0x00)
byte.

Without the `-z` option, pathnames with "unusual" characters are
quoted as explained for the configuration variable `core.quotePath`
(see linkgit:git-config[1]).


CONFIGURATION
-------------

The command honors `color.status` (or `status.color` -- they
mean the same thing and the latter is kept for backward
compatibility) and `color.status.<slot>` configuration variables
to colorize its output.

If the config variable `status.relativePaths` is set to false, then all
paths shown are relative to the repository root, not to the current
directory.

If `status.submoduleSummary` is set to a non zero number or true (identical
to -1 or an unlimited number), the submodule summary will be enabled for
the long format and a summary of commits for modified submodules will be
shown (see `--summary-limit` option of linkgit:git-submodule[1]). Please note
that the summary output from the status command will be suppressed for all
submodules when `diff.ignoreSubmodules` is set to `all` or only for those
submodules where `submodule.<name>.ignore=all`. To also view the summary for
ignored submodules you can either use the `--ignore-submodules=dirty` command
line option or the 'git submodule summary' command, which shows a similar
output but does not honor these settings.

BACKGROUND REFRESH
------------------

By default, `git status` will automatically refresh the index, updating
the cached stat information from the working tree and writing out the
result. Writing out the updated index is an optimization that isn't
strictly necessary (`status` computes the values for itself, but writing
them out is just to save subsequent programs from repeating our
computation). When `status` is run in the background, the lock held
during the write may conflict with other simultaneous processes, causing
them to fail. Scripts running `status` in the background should consider
using `git --no-optional-locks status` (see linkgit:git[1] for details).

UNTRACKED FILES AND PERFORMANCE
-------------------------------

`git status` can be very slow in large worktrees if/when it
needs to search for untracked files and directories. There are
many configuration options available to speed this up by either
avoiding the work or making use of cached results from previous
Git commands. There is no single optimum set of settings right
for everyone. We'll list a summary of the relevant options to help
you, but before going into the list, you may want to run `git status`
again, because your configuration may already be caching `git status`
results, so it could be faster on subsequent runs.

* The `--untracked-files=no` flag or the
	`status.showUntrackedFiles=no` config (see above for both):
	indicate that `git status` should not report untracked
	files. This is the fastest option. `git status` will not list
	the untracked files, so you need to be careful to remember if
	you create any new files and manually `git add` them.

* `advice.statusUoption=false` (see linkgit:git-config[1]):
	setting this variable to `false` disables the warning message
	given when enumerating untracked files takes more than 2
	seconds.  In a large project, it may take longer and the user
	may have already accepted the trade off (e.g. using `-uno` may
	not be an acceptable option for the user), in which case, there
	is no point issuing the warning message, and in such a case,
	disabling the warning may be the best.

* `core.untrackedCache=true` (see linkgit:git-update-index[1]):
	enable the untracked cache feature and only search directories
	that have been modified since the previous `git status` command.
	Git remembers the set of untracked files within each directory
	and assumes that if a directory has not been modified, then
	the set of untracked files within has not changed.  This is much
	faster than enumerating the contents of every directory, but still
	not without cost, because Git still has to search for the set of
	modified directories. The untracked cache is stored in the
	`.git/index` file. The reduced cost of searching for untracked
	files is offset slightly by the increased size of the index and
	the cost of keeping it up-to-date. That reduced search time is
	usually worth the additional size.

* `core.untrackedCache=true` and `core.fsmonitor=true` or
	`core.fsmonitor=<hook-command-pathname>` (see
	linkgit:git-update-index[1]): enable both the untracked cache
	and FSMonitor features and only search directories that have
	been modified since the previous `git status` command.  This
	is faster than using just the untracked cache alone because
	Git can also avoid searching for modified directories.  Git
	only has to enumerate the exact set of directories that have
	changed recently. While the FSMonitor feature can be enabled
	without the untracked cache, the benefits are greatly reduced
	in that case.

Note that after you turn on the untracked cache and/or FSMonitor
features it may take a few `git status` commands for the various
caches to warm up before you see improved command times.  This is
normal.

SEE ALSO
--------
linkgit:gitignore[5]

GIT
---
Part of the linkgit:git[1] suite
