设置和配置
获取和创建项目
基本快照
分支和合并
共享和更新项目
检查和比较
补丁
调试
电子邮件
外部系统
服务器管理员
指南
管理
管道命令
- 2.45.1 → 2.47.0 无变更
- 2.45.0 04/29/24
- 2.44.1 → 2.44.2 无变更
- 2.44.0 02/23/24
- 2.43.1 → 2.43.5 无变更
- 2.43.0 11/20/23
- 2.40.1 → 2.42.3 无变更
- 2.40.0 03/12/23
- 2.39.1 → 2.39.5 无变更
- 2.39.0 12/12/22
- 2.35.1 → 2.38.5 无变更
- 2.35.0 01/24/22
- 2.34.1 → 2.34.8 无变更
- 2.34.0 11/15/21
- 2.31.1 → 2.33.8 无变更
- 2.31.0 03/15/21
- 2.30.2 → 2.30.9 无变更
- 2.30.1 02/08/21
- 2.24.1 → 2.30.0 无变更
- 2.24.0 11/04/19
- 2.22.1 → 2.23.4 无变更
- 2.22.0 06/07/19
- 2.21.1 → 2.21.4 无变更
- 2.21.0 02/24/19
- 2.19.1 → 2.20.5 无变更
- 2.19.0 09/10/18
- 2.18.1 → 2.18.5 无变更
- 2.18.0 06/21/18
- 2.17.1 → 2.17.6 无变更
- 2.17.0 04/02/18
- 2.16.6 12/06/19
- 2.15.4 无变更
- 2.14.6 12/06/19
- 2.13.7 05/22/18
- 2.12.5 无变更
- 2.11.4 09/22/17
- 2.7.6 → 2.10.5 无变更
- 2.6.7 05/05/17
- 2.5.6 05/05/17
- 2.4.12 05/05/17
- 2.3.10 无变更
- 2.2.3 09/04/15
- 2.1.4 无变更
- 2.0.5 12/17/14
描述
显示索引文件与当前 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-cache
和git 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
而不带选项分别等效于 always 和 never。 - --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_PATH
。XY
是一个两位的状态代码。
字段(包括 ->
)之间由一个空格分隔。如果文件名包含空格或其他不可打印字符,则该字段将以 C 字符串文字的方式引用:用 ASCII 双引号 (34) 字符包围,并将内部特殊字符反斜杠转义。
使用此格式显示三种不同的状态类型,每种类型都以不同的方式使用 XY
语法
-
当发生合并并且合并成功时,或者在非合并情况下,
X
显示索引的状态,而Y
显示工作树的状态。 -
当发生合并冲突并且尚未解决时,
X
和Y
显示每个合并头相对于公共祖先引入的状态。这些路径被称为未合并。 -
当路径未跟踪时,
X
和Y
始终相同,因为它们对索引未知。??
用于未跟踪的路径。除非使用--ignored
,否则不会列出被忽略的文件;如果使用,被忽略的文件将用!!
表示。
请注意,这里的术语 merge 还包括使用默认 --merge
策略的变基、cherry-pick 以及使用合并机制的任何其他操作。
在下表中,这三个类分别显示在不同的部分,对于显示跟踪路径的前两个部分,X
和 Y
字段使用这些字符
-
' ' = 未修改
-
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 版本之间或基于用户配置时不会以向后不兼容的方式更改。这使其非常适合脚本解析。上面对短格式的描述也描述了瓷器格式,但也有一些例外
-
用户的 color.status 配置不被尊重;颜色将始终关闭。
-
用户的 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. ------------------------------------------------------------
已更改的跟踪条目
在标题之后,将为跟踪条目打印一系列行。根据更改的类型,可以使用三种不同的行格式之一来描述条目。跟踪条目以未定义的顺序打印;解析器应允许以任何顺序混合使用三种行类型。
普通已更改条目具有以下格式
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. --------------------------------------------------------
路径名格式说明和 -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=true
和core.fsmonitor=true
或core.fsmonitor=<hook-command-pathname>
(参见 git-update-index[1]):同时启用未跟踪缓存和 FSMonitor 功能,仅搜索自上次git status
命令以来已被修改的目录。这比仅使用未跟踪缓存快得多,因为 Git 还可以避免搜索已修改的目录。Git 只需要枚举最近更改的目录的精确集合。虽然可以在没有未跟踪缓存的情况下启用 FSMonitor 功能,但在这种情况下,好处会大大减少。
请注意,在您打开未跟踪缓存和/或 FSMonitor 功能后,可能需要运行几次 git status
命令才能使各种缓存预热,然后您才能看到命令时间有所改善。这是正常的。
GIT
是 git[1] 套件的一部分