简体中文 ▾ 主题 ▾ 最新版本 ▾ git-add 最后更新于 2.52.0

名称

git-add - 将文件内容添加到索引

概要

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>…​]

描述

将新文件或修改过的文件内容添加到索引中。“索引”(也称为“暂存区”)是您用来准备下一次提交内容的地方。

当您运行不带任何其他参数的 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/file1dir/file2)来更新索引以匹配目录的整体当前状态(例如指定 dir 不仅会记录工作树中修改的文件 dir/file1、添加到工作树的文件 dir/file2,还会记录从工作树中删除的文件 dir/file3)。请注意,旧版本的 Git 过去会忽略已删除的文件;如果您想添加修改过的或新文件但忽略已删除的文件,请使用 --no-all 选项。

有关 <路径规格> 语法更多详情,请参阅 gitglossary[7] 中的 pathspec 条目。

-n
--dry-run

不实际添加文件,仅显示它们是否存在以及/或者是否会被忽略。

-v
--verbose

显示详细信息。

-f
--force

允许添加通常被忽略的文件。

--sparse

允许更新稀疏检出(sparse-checkout)锥体之外的索引项。通常,git add 会拒绝更新路径不符合稀疏检出锥体的索引项,因为这些文件可能会在没有警告的情况下从工作树中删除。详见 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 的用户,在旧版本中 git add <路径规格>...git add --no-all <路径规格>... 的同义词,即忽略已删除的文件。

-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 submodule add.gitmodules 中创建条目时,git add 会发出警告。此选项将抑制该警告(例如,如果您正在手动执行子模块操作)。

--renormalize

对所有已跟踪文件重新应用“清理(clean)”过程,以强制重新将它们添加到索引。在更改了 core.autocrlf 配置或 text 属性后,这对于纠正以错误 CRLF/LF 换行符添加的文件非常有用。此选项隐含了 -u。单独的 CR 字符不会被处理,因此虽然 CRLF 会清理为 LF,但 CRCRLF 序列仅会部分清理为 CRLF

--chmod=(+|-)x

覆盖所添加文件的可执行位。可执行位仅在索引中更改,磁盘上的文件保持不变。

--pathspec-from-file=<文件>

路径规格通过 <文件> 传递,而不是通过命令行参数。如果 <文件> 正好是 -,则使用标准输入。路径规格元素由 LFCR/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

只要选择是唯一的,您也可以输入 sstastatus

主命令循环有 6 个子命令(加上帮助和退出)。

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.pngHEAD 有差异(但它是二进制文件,因此无法显示行数),并且索引副本与工作树版本之间没有差异(如果工作树版本也不同,则会显示 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 (添加未跟踪文件)

这具有与 updaterevert 非常相似的界面,允许您将未跟踪的路径添加到索引中。

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] 文档中选择性地包含。内容与彼处相同:

add.ignoreErrors
add.ignore-errors (已弃用)

告诉 git add 在某些文件由于索引错误而无法添加时继续添加文件。等同于 --ignore-errors 选项。add.ignore-errors 已弃用,因为它不符合配置变量的通常命名约定。

GIT

Git[1] 套件的一部分