Skip to content
Snippets Groups Projects
git-status.txt 19.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    git-status(1)
    =============
    
    NAME
    ----
    git-status - Show the working tree status
    
    
    SYNOPSIS
    --------
    [verse]
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    'git status' [<options>] [--] [<pathspec>...]
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    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.
    
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    --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.
    +
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    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`).
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    The possible options are:
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    	- 'no'     - Show no untracked files.
    	- 'normal' - Shows untracked files and directories.
    	- 'all'    - Also shows individual files in untracked directories.
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    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.
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    The default can be changed using the status.showUntrackedFiles
    configuration variable documented in linkgit:git-config[1].
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    --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>]::
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    	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 specified, 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 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.
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    -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
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    	`column.status` for option syntax. `--column` and `--no-column`
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    	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].
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    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
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    
    	XY PATH
    	XY ORIG_PATH -> PATH
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    
    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.
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    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.
    
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    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:
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    * ' ' = unmodified
    * 'M' = modified
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    * 'T' = file type changed (regular file, symbolic link or submodule)
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    * 'A' = added
    * 'D' = deleted
    * 'R' = renamed
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    * 'C' = copied (if config option status.renames is set to "copies")
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    * 'U' = updated but unmerged
    
    
    ....
    X          Y     Meaning
    -------------------------------------------------
    	 [AMD]   not updated
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    M        [ MTD]  updated in index
    T        [ MTD]  type changed in index
    A        [ MTD]  added to index
    
    D                deleted from index
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    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
    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.
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    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 `?`.
    
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    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.
    
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    Branch Headers
    ^^^^^^^^^^^^^^
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    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.
    ------------------------------------------------------------
    ....
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    
    Stash Information
    ^^^^^^^^^^^^^^^^^
    
    If `--show-stash` is given, one line is printed showing the number of stash
    entries if non-zero:
    
        # stash <N>
    
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    Changed Tracked Entries
    ^^^^^^^^^^^^^^^^^^^^^^^
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    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 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.
    --------------------------------------------------------
    ....
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    Unmerged entries have the following format; the first character is
    a "u" to distinguish from ordinary changed entries.
    
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
        u <XY> <sub> <m1> <m2> <m3> <mW> <h1> <h2> <h3> <path>
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    
    ....
    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.
    --------------------------------------------------------
    ....
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    Other Items
    ^^^^^^^^^^^
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    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>
    
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    Pathname Format Notes and -z
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    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).
    
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    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=false` 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.
    
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    SEE ALSO
    --------
    linkgit:gitignore[5]
    
    GIT
    ---
    Part of the linkgit:git[1] suite