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

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


SYNOPSIS
--------
[verse]
'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' - Shows untracked files and directories.
	- 'all'    - Also shows 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.
+
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.
	Using "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]. When
	"untracked" is used submodules are not considered dirty when they only
	contain untracked content (but they are still scanned for modified
	content). Using "dirty" ignores 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). Using "all" hides 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' - Shows ignored files and directories, unless
			  --untracked-files=all is specifed, in which case
			  individual files in ignored directories are
			  displayed.
	- 'no'	        - Show no ignored files.
	- 'matching'    - Shows ignored files and directories matching an
			  ignore pattern.
+
When 'matching' mode is specified, paths that explicity 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.

<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

	XY PATH1 -> PATH2

where `PATH1` is the path in the `HEAD`, and the " `-> PATH2`" part is
shown only when `PATH1` corresponds to a different path in the
index/worktree (i.e. the file is renamed). The `XY` is a two-letter
status code.

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.

For paths with merge conflicts, `X` and `Y` show the modification
states of each side of the merge. For paths that do not have merge
conflicts, `X` shows the status of the index, and `Y` shows the status
of the work tree.  For untracked paths, `XY` are `??`.  Other status
codes can be interpreted as follows:

* ' ' = unmodified
* 'M' = modified
* 'A' = added
* 'D' = deleted
* 'R' = renamed
* 'C' = copied
* 'U' = updated but unmerged

Ignored files are not listed, unless `--ignored` option is in effect,
in which case `XY` are `!!`.

    X          Y     Meaning
    -------------------------------------------------
              [MD]   not updated
    M        [ MD]   updated in index
    A        [ MD]   added to index
    D         [ M]   deleted from index
    R        [ MD]   renamed in index
    C        [ MD]   copied in index
    [MARC]           index and work tree matches
    [ MARC]     M    work tree changed since index
    [ MARC]     D    deleted 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
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

    ## 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.

    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.
    ------------------------------------------------------------

### 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:

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

Renamed or copied entries have the following format:

    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 path in the index and in the working tree.
    <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.  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.

    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.
    --------------------------------------------------------

### 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).

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

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