## Name

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

## 概要

    git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p]          [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]]          [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing]          [--chmod=(+|-)x] [--] [<pathspec>…]

## 描述

此命令使用工作树中的当前内容更新索引，以准备下一个提交的内容。它通常会将现有路径的当前内容作为一个整体添加，但通过一些选项，还可以使用它仅添加对所应用的工作树文件进行的部分更改的内容，或删除工作树中不存在的路径了。

“索引”包含工作树内容的快照，并且这个快照被当作下一次提交的内容。因此，在对工作树进行任何更改之后，在运行commit命令之前，必须使用`add`命令将任何新的或修改的文件添加到索引。

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

`git status`命令可用于获取在下一次提交阶段更改的文件的摘要。

`git add`命令默认不会添加被忽略的文件。如果在命令行上明确指定了任何被忽略的文件，`git add`将失败并显示被忽略的文件列表。忽略由Git执行的目录递归或文件名匹配达到的文件（在shell之前引用您的globs）将被忽略。`git add`命令可以用来添加`-f`（强制）选项忽略的文件。

请参阅git-commit [1]了解将内容添加到提交的其他方法。

## 选项

<pathspec>…

要从中添加内容的文件。`*.c`可以给Fileglobs（例如）添加所有匹配的文件。还可以给出一个主要的目录名（例如`dir`添加`dir/file1`和`dir/file2`）来更新索引以匹配整个目录的当前状态（例如，指定`dir`将记录`dir/file1`工作树中修改的文件，`dir/file2`添加到工作中的文件树，也是一个文件`dir/file3`，从工作树移除需要注意的是旧版本的Git用于忽略删除的文件;使用`--no-all`，如果你想添加修改或新的文件，但忽略删除那些选项。

有关<pathspec>语法的更多详细信息，请参阅`pathspec`gitglossary [7]中的条目。

-n --dry-run

实际不要实际添加文件，只显示它们是否存在和/或将被忽略。

-v --verbose

Be verbose.

-f --force

允许添加被忽略的文件。

-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`。该选项将会禁止警告（例如，如果您正在手动对子模块执行操作）。

--chmod=(+|-)x

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

--

此选项可用于将命令行选项与文件列表分开，（当文件名可能被误认为是命令行选项时很有用）。

结构

可选的配置变量`core.excludesFile`表示文件的路径，该文件包含要从git-add中排除的文件名的模式，类似于$ GIT_DIR / info / exclude。排除文件中的模式除了info / exclude中的使用外。见gitignore [5]。

## 例子

- 添加目录及其子目录`*.txt`下所有文件的内容`Documentation`：$ git add Documentation / \ *。txt注意`*`在本例中星号是从shell引用的; 这让命令包含来自目录子目录的`Documentation/`文件。

- 考虑从所有git - *。sh脚本添加内容：

$ git add git-*.sh

因为这个例子让shell扩展了星号（即你明确列出了这些文件），所以它没有考虑`subdir/git-foo.sh`。

## 交互模式

当命令进入交互模式时，它显示`status`子命令的输出，然后进入其交互式命令循环。

命令循环显示可用的子命令列表，并提示“What now>”。通常，当提示以单个结尾时`>`，您可以只选择其中一个选项并输入return，如下所示：

        *** 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个子命令（加上帮助和退出）。

状态

这显示了HEAD和索引之间的变化（即，如果你这么说会犯什么内容`git commit`），以及索引和工作树文件之间的变化（也就是你可以在`git commit`使用之前进一步处理的内容`git add`）。示例输出如下所示：

                  staged     unstaged path     1:       binary      nothing foo.png     2:     +403/-35        +1/-1 git-add--interactive.perl

它显示foo.png与HEAD有区别（但是它是二进制的，所以行数无法显示），索引副本和工作树版本之间没有区别（如果工作树版本也不同，`binary`将显示在的地方`nothing`）。另一个文件git-add {litdd} interactive.perl添加了403行，如果您提交了索引中的内容，则会删除35行，但工作树文件会进一步修改（一次添加和一次删除）。

更新

这将显示状态信息并发出“更新>>”提示。当提示以double结尾时`>>`，可以进行多个选择，并用空格或逗号连接。你也可以说范围。例如“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 git-add--interactive.perl

要删除选择，请使用`-`在输入前添加如下所示的内容：

    Update>> -2

做出选择之后，回答一个空行，为索引中选定路径的工作树文件的内容分段。

还原

这与用户界面`update`非常相似，并且所选路径的暂存信息将恢复为HEAD版本的阶段信息。恢复新路径使得它们不受追踪。

添加未跟踪

这有一个非常相似的用户界面`update`和`revert`，并允许您添加未经跟踪路径索引。

patch

这使您可以从`status`类似选择中选择一条路径。选择路径后，它会显示索引和工作树文件之间的差异，并询问您是否要逐步更改每个块。您可以选择以下选项之一并键入return：

    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? - print help

在决定所有块的命运之后，如果选择了任何块

，那么索引会用选定的块更新。

您可以通过设置配置变量`interactive.singleKey`为`true`来省略必须在此输入return 。

diff

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

## 编辑补丁

调用`git add -e`或`e`从交互式外观选择器中选择将在您的编辑器中打开一个修补程序; 编辑器退出后，结果将应用于索引。您可以随意对修补程序进行任意更改，但请注意，某些更改可能会导致混淆结果，甚至导致无法应用的修补程序。如果您想完全中止操作（即，在索引中没有任何新操作），只需删除该补丁的所有行即可。下面的列表描述了您可能在修补程序中看到的一些常见事项，以及哪些编辑操作对它们有意义。

添加内容

添加的内容由以“+”开头的行表示。您可以通过删除它们来防止暂存任何附加行。

删除内容

删除的内容由以“ - ”开头的行表示。您可以通过将“ - ”转换为“”（空格）来阻止他们的移除。

修改的内容

修改的内容由“ - ”行（删除旧内容），后跟“+”行（添加替换内容）表示。您可以通过将“ - ”行转换为“”并去除“+”行来阻止修改。请注意，只修改这一对的一半可能会对索引造成令人困惑的更改。

还有更复杂的操作可以执行。但要小心，因为该补丁只适用于索引而不适用于工作树，所以工作树将显示为“撤消”索引中的更改。例如，向不在HEAD和工作树中的索引中引入一个新行将为新行提交提交，但该行将显示为在工作树中恢复。

避免使用这些构造，或者非常谨慎地这样做。

删除未触及的内容

在索引和工作树之间没有差异的内容可以显示在上下文行上，以“”（空格）开头。您可以通过将空间转换为“ - ”来移除要移除的上下文行。生成的工作树文件将显示为重新添加内容。

修改现有内容

也可以通过将它们分段移除（通过将“”转换为“ - ”）并在新内容中添加“+”行来修改上下文行。同样，可以修改现有添加或修改的“+”行。在任何情况下，新的修改都会在工作树中恢复。

新的内容

您也可以添加修补程序中不存在的新内容; 只需添加新行，每行都以“+”开头。添加将在工作树中显示恢复。

还有一些应该完全避免的操作，因为它们会使修补程序无法应用：

- 添加上下文（“”）或删除（“ - ”）行

- 删除上下文或删除行

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