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::
	Show ignored files as well.

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

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

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