设置和配置
获取和创建项目
基本快照
分支与合并
共享和更新项目
检查和比较
打补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
- 2.48.1 → 2.50.1 无更改
-
2.48.0
2025-01-10
- 2.46.1 → 2.47.3 无更改
- 2.46.0 无更改
- 2.45.1 → 2.45.4 无更改
-
2.45.0
2024-04-29
- 2.43.2 → 2.44.4 无变化
-
2.43.1
2024-02-09
- 2.40.1 → 2.43.0 无更改
-
2.40.0
2023-03-12
- 2.38.1 → 2.39.5 无更改
-
2.38.0
2022-10-02
- 2.37.4 → 2.37.7 无更改
-
2.37.3
2022-08-30
- 2.34.1 → 2.37.2 无更改
-
2.34.0
2021-11-15
- 2.25.1 → 2.33.8 无更改
-
2.25.0
2020-01-13
- 2.22.1 → 2.24.4 无更改
- 2.22.0 无更改
- 2.21.1 → 2.21.4 无更改
-
2.21.0
2019-02-24
- 2.18.1 → 2.20.5 无更改
-
2.18.0
2018-06-21
- 2.17.0 → 2.17.6 无更改
-
2.16.6
2019-12-06
- 2.15.4 无更改
-
2.14.6
2019-12-06
- 2.11.4 → 2.13.7 无变更
-
2.10.5
2017-09-22
- 2.8.6 → 2.9.5 无更改
-
2.7.6
2017-07-30
- 2.5.6 → 2.6.7 无更改
-
2.4.12
2017-05-05
-
2.3.10
2015-09-28
- 2.1.4 → 2.2.3 无更改
-
2.0.5
2014-12-17
概要
git
add
[--verbose
|-v
] [--dry-run
|-n
] [--force
|-f
] [--interactive
|-i
] [--patch
|-p
] [--edit
|-e
] [--
[no-
]all
|-A
|--
[no-
]ignore-removal
| [--update
|-u
]] [--sparse
] [--intent-to-add
|-N
] [--refresh
] [--ignore-errors
] [--ignore-missing
] [--renormalize
] [--chmod=
(+
|-
)x
] [--pathspec-from-file=
<file> [--pathspec-file-nul
]] [--
] [<pathspec>…]
描述
此命令使用工作树中找到的当前内容更新索引,以准备下一次提交的暂存内容。它通常会整体添加现有路径的当前内容,但通过一些选项,它也可以用于添加仅应用了对工作树文件部分更改的内容,或删除工作树中不再存在的路径。
“索引”保存了工作树内容的快照,正是此快照被用作下一次提交的内容。因此,在对工作树进行任何更改之后,以及在运行 commit 命令之前,您必须使用 add
命令将任何新建或修改的文件添加到索引中。
此命令可以在提交前执行多次。它只在运行 add 命令时添加指定文件的内容;如果您希望将后续更改包含在下一次提交中,则必须再次运行 git
add
以将新内容添加到索引中。
git
status
命令可用于获取哪些文件有更改且已暂存以供下次提交的摘要。
git
add
命令默认不会添加被忽略的文件。如果命令行上明确指定了任何被忽略的文件,git
add
将失败并列出被忽略的文件。通过 Git 执行的目录递归或文件名通配符(在 shell 之前引用您的通配符)找到的被忽略文件将被静默忽略。git
add
命令可以使用 -f
(force) 选项来添加被忽略的文件。
有关将内容添加到提交的替代方法,请参阅 git-commit[1]。
选项
- <pathspec>...
-
要添加内容的文件。可以使用文件通配符(例如
*.c
)来添加所有匹配的文件。还可以给定一个开头的目录名(例如dir
来添加dir/file1
和dir/file2
),以更新索引来匹配目录的整体当前状态(例如,指定dir
不仅会记录工作树中修改过的文件dir/file1
,工作树中添加的文件dir/file2
,还会记录工作树中删除的文件dir/file3
)。请注意,旧版本的 Git 曾经会忽略已删除的文件;如果您想添加修改过的或新建的文件但忽略已删除的文件,请使用--no-all
选项。有关 <pathspec> 语法的更多详细信息,请参阅 gitglossary[7] 中的 pathspec 条目。
-n
--dry-run
-
不实际添加文件,仅显示它们是否存在以及/或是否会被忽略。
-v
--verbose
-
显示详细信息。
-f
--force
-
允许添加原本被忽略的文件。
--sparse
-
允许更新稀疏检出锥体之外的索引条目。通常,
git
add
拒绝更新其路径不符合稀疏检出锥体的索引条目,因为这些文件可能会在没有警告的情况下从工作树中删除。有关更多详细信息,请参阅 git-sparse-checkout[1]。 -i
--interactive
-
以交互方式将工作树中修改过的内容添加到索引。可以提供可选的路径参数以将操作限制为工作树的一个子集。有关详细信息,请参阅“交互模式”。
-p
--patch
-
交互式地选择索引和工作树之间的补丁块(hunks),并将其添加到索引中。这让用户有机会在将修改过的内容添加到索引之前审查差异。
这实际上运行了
add
--interactive
,但绕过了初始命令菜单,直接跳转到patch
子命令。有关详细信息,请参阅“交互模式”。 -e
--edit
-
在编辑器中打开与索引的差异,并允许用户编辑它。编辑器关闭后,调整补丁块标题并将补丁应用到索引。
此选项的目的是选择要应用的补丁行,甚至修改要暂存的行内容。这比使用交互式补丁块选择器更快捷、更灵活。然而,很容易混淆自己并创建无法应用到索引的补丁。请参阅下面的“编辑补丁”。
-u
--update
-
仅更新索引中已存在匹配 <pathspec> 的条目。这会删除并修改索引条目以匹配工作树,但不添加任何新文件。
如果使用
-u
选项时未给定 <pathspec>,则会更新整个工作树中所有已跟踪的文件(旧版本的 Git 曾经将更新限制在当前目录及其子目录)。 -A
--all
--no-ignore-removal
-
不仅在工作树中有文件匹配 <pathspec> 的地方更新索引,而且在索引中已存在条目的地方也更新。这会添加、修改和删除索引条目以匹配工作树。
如果使用
-A
选项时未给定 <pathspec>,则会更新整个工作树中所有文件(旧版本的 Git 曾经将更新限制在当前目录及其子目录)。 --no-all
--ignore-removal
-
通过添加索引中未知的新文件和工作树中修改过的文件来更新索引,但忽略已从工作树中删除的文件。当未使用 <pathspec> 时,此选项是空操作。
此选项主要是为了帮助习惯旧版本 Git 的用户,旧版本 Git 中的
git
add
<pathspec>... 是git
add
--no-all
<pathspec>... 的同义词,即忽略已删除的文件。 -N
--intent-to-add
-
仅记录该路径稍后将被添加的事实。该路径的条目被放置在索引中,不包含任何内容。这对于使用
git
diff
显示此类文件的未暂存内容,以及使用git
commit
-a
提交它们等情况非常有用。 --refresh
-
不添加文件,仅刷新它们在索引中的 stat() 信息。
--ignore-errors
-
如果某些文件因索引错误而无法添加,请不要中止操作,而是继续添加其他文件。该命令仍将以非零状态退出。可以将配置变量
add.ignoreErrors
设置为 true,以使其成为默认行为。 --ignore-missing
-
此选项只能与
--dry-run
一起使用。通过使用此选项,用户可以检查给定文件中的任何一个是否会被忽略,无论它们是否已存在于工作树中。 --no-warn-embedded-repo
-
默认情况下,
git
add
在不使用git
submodule
add
创建.gitmodules
中的条目而将嵌入式仓库添加到索引时会发出警告。此选项将抑制该警告(例如,如果您正在手动对子模块执行操作)。 --renormalize
-
将“清理”过程重新应用于所有已跟踪文件,以强制将它们再次添加到索引。这在更改
core.autocrlf
配置或text
属性后很有用,以便纠正使用错误 CRLF/LF 行尾符添加的文件。此选项隐含-u
。单独的 CR 字符保持不变,因此 CRLF 清理为 LF,而 CRCRLF 序列只会被部分清理为 CRLF。 --chmod=
(+
|-
)x
-
覆盖添加文件的可执行位。可执行位仅在索引中更改,磁盘上的文件保持不变。
--pathspec-from-file=
<file>-
路径规范(pathspec)在 <file> 中传递,而不是命令行参数。如果 <file> 恰好是
-
,则使用标准输入。路径规范元素由 LF 或 CR/LF 分隔。路径规范元素可以像配置变量core.quotePath
所解释的那样引用(参见 git-config[1])。另请参阅--pathspec-file-nul
和全局--literal-pathspecs
。 --pathspec-file-nul
-
仅在与
--pathspec-from-file
一起使用时有意义。路径规范元素由 NUL 字符分隔,所有其他字符都被视为字面值(包括换行符和引号)。 --
-
此选项可用于将命令行选项与文件列表分开(当文件名可能被误认为是命令行选项时很有用)。
示例
-
添加
Documentation
目录及其子目录下所有*.txt
文件的内容$ git add Documentation/\*.txt
请注意,在此示例中,星号
*
已被 shell 引用;这使得命令能够包含Documentation/
目录子目录中的文件。 -
考虑添加所有
git-*.sh
脚本中的内容$ git add git-*.sh
因为此示例允许 shell 展开星号(即您明确列出文件),所以它不考虑
subdir/git-foo.sh
。
交互模式
当命令进入交互模式时,它会显示 status 子命令的输出,然后进入其交互式命令循环。
命令循环会显示可用子命令列表,并给出提示“What now> ”。通常,当提示以单个 > 结尾时,您只能从给定的选项中选择一个并按回车,例如
*** Commands *** 1: status 2: update 3: revert 4: add untracked 5: patch 6: diff 7: quit 8: help What now> 1
只要选择是唯一的,您也可以说 s
或 sta
或 status
。
主命令循环有 6 个子命令(加上 help 和 quit)。
- status
-
这显示了
HEAD
和索引之间的更改(即如果您执行git
commit
将提交的内容),以及每个路径的索引和工作树文件之间的更改(即您可以在git
commit
之前使用git
add
进一步暂存的内容)。示例输出如下:staged unstaged path 1: binary nothing foo.png 2: +403/-35 +1/-1 add-interactive.c
它显示
foo.png
与HEAD
存在差异(但由于是二进制文件,无法显示行数),并且索引副本和工作树版本之间没有差异(如果工作树版本也不同,则会显示 binary 而不是 nothing)。另一个文件add-interactive.c
,如果您提交索引中的内容,则有 403 行添加和 35 行删除,但工作树文件有进一步的修改(一次添加和一次删除)。 - update
-
这会显示状态信息并发出“Update>>”提示。当提示以双 >> 结尾时,您可以进行多项选择,用空格或逗号连接。您也可以指定范围。例如,“2-5 7,9”从列表中选择 2,3,4,5,7,9。如果范围中的第二个数字被省略,则取所有剩余的补丁。例如,“7-”从列表中选择 7,8,9。您可以说 * 来选择所有内容。
您选择的内容将以 * 突出显示,如下所示:
staged unstaged path 1: binary nothing foo.png * 2: +403/-35 +1/-1 add-interactive.c
要取消选择,请在输入前加上
-
,如下所示:Update>> -2
做出选择后,以空行应答以将工作树文件中选定路径的内容暂存到索引中。
- revert
-
这与 update 有非常相似的用户界面,所选路径的暂存信息将恢复为 HEAD 版本。恢复新路径会使它们变为未跟踪状态。
- add untracked
-
这与 update 和 revert 有非常相似的用户界面,允许您将未跟踪的路径添加到索引。
- patch
-
这允许您从类似 status 的选择中选择一个路径。选择路径后,它会显示索引和工作树文件之间的差异,并询问您是否要暂存每个补丁块(hunk)的更改。您可以选择以下选项之一并按回车
y - stage this hunk n - do not stage this hunk q - quit; do not stage this hunk or any of the remaining ones a - stage this hunk and all later hunks in the file d - do not stage this hunk or any of the later hunks in the file g - select a hunk to go to / - search for a hunk matching the given regex j - leave this hunk undecided, see next undecided hunk J - leave this hunk undecided, see next hunk k - leave this hunk undecided, see previous undecided hunk K - leave this hunk undecided, see previous hunk s - split the current hunk into smaller hunks e - manually edit the current hunk p - print the current hunk ? - print help
在决定所有补丁块的去留后,如果选择了任何补丁块,则索引将根据所选的补丁块进行更新。
通过将配置变量
interactive.singleKey
设置为true
,您可以省略在此处输入回车。 - diff
-
这让您可以查看将要提交的内容(即
HEAD
和索引之间)。
编辑补丁
调用 git
add
-e
或从交互式补丁块选择器中选择 e
将在您的编辑器中打开一个补丁;编辑器退出后,结果将应用于索引。您可以随意对补丁进行更改,但请注意,某些更改可能会导致混乱的结果,甚至导致补丁无法应用。如果您想完全中止操作(即不在索引中暂存任何新内容),只需删除补丁的所有行。下面的列表描述了您在补丁中可能会看到的一些常见内容,以及哪些编辑操作对它们有意义。
还可以执行更复杂的操作。但请注意,由于补丁仅应用于索引而非工作树,工作树将显得“撤销”索引中的更改。例如,在索引中引入一条既不在 HEAD
也不在工作树中的新行,将暂存该新行以供提交,但该行在工作树中将显示为已恢复。
避免使用这些结构,或极其谨慎地使用。
还有一些操作应完全避免,因为它们将使补丁无法应用
-
添加上下文(“ ”)或删除(“-”)行
-
删除上下文或删除行
-
修改上下文或删除行的内容
配置
本节中以下所有内容均从 git-config[1] 文档中选择性地包含。内容与彼处相同: