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