简体中文 ▾ 主题 ▾ 最新版本 ▾ git-add 上次更新于 2.48.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>…​]

描述

此命令使用工作树中找到的当前内容更新索引,以准备下一次提交的暂存内容。它通常会整体添加现有路径的当前内容,但通过一些选项,它也可以用于添加仅应用了对工作树文件部分更改的内容,或删除工作树中不再存在的路径。

“索引”保存了工作树内容的快照,正是此快照被用作下一次提交的内容。因此,在对工作树进行任何更改之后,以及在运行 commit 命令之前,您必须使用 add 命令将任何新建或修改的文件添加到索引中。

此命令可以在提交前执行多次。它只在运行 add 命令时添加指定文件的内容;如果您希望将后续更改包含在下一次提交中,则必须再次运行 git add 以将新内容添加到索引中。

git status 命令可用于获取哪些文件有更改且已暂存以供下次提交的摘要。

git add 命令默认不会添加被忽略的文件。如果命令行上明确指定了任何被忽略的文件,git add 将失败并列出被忽略的文件。通过 Git 执行的目录递归或文件名通配符(在 shell 之前引用您的通配符)找到的被忽略文件将被静默忽略。git add 命令可以使用 -f (force) 选项来添加被忽略的文件。

有关将内容添加到提交的替代方法,请参阅 git-commit[1]

选项

<pathspec>...

要添加内容的文件。可以使用文件通配符(例如 *.c)来添加所有匹配的文件。还可以给定一个开头的目录名(例如 dir 来添加 dir/file1dir/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> 恰好是 -,则使用标准输入。路径规范元素由 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 个子命令(加上 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.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 的选择中选择一个路径。选择路径后,它会显示索引和工作树文件之间的差异,并询问您是否要暂存每个补丁块(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] 文档中选择性地包含。内容与彼处相同:

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

指示 git add 在某些文件因索引错误而无法添加时继续添加文件。等同于 --ignore-errors 选项。add.ignore-errors 已废弃,因为它不遵循配置变量的常规命名约定。

Git

Git[1] 套件的一部分

scroll-to-top