中文 (简体) ▾ 主题 ▾ 最新版本 ▾ 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(强制)选项添加忽略的文件。

请参阅 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

以交互方式选择索引和工作树之间的补丁块,并将它们添加到索引。 这使用户有机会在将修改的内容添加到索引之前查看差异。

这实际上运行 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 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

将 "clean" 过程重新应用于所有跟踪的文件,以强制将它们再次添加到索引。这在更改 core.autocrlf 配置或 text 属性之后非常有用,以便纠正以错误的 *CRLF/LF* 行尾添加的文件。此选项隐含 -u。单独的 CR 字符保持不变,因此,虽然 *CRLF* 清理为 *LF*,但 *CRCRLF* 序列仅部分清理为 *CRLF*。

--chmod=(+|-)x

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

--pathspec-from-file=<file>

Pathspec 在 *<file>* 中传递,而不是命令行参数。 如果 *<file>* 正好是 -,则使用标准输入。 Pathspec 元素由 *LF* 或 *CR/LF* 分隔。 Pathspec 元素可以像为配置变量 core.quotePath 所解释的那样进行引用(请参阅 git-config[1])。 另请参阅 --pathspec-file-nul 和全局 --literal-pathspecs

--pathspec-file-nul

仅在与 --pathspec-from-file 一起使用时有意义。 Pathspec 元素用 *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)。

状态

这显示了 HEAD 和索引之间的更改(即,如果您说 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>>" 提示。 当提示符以双 *>>* 结尾时,您可以进行多个选择,用空格或逗号连接。 此外,您可以说范围。 例如 "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

进行选择后,用空行回答以在索引中暂存所选路径的工作树文件的内容。

还原

这具有与 *update* 非常相似的 UI,并且所选路径的暂存信息将恢复为 HEAD 版本的暂存信息。 还原新路径会使它们变为未跟踪。

添加未跟踪

这具有与 *update* 和 *revert* 非常相似的 UI,并允许您将未跟踪的路径添加到索引。

补丁

这允许您从类似 *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

在确定了所有 hunk 的命运之后,如果选择了任何 hunk,则索引将使用所选的 hunk 进行更新。

您可以通过将配置变量 interactive.singleKey 设置为 true 来避免在此处键入回车。

差异

这使您可以查看将要提交的内容(即 HEAD 和索引之间)。

编辑补丁

调用 git add -e 或从交互式 hunk 选择器中选择 e 将在编辑器中打开一个补丁;编辑器退出后,结果将应用于索引。 您可以自由地对补丁进行任意更改,但请注意,某些更改可能会产生令人困惑的结果,甚至可能导致无法应用的补丁。 如果您想完全中止该操作(即,在索引中不暂存任何新内容),只需删除补丁的所有行即可。 下面的列表描述了您可能在补丁中看到的一些常见内容,以及哪些编辑操作是有意义的。

添加的内容

添加的内容由以 "+" 开头的行表示。 您可以通过删除添加的任何行来阻止暂存。

删除的内容

删除的内容由以 "-" 开头的行表示。 您可以通过将 "-" 转换为 " "(空格)来阻止暂存其删除。

修改的内容

修改的内容由 "-" 行(删除旧内容)后跟 "+" 行(添加替换内容)表示。 您可以通过将 "-" 行转换为 " " 并删除 "+" 行来阻止暂存修改。 请注意,仅修改该对的一半可能会在索引中引入令人困惑的更改。

还可以执行更复杂的操作。 但请注意,由于该补丁仅应用于索引,而不应用于工作树,因此工作树将显示为 "撤消" 索引中的更改。 例如,在索引中引入一个既不在 HEAD 中也不在工作树中的新行,将会暂存该新行以进行提交,但该行将显示为在工作树中被还原。

避免使用这些构造,或者在使用时格外小心。

删除未触及的内容

索引和工作树之间没有差异的内容可能会在上下文行上显示,这些行以 " "(空格)开头。 您可以通过将空格转换为 "-" 来暂存上下文行以进行删除。 结果工作树文件将显示为重新添加了内容。

修改现有内容

还可以通过将上下文行暂存以进行删除(通过将 " " 转换为 "-")并添加带有新内容的 "+" 行来修改上下文行。 类似地,可以修改现有添加或修改的 "+" 行。 在所有情况下,新的修改都将在工作树中显示为已还原。

新内容

您还可以添加补丁中不存在的新内容;只需添加新行,每行都以 "+" 开头即可。 该添加将在工作树中显示为已还原。

还有一些操作应该完全避免,因为它们会使补丁无法应用

  • 添加上下文 (" ") 或删除 ("-") 行

  • 删除上下文或删除行

  • 修改上下文或删除行的内容

配置

本节中此行以下的任何内容都选择性地包含在 git-config[1] 文档中。 内容与在那里找到的内容相同

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

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

GIT

属于 git[1] 套件的一部分

scroll-to-top