设置和配置
获取和创建项目
基本快照
分支与合并
共享和更新项目
检查和比较
打补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
- 2.53.0 无变更
-
2.52.0
2025-11-17
- 2.51.1 → 2.51.2 无更改
-
2.51.0
2025-08-18
- 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
概要
gitadd[--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>…]
描述
将新文件或修改过的文件内容添加到索引中。“索引”(也称为“暂存区”)是您用来准备下一次提交内容的地方。
当您运行不带任何其他参数的 git commit 时,它只会提交已暂存的更改。例如,如果您编辑了 file.c 并想提交对该文件的更改,可以运行
git add file.c git commit
您也可以使用 git add -p 仅将文件中部分更改添加到索引中。
此命令在提交前可以执行多次。它仅添加执行 add 命令时指定文件的内容;如果您希望后续更改也包含在下次提交中,则必须再次运行 git add 将新内容添加到索引。
git status 命令可用于获取哪些文件的更改已暂存以备下次提交的摘要。
默认情况下,git add 命令不会添加被忽略的文件。您可以使用 --force 选项来添加被忽略的文件。如果您指定了被忽略文件的确切文件名,git add 将失败并列出被忽略的文件。否则,它将静默地忽略该文件。
请参阅 git-commit[1] 了解添加内容到提交的其他方法。
选项
- <路径规格>...
-
要从中添加内容的文件。可以使用文件通配符(例如
*.c)来添加所有匹配的文件。也可以给定领先的目录名(例如dir以添加dir/file1和dir/file2)来更新索引以匹配目录的整体当前状态(例如指定dir不仅会记录工作树中修改的文件dir/file1、添加到工作树的文件dir/file2,还会记录从工作树中删除的文件dir/file3)。请注意,旧版本的 Git 过去会忽略已删除的文件;如果您想添加修改过的或新文件但忽略已删除的文件,请使用--no-all选项。有关 <路径规格> 语法更多详情,请参阅 gitglossary[7] 中的 pathspec 条目。
-n--dry-run-
不实际添加文件,仅显示它们是否存在以及/或者是否会被忽略。
-v--verbose-
显示详细信息。
-f--force-
允许添加通常被忽略的文件。
--sparse-
允许更新稀疏检出(sparse-checkout)锥体之外的索引项。通常,
gitadd会拒绝更新路径不符合稀疏检出锥体的索引项,因为这些文件可能会在没有警告的情况下从工作树中删除。详见 git-sparse-checkout[1]。 -i--interactive-
以交互方式将工作树中修改过的内容添加到索引中。可以提供可选的路径参数来将操作限制在工作树的子集中。详情请参“交互模式”。
-p--patch-
以交互方式从索引和工作树之间的差异中选择补丁块(hunks)并添加到索引中。这让用户在将修改内容添加到索引之前有机会查看差异。
这实际上运行了
add--interactive,但绕过了初始命令菜单,直接跳到patch子命令。详情请参阅“交互模式”。 -U<n>--unified=<n>-
生成具有 <n> 行上下文的 diff。如果配置选项未设置,则默认为
diff.context或 3。 --inter-hunk-context=<n>-
在差异块之间显示上下文,最多达指定行数 <number>,从而合并彼此接近的块。默认为
diff.interHunkContext,如果未设置配置选项则为 0。 -e--edit-
在编辑器中打开与索引的差异,并让用户编辑。编辑器关闭后,调整补丁块头并将补丁应用到索引。
此选项的目的是挑选补丁中要应用的行,甚至修改要暂存的行内容。这比使用交互式补丁块选择器更快、更灵活。但是,这很容易弄错并创建无法应用到索引的补丁。请参阅下文的“编辑补丁”。
-u--update-
仅在索引中已有匹配 <路径规格> 的条目处更新索引。这会移除或修改索引条目以匹配工作树,但不会添加新文件。
如果在使用
-u选项时未给出 <路径规格>,则更新整个工作树中所有的已跟踪文件(旧版本的 Git 过去会将更新限制在当前目录及其子目录中)。 -A--all--no-ignore-removal-
不仅在工作树有匹配 <路径规格> 的文件处更新索引,也在索引已有条目处更新。这会添加、修改和删除索引条目以匹配工作树。
如果在使用
-A选项时未给出 <路径规格>,则更新整个工作树中所有的文件(旧版本的 Git 过去会将更新限制在当前目录及其子目录中)。 --no-all--ignore-removal-
通过添加索引未知的新文件和工作树中修改过的文件来更新索引,但忽略从工作树中删除的文件。当未使用 <路径规格> 时,此选项无效。
此选项主要用于帮助习惯于旧版本 Git 的用户,在旧版本中
gitadd<路径规格>... 是gitadd--no-all<路径规格>... 的同义词,即忽略已删除的文件。 -N--intent-to-add-
仅记录稍后将添加该路径的事实。该路径的一个条目被放入索引中,但不包含内容。这对于诸如使用
gitdiff显示此类文件的未暂存内容,以及使用gitcommit-a提交它们等操作非常有用。 --refresh-
不添加文件,仅刷新索引中文件的 stat() 信息。
--ignore-errors-
如果由于索引错误导致某些文件无法添加,不要中止操作,而是继续添加其他文件。命令执行完毕后仍应以非零状态退出。配置变量
add.ignoreErrors可以设置为 true 以使其成为默认行为。 --ignore-missing-
此选项只能与
--dry-run一起使用。通过使用此选项,用户可以检查给定的文件是否会被忽略,无论它们是否已存在于工作树中。 --no-warn-embedded-repo-
默认情况下,当将嵌套仓库添加到索引而未使用
gitsubmoduleadd在.gitmodules中创建条目时,gitadd会发出警告。此选项将抑制该警告(例如,如果您正在手动执行子模块操作)。 --renormalize-
对所有已跟踪文件重新应用“清理(clean)”过程,以强制重新将它们添加到索引。在更改了
core.autocrlf配置或text属性后,这对于纠正以错误 CRLF/LF 换行符添加的文件非常有用。此选项隐含了-u。单独的 CR 字符不会被处理,因此虽然 CRLF 会清理为 LF,但 CRCRLF 序列仅会部分清理为 CRLF。 --chmod=(+|-)x-
覆盖所添加文件的可执行位。可执行位仅在索引中更改,磁盘上的文件保持不变。
--pathspec-from-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 个子命令(加上帮助和退出)。
- status (状态)
-
这显示了
HEAD与索引之间的更改(即如果您输入gitcommit将会提交的内容),以及索引与工作树文件之间的更改(即在执行gitcommit之前可以使用gitadd进一步暂存的内容)。每个路径的示例输出如下所示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 的选择中选择一个路径。选择路径后,它会显示索引和工作树文件之间的差异,并询问您是否要暂存每个补丁块的更改。您可以选择以下选项之一并按回车键
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 - go to the next undecided hunk, roll over at the bottom J - go to the next hunk, roll over at the bottom k - go to the previous undecided hunk, roll over at the top K - go to the previous hunk, roll over at the top s - split the current hunk into smaller hunks e - manually edit the current hunk p - print the current hunk P - print the current hunk using the pager ? - print help
在决定了所有补丁块的去向后,如果有任何补丁块被选中,索引将根据所选的补丁块进行更新。
通过将配置变量
interactive.singleKey设置为true,您可以省去按回车键的步骤。 - diff (差异)
-
这让您可以查看将要提交的内容(即
HEAD与索引之间的差异)。
编辑补丁
调用 git add -e 或从交互式补丁块选择器中选择 e 将在编辑器中打开补丁;编辑器退出后,结果将应用到索引。您可以随意对补丁进行更改,但请注意,某些更改可能会导致令人困惑的结果,甚至导致补丁无法应用。如果您想完全中止操作(即不在索引中暂存任何新内容),只需删除补丁的所有行即可。下面的列表描述了您在补丁中可能看到的一些常见内容,以及对它们进行的哪些编辑操作是有意义的。
还可以执行更复杂的操作。但请注意,由于补丁仅应用于索引而非工作树,因此工作树将看起来像是“撤销”了索引中的更改。例如,在索引中引入一个既不在 HEAD 也不在工作树中的新行,将暂存该新行以待提交,但该行在工作树中将显示为已还原。
避免使用这些构造,或在极其谨慎的情况下使用。
还有一些操作应完全避免,因为它们会使补丁无法应用:
-
添加上下文行 (" ") 或删除行 ("-")
-
删除上下文行或删除行
-
修改上下文行或删除行的内容
配置
本节中以下所有内容均从 git-config[1] 文档中选择性地包含。内容与彼处相同: