Git
英语 ▾ 主题 ▾ 最新版本 ▾ git-status 最后更新于 2.45.0

名称

git-status - 显示工作树状态

概要

git status [<options>] [--] [<pathspec>…​]

描述

显示索引文件与当前 HEAD 提交之间存在差异的路径、工作树与索引文件之间存在差异的路径以及工作树中未被 Git 跟踪(并且未被 gitignore[5] 忽略)的路径。第一种是您运行 git commit将要提交的内容;第二种和第三种是您运行 git commit 之前运行 git add可以提交的内容。

选项

-s
--short

以简短格式输出。

-b
--branch

即使在简短格式中也显示分支和跟踪信息。

--show-stash

显示当前暂存的条目数。

--porcelain[=<version>]

以易于解析的格式输出,以便脚本使用。这类似于简短输出,但会保持在 Git 版本和用户配置之间稳定。有关详细信息,请参见下文。

version 参数用于指定格式版本。这是可选的,默认值为原始版本 v1 格式。

--long

以长格式输出。这是默认值。

-v
--verbose

除了已更改文件的名称外,还显示已暂存以提交的文本更改(即类似于 git diff --cached 的输出)。如果指定了两次 -v,则还显示尚未暂存的工作树中的更改(即类似于 git diff 的输出)。

-u[<mode>]
--untracked-files[=<mode>]

显示未跟踪的文件。

mode 参数用于指定未跟踪文件的处理方式。它是可选的:它默认为 all,如果指定,它必须附加到选项(例如 -uno,但不能为 -u no)。

可能的选项为

  • no - 不显示任何未跟踪的文件。

  • normal - 显示未跟踪的文件和目录。

  • all - 还显示未跟踪目录中的各个文件。

如果没有使用 -u 选项,则会显示未跟踪的文件和目录(即与指定 normal 相同),以帮助您避免忘记添加新创建的文件。由于查找文件系统中的未跟踪文件需要额外的工作,因此此模式在大型工作树中可能需要一些时间。如果支持,请考虑启用未跟踪缓存和拆分索引(参见 git update-index --untracked-cachegit update-index --split-index),否则您可以使用 no 使 git status 返回得更快,而不会显示未跟踪的文件。所有布尔值 true 的常用拼写都被视为 normal,而 false 被视为 no

默认值可以使用 git-config[1] 中记录的 status.showUntrackedFiles 配置变量进行更改。

--ignore-submodules[=<when>]

在查找更改时忽略对子模块的更改。<when> 可以是 "none"、"untracked"、"dirty" 或 "all",默认值为 "all"。使用 "none" 将在子模块包含未跟踪或修改的文件或其 HEAD 与超级项目中记录的提交不同时,将子模块视为修改,并且可以用于覆盖 git-config[1]gitmodules[5]ignore 选项的任何设置。当使用 "untracked" 时,子模块仅在包含未跟踪内容时不视为脏(但它们仍会扫描修改的内容)。使用 "dirty" 会忽略对子模块工作树的所有更改,只会显示对超级项目中存储的提交的更改(这是 1.7.0 之前的行为)。使用 "all" 会隐藏对子模块的所有更改(并在配置选项 status.submoduleSummary 设置时抑制子模块摘要的输出)。

--ignored[=<mode>]

还显示被忽略的文件。

mode 参数用于指定被忽略文件的处理方式。它是可选的:它默认为 traditional

可能的选项为

  • traditional - 显示被忽略的文件和目录,除非指定了 --untracked-files=all,在这种情况下会显示被忽略目录中的各个文件。

  • no - 不显示任何被忽略的文件。

  • matching - 显示与忽略模式匹配的被忽略的文件和目录。

当指定 matching 模式时,会显示明确匹配被忽略模式的路径。如果目录与忽略模式匹配,则会显示它,但不会显示被忽略目录中包含的路径。如果目录与忽略模式不匹配,但所有内容都被忽略,则不会显示该目录,但会显示所有内容。

-z

使用 NUL 而不是 LF 终止条目。如果未给出其他格式,则意味着 --porcelain=v1 输出格式。

--column[=<options>]
--no-column

以列的形式显示未跟踪的文件。有关选项语法,请参见配置变量 column.status--column--no-column 而不带选项分别等效于 alwaysnever

--ahead-behind
--no-ahead-behind

显示或不显示分支相对于其上游分支的详细超前/落后计数。默认为 true。

--renames
--no-renames

无论用户配置如何,都启用/禁用重命名检测。另请参见 git-diff[1] --no-renames

--find-renames[=<n>]

启用重命名检测,可以选择设置相似度阈值。另请参见 git-diff[1] --find-renames

<pathspec>…​

请参见 gitglossary[7] 中的 pathspec 条目。

输出

此命令的输出旨在用作提交模板注释。默认的长格式旨在易于人类阅读,冗长且描述性。其内容和格式随时可能发生变化。

输出中提到的路径(与大多数其他 Git 命令不同)如果您在子目录中工作,则会相对于当前目录显示(这是有意的,以帮助剪切和粘贴)。请参见下面的 status.relativePaths 配置选项。

简短格式

在简短格式中,每个路径的状态以以下形式之一显示

XY PATH
XY ORIG_PATH -> PATH

其中 ORIG_PATH 是重命名/复制内容的来源。仅当条目被重命名或复制时才会显示 ORIG_PATHXY 是一个两位的状态代码。

字段(包括 ->)之间由一个空格分隔。如果文件名包含空格或其他不可打印字符,则该字段将以 C 字符串文字的方式引用:用 ASCII 双引号 (34) 字符包围,并将内部特殊字符反斜杠转义。

使用此格式显示三种不同的状态类型,每种类型都以不同的方式使用 XY 语法

  • 当发生合并并且合并成功时,或者在非合并情况下,X 显示索引的状态,而 Y 显示工作树的状态。

  • 当发生合并冲突并且尚未解决时,XY 显示每个合并头相对于公共祖先引入的状态。这些路径被称为未合并

  • 当路径未跟踪时,XY 始终相同,因为它们对索引未知。?? 用于未跟踪的路径。除非使用 --ignored,否则不会列出被忽略的文件;如果使用,被忽略的文件将用 !! 表示。

请注意,这里的术语 merge 还包括使用默认 --merge 策略的变基、cherry-pick 以及使用合并机制的任何其他操作。

在下表中,这三个类分别显示在不同的部分,对于显示跟踪路径的前两个部分,XY 字段使用这些字符

  • ' ' = 未修改

  • M = 已修改

  • T = 文件类型已更改(普通文件、符号链接或子模块)

  • A = 已添加

  • D = 已删除

  • R = 已重命名

  • C = 已复制(如果配置选项 status.renames 设置为“copies”)

  • U = 已更新但未合并

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

子模块具有更多状态,并改为报告

  • M = 子模块的 HEAD 与索引中记录的 HEAD 不同

  • m = 子模块的内容已修改

  • ? = 子模块包含未跟踪的文件

这是因为无法通过 git add 在父项目中添加子模块中的已修改内容或未跟踪文件以准备提交。

m? 是递归应用的。例如,如果子模块中的嵌套子模块包含未跟踪文件,则也会将其报告为 ?

如果使用 -b,则简短格式状态将以一行开头

## branchname tracking info

瓷器格式版本 1

版本 1 瓷器格式类似于短格式,但保证在 Git 版本之间或基于用户配置时不会以向后不兼容的方式更改。这使其非常适合脚本解析。上面对短格式的描述也描述了瓷器格式,但也有一些例外

  1. 用户的 color.status 配置不被尊重;颜色将始终关闭。

  2. 用户的 status.relativePaths 配置不被尊重;显示的路径始终相对于存储库根目录。

还有一种备用 -z 格式,建议用于机器解析。在这种格式中,状态字段是相同的,但其他一些内容有所变化。首先,-> 从重命名条目中省略,字段顺序反转(例如,from -> to 变为 to from)。其次,NUL(ASCII 0)位于每个文件名之后,用空格替换作为字段分隔符和终止换行符(但空格仍将状态字段与第一个文件名分开)。第三,包含特殊字符的文件名不会进行特殊格式化;不执行引用或反斜杠转义。

任何子模块更改都报告为已修改的 M,而不是 m 或单个 ?

瓷器格式版本 2

版本 2 格式添加了有关工作区和已更改项状态的更多详细信息。版本 2 还定义了一组可扩展的易于解析的可选标题。

标题行以“#”开头,并作为对特定命令行参数的响应添加。解析器应忽略它们不识别的标题。

分支标题

如果给出 --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.
------------------------------------------------------------

隐藏信息

如果给出 --show-stash,则会打印一行,显示如果隐藏条目数量不为零,则显示其数量。

# stash <N>

已更改的跟踪条目

在标题之后,将为跟踪条目打印一系列行。根据更改的类型,可以使用三种不同的行格式之一来描述条目。跟踪条目以未定义的顺序打印;解析器应允许以任何顺序混合使用三种行类型。

普通已更改条目具有以下格式

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

已重命名或已复制的条目具有以下格式

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

未合并的条目具有以下格式;第一个字符是“u”,以将其与普通已更改条目区分开来。

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

其他项目

在跟踪条目之后(如果请求),将为在工作区中找到的未跟踪项和忽略项打印一系列行。

未跟踪项具有以下格式

? <path>

忽略项具有以下格式

! <path>

路径名格式说明和 -z

当给出 -z 选项时,路径名按原样打印,不进行任何引用,并且行以 NUL(ASCII 0x00)字节终止。

如果没有 -z 选项,则具有“不寻常”字符的路径名将按配置变量 core.quotePath 中解释的那样进行引用(参见 git-config[1])。

配置

该命令遵守 color.status(或 status.color - 它们的含义相同,而后者为了向后兼容而保留)和 color.status.<slot> 配置变量以对其输出进行着色。

如果配置变量 status.relativePaths 设置为 false,则显示的所有路径都相对于存储库根目录,而不是相对于当前目录。

如果 status.submoduleSummary 设置为非零数字或 true(与 -1 或无限数量相同),则将为长格式启用子模块摘要,并将显示已修改子模块的提交摘要(参见 git-submodule[1] 的 --summary-limit 选项)。请注意,当 diff.ignoreSubmodules 设置为 all 时,状态命令的摘要输出将被抑制所有子模块,或者仅抑制那些 submodule.<name>.ignore=all 的子模块。要查看被忽略的子模块的摘要,您也可以使用 --ignore-submodules=dirty 命令行选项或 git submodule summary 命令,该命令显示类似的输出,但不尊重这些设置。

后台刷新

默认情况下,git status 会自动刷新索引,更新来自工作区的缓存统计信息并写入结果。写入更新的索引是一种优化,并非严格必要(status 自己计算这些值,但写入它们只是为了防止后续程序重复我们的计算)。当 status 在后台运行时,在写入期间持有的锁可能会与其他同时运行的进程冲突,导致它们失败。在后台运行 status 的脚本应考虑使用 git --no-optional-locks status(有关详细信息,请参见 git[1])。

未跟踪文件和性能

如果/当 git status 需要搜索未跟踪的文件和目录时,它在大型工作区中可能非常慢。有很多配置选项可通过避免工作或利用先前 Git 命令的缓存结果来加快速度。没有适合所有人的最佳设置。我们将列出相关选项的摘要来帮助您,但在进入列表之前,您可能需要再次运行 git status,因为您的配置可能已经在缓存 git status 结果,因此在后续运行中它可能会更快。

  • --untracked-files=no 标志或 status.showUntrackedFiles=no 配置(有关两者,请参见上文):指示 git status 不应报告未跟踪文件。这是最快的选项。git status 不会列出未跟踪的文件,因此您需要小心记住是否创建了任何新文件并手动 git add 它们。

  • advice.statusUoption=false(参见 git-config[1]):将此变量设置为 false 会禁用枚举未跟踪文件花费超过 2 秒时给出的警告消息。在大型项目中,这可能需要更长的时间,并且用户可能已经接受了权衡(例如,使用“-uno”可能对用户来说不可接受),在这种情况下,发出警告消息没有意义,在这种情况下,禁用警告可能是最好的选择。

  • core.untrackedCache=true(参见 git-update-index[1]):启用未跟踪缓存功能,仅搜索自上次 git status 命令以来已被修改的目录。Git 会记住每个目录中未跟踪文件的集合,并假设如果目录未被修改,则其中未跟踪文件的集合不会改变。这比枚举每个目录的内容快得多,但仍并非没有成本,因为 Git 仍然必须搜索已修改目录的集合。未跟踪缓存存储在 .git/index 文件中。搜索未跟踪文件的成本降低,略微抵消了索引大小增加和保持其最新状态的成本。减少的搜索时间通常值得额外的空间。

  • core.untrackedCache=truecore.fsmonitor=truecore.fsmonitor=<hook-command-pathname>(参见 git-update-index[1]):同时启用未跟踪缓存和 FSMonitor 功能,仅搜索自上次 git status 命令以来已被修改的目录。这比仅使用未跟踪缓存快得多,因为 Git 还可以避免搜索已修改的目录。Git 只需要枚举最近更改的目录的精确集合。虽然可以在没有未跟踪缓存的情况下启用 FSMonitor 功能,但在这种情况下,好处会大大减少。

请注意,在您打开未跟踪缓存和/或 FSMonitor 功能后,可能需要运行几次 git status 命令才能使各种缓存预热,然后您才能看到命令时间有所改善。这是正常的。

另请参见

GIT

git[1] 套件的一部分

scroll-to-top