设置和配置
获取和创建项目
基本快照
分支与合并
共享和更新项目
检查和比较
打补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
-
2.52.0
2025-11-17
- 2.50.1 → 2.51.2 无更改
-
2.50.0
2025-06-16
- 2.49.1 无更改
-
2.49.0
2025-03-14
- 2.48.1 → 2.48.2 无更改
-
2.48.0
2025-01-10
- 2.45.1 → 2.47.3 无更改
- 2.45.0 无更改
- 2.43.1 → 2.44.4 无更改
-
2.43.0
2023-11-20
- 2.36.1 → 2.42.4 无变更
-
2.36.0
2022-04-18
- 2.25.3 → 2.35.8 无更改
-
2.25.2
2020-03-17
- 2.25.1 无变化
-
2.25.0
2020-01-13
- 2.24.1 → 2.24.4 无更改
-
2.24.0
2019-11-04
- 2.23.1 → 2.23.4 无更改
-
2.23.0
2019-08-16
- 2.18.1 → 2.22.5 无更改
-
2.18.0
2018-06-21
- 2.15.4 → 2.17.6 无更改
-
2.14.6
2019-12-06
- 2.2.3 → 2.13.7 无更改
-
2.1.4
2014-12-17
-
2.0.5
2014-12-17
描述
本手册描述了 Git CLI 中使用的约定。
许多命令将其参数接受为修订版本(最常是“提交”,但有时是“树形对象”,具体取决于上下文和命令)和路径。以下是规则
-
选项在前,参数在后。子命令可以接受带连字符的选项(这些选项可能带有自己的参数,例如 `--max-parents 2`)和参数。您应先给出带连字符的选项,然后给出参数。一些命令可能会在您已经给出非选项参数后接受带连字符的选项(这可能会使命令变得含糊不清),但您不应依赖它(因为我们最终可能会找到一种方法来强制执行“选项在前,参数在后”的规则来解决这些歧义)。
-
修订版本在前,路径在后。例如,在 `
gitdiffv1.0v2.0arch/x86include/asm-x86` 中,`v1.0` 和 `v2.0` 是修订版本,`arch/x86` 和 `include/asm-x86` 是路径。 -
当一个参数可能被误解为修订版本或路径时,可以通过在它们之间放置 `
--` 来消歧。例如,`gitdiff--HEAD` 的意思是“我在工作目录中有一个名为 HEAD 的文件。请显示暂存区版本和工作目录版本之间的更改”,而不是“显示 HEAD 提交和整个工作目录之间的差异”。您可以说 `gitdiffHEAD--` 来请求后者。 -
如果不使用消歧 `
--`,Git 会做出合理的猜测,但当出现歧义时,它会报错并要求您进行消歧。例如,如果您的工作目录中有一个名为 HEAD 的文件,`gitdiffHEAD` 就是模糊的,您必须说 `gitdiffHEAD--` 或 `gitdiff--HEAD` 来消歧。 -
由于 `
--` 在某些命令中用于消歧修订版本和路径,因此不能用于将选项和修订版本分开。您可以使用 `--end-of-options` 来实现此目的(对于不区分修订版本和路径的命令,它也有效,在这种情况下,它只是 `--` 的别名)。在编写预期要处理随机用户输入的脚本时,最好通过在适当的位置放置消歧 `
--` 来明确哪些参数是哪些。 -
许多命令允许在路径中使用通配符,但您需要保护它们不被 shell 扩展。以下两个命令的意思不同
$ git restore *.c $ git restore \*.c
前者允许您的 shell 扩展文件通配符,并要求您工作目录中的 .C 文件被索引版本覆盖。后者将 `
*.c` 传递给 Git,并要求索引中与模式匹配的路径被检出到您的工作目录。在运行 `git add hello.c; rm hello.c` 之后,您将 *不会* 在工作目录中看到 `hello.c`,但使用后者时会。 -
正如文件系统中的 `*.*`(点)指代当前目录一样,在 Git 中使用 `.` 作为仓库名(点仓库)是一个相对路径,表示您当前的仓库。
以下是您在编写 Git 脚本时应遵循的关于“标志”的规则
-
将短选项拆分成单独的单词(优先使用 `
gitfoo-a-b` 而不是 `gitfoo-ab`,后者甚至可能不起作用)。 -
当命令行选项接受参数时,请使用 *粘合* 形式。也就是说,对于短选项,写成 `
gitfoo-oArg` 而不是 `gitfoo-oArg`;对于长选项,写成 `gitfoo--long-opt=Arg` 而不是 `gitfoo--long-optArg`。接受可选选项参数的选项必须写成 *粘合* 形式。 -
尽管有上述建议,但当 Arg 是相对于用户主目录的路径时,例如 `
~/directory/file` 或 `~u/d/f`,您可能希望使用分开的形式,例如 `gitfoo--file~/mine`,而不是 `gitfoo--file=~/mine`。在这种情况下,shell 会将 `~/` 扩展到您的主目录,但大多数 shell 会在后一种情况中保留波浪号。我们的一些命令知道如何对选项值进行波浪号扩展,即使是粘合形式,但并非所有命令都这样做。 -
当您向命令提供修订版本参数时,请确保该参数与工作目录中的文件名不混淆。例如,不要写 `
gitlog-1HEAD`,而应写 `gitlog-1HEAD--`;如果您恰好在工作目录中有一个名为 `HEAD` 的文件,前者将不起作用。 -
许多命令允许长选项 `
--option` 被缩短为其唯一前缀(例如,如果不存在以 `opt` 开头的其他选项名称,您可以通过键入 `--opt` 来调用 `--option` 标志),但在编写脚本时,您应该完整地拼写它们;Git 的后续版本可能会引入一个名称共享相同前缀的新选项,例如 `--optimize`,从而使以前唯一的前缀不再唯一。
增强的选项解析器
从 Git 1.5.4 系列及之后,许多 Git 命令(撰写本文时并非全部)都配备了增强的选项解析器。
以下是此选项解析器提供的功能列表。
特殊选项
已激活增强选项解析器的命令都支持几个特殊的命令行选项
- -h
-
提供命令的格式化用法。
$ git describe -h usage: git describe [<options>] <commit-ish>* or: git describe [<options>] --dirty --contains find the tag that comes after the commit --debug debug search strategy on stderr --all use any ref --tags use any tag, even unannotated --long always use long format --abbrev[=<n>] use <n> digits to display SHA-1s请注意,某些子命令(例如 `
gitgrep`)在命令行上除了 `-h` 之外还有其他内容时,行为可能不同,但 `gitsubcmd-h` 在命令行上没有其他内容时,始终会显示用法。 - --help-all
-
一些 Git 命令接受仅用于内部或已弃用的选项,这些选项在默认用法中被隐藏。此选项提供完整的选项列表。
否定选项
长选项名称的选项可以通过添加前缀 `--no-` 来否定。例如,`git branch` 有一个默认值为 *开启* 的 `--track` 选项。您可以使用 `--no-track` 来覆盖该行为。对于 `--color` 和 `--no-color` 也是如此。
选项优先于配置和环境变量
当存在一个用于调整 Git 命令某个方面行为的配置变量或环境变量,并且还有一个用于调整同一方面的命令行选项时,命令行选项会覆盖配置和/或环境变量的设置。
例如,`user.name` 配置变量用于指定 `git commit` 命令在创建新提交时记录作者和提交者名称所使用的人类可读名称。如果设置了 `GIT_AUTHOR_NAME` 环境变量,它在决定记录哪个作者姓名时具有优先权。如果提供了 `git commit` 命令的 `--author=<author>` 命令行选项,它将优先于这两种信息来源。
缩写长选项
支持增强选项解析器的命令接受长选项的唯一前缀,就如同完全拼写出来一样,但请谨慎使用。例如,`git commit --amen` 的行为就如同您输入了 `git commit --amend`,但这只在 Git 的后续版本引入共享相同前缀的另一个选项(例如 `git commit --amenity` 选项)之前是正确的。
将参数与选项分开
您可以将选项的强制参数写成命令行上的一个单独的单词。这意味着以下所有用法都有效
$ git foo --long-opt=Arg $ git foo --long-opt Arg $ git foo -oArg $ git foo -o Arg
但是,对于具有可选值的开关,这是 **不允许** 的,在这种情况下必须使用 *粘合* 形式
$ git describe --abbrev HEAD # correct $ git describe --abbrev=10 HEAD # correct $ git describe --abbrev 10 HEAD # NOT WHAT YOU MEANT
关于易混淆选项的说明
许多可以在工作目录文件和/或暂存区文件上操作的命令可以接受 `--cached` 和/或 `--index` 选项。有时人们错误地认为,由于暂存区最初被称为缓存,所以这两个选项是同义词。它们 **不是** 同义词 — 这两个选项的意思大相径庭。
-
`--cached` 选项用于要求一个通常作用于工作目录文件的命令 **仅** 作用于暂存区。例如,`git grep` 在没有指定要从中查找字符串的提交时,通常作用于工作目录文件,但使用 `--cached` 选项时,它会在暂存区中查找字符串。
-
`--index` 选项用于要求一个通常作用于工作目录文件的命令 **也** 影响暂存区。例如,`git stash apply` 通常将暂存条目中记录的更改合并到工作目录,但使用 `--index` 选项时,它也会将更改合并到暂存区。
`git apply` 命令可以与 `--cached` 和 `--index` 一起使用(但不能同时使用)。通常该命令只影响工作目录中的文件,但使用 `--index` 时,它会同时修补文件及其暂存区条目,使用 `--cached` 时,它只修改暂存区条目。
有关更多信息,请参阅 https://lore.kernel.org/git/7v64clg5u9.fsf@assigned-by-dhcp.cox.net/ 和 https://lore.kernel.org/git/7vy7ej9g38.fsf@gitster.siamese.dyndns.org/。
其他一些同样可以在工作目录文件和/或暂存区文件上操作的命令可以接受 `--staged` 和/或 `--worktree`。
-
`--staged` 与 `--cached` 完全相同,用于要求命令仅作用于暂存区,而不作用于工作目录。
-
`--worktree` 则相反,用于要求命令仅作用于工作目录,而不作用于暂存区。
-
这两个选项可以一起指定,以要求命令同时作用于暂存区和工作目录。