git-add

原文: https://git-scm.com/docs/git-add

名称

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

概要

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

描述

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

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

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

git status命令可用于获取哪些文件具有为下次提交而暂存的更改的摘要。

默认情况下,git add命令不会添加被忽略的文件。如果在命令行中显式指定了任何被忽略的文件,则git add将失败并显示被忽略文件的列表。由Git执行的目录递归或文件名通配所达到的忽略文件(在shell之前引用你的globs)将被默默忽略。 git add 命令可用于使用-f(强制)选项添加被忽略的文件。

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

OPTIONS

  1. <pathspec>…​

要添加内容的文件。可以给出Fileglobs(例如*.c)来添加所有匹配的文件。还可以给出一个前导目录名称(例如dir添加dir/file1dir/file2)来更新索引以匹配整个目录的当前状态(例如,指定dir将不仅记录文件在工作树中修改了dir/file1,将文件dir/file2添加到工作树中,还从工作树中删除了文件dir/file3。请注意,旧版本的Git用于忽略已删除的文件;如果要添加已修改或新文件但忽略已删除的文件,请使用--no-all选项。

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

  1. -n
  1. --dry-run

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

  1. -v
  1. --verbose

要冗长。

  1. -f
  1. --force

允许添加否则忽略的文件。

  1. -i
  1. --interactive

将工作树中的修改内容以交互方式添加到索引中。可以提供可选的路径参数以限制对工作树的子集的操作。有关详细信息,请参阅“交互模式”

  1. -p
  1. --patch

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

这有效地运行add --interactive,但绕过初始命令菜单并直接跳转到patch子命令。有关详细信息,请参阅“交互模式”

  1. -e
  1. --edit

在编辑器中打开diff与索引,让用户编辑它。编辑器关闭后,调整hunk标头并将修补程序应用于索引。

此选项的目的是选择要应用的修补程序的行,甚至修改要暂存的行的内容。这比使用交互式块大选择器更快,更灵活。但是,很容易混淆自己并创建一个不适用于索引的补丁。请参阅下面的编辑补丁。

  1. -u
  1. --update

更新索引,它已经具有匹配< pathspec>的条目。这将删除并修改索引条目以匹配工作树,但不添加新文件。

如果没有< pathspec>在使用-u选项时,将更新整个工作树中的所有跟踪文件(旧版本的Git用于限制对当前目录及其子目录的更新)。

  1. -A
  1. --all
  1. --no-ignore-removal

不仅更新索引,而且工作树的文件匹配< pathspec>而且索引已经有一个条目。这将添加,修改和删除索引条目以匹配工作树。

如果没有< pathspec>当使用-A选项时,会给出整个工作树中的所有文件(旧版本的Git用于限制对当前目录及其子目录的更新)。

  1. --no-all
  1. --ignore-removal

通过添加索引未知的新文件和工作树中修改的文件来更新索引,但忽略已从工作树中删除的文件。当没有< pathspec>时,此选项是无操作用来。

此选项主要用于帮助习惯于旧版本Git的用户,其“git add< pathspec> …”是“git add —no-all< pathspec> …”的同义词,即被忽略删除文件。

  1. -N
  1. --intent-to-add

仅记录稍后将添加路径的事实。路径的条目放在索引中,没有内容。除其他外,这对于使用git diff显示此类文件的未分级内容并使用git commit -a提交它们非常有用。

  1. --refresh

不要添加文件,而只刷新索引中的stat()信息。

  1. --ignore-errors

如果由于索引错误而无法添加某些文件,请不要中止操作,而是继续添加其他文件。该命令仍将以非零状态退出。配置变量add.ignoreErrors可以设置为true以使其成为默认行为。

  1. --ignore-missing

此选项只能与—dry-run一起使用。通过使用此选项,用户可以检查是否将忽略任何给定文件,无论它们是否已存在于工作树中。

  1. --no-warn-embedded-repo

默认情况下,git add会在向索引添加嵌入式存储库时发出警告,而不使用git submodule add.gitmodules中创建条目。此选项将禁止警告(例如,如果您在子模块上手动执行操作)。

  1. --renormalize

将“清理”过程新近应用于所有跟踪的文件,以强制将它们再次添加到索引中。在更改core.autocrlf配置或text属性以更正添加了错误的CRLF / LF行结尾的文件后,这很有用。该选项意味着-u

  1. --chmod=(+|-)x

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

  1. --

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

组态

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

例子

  • 添加Documentation目录及其子目录下所有*.txt文件的内容:

    1. $ git add Documentation/\*.txt

    请注意,在此示例中,引用了星号*;这使命令包含来自Documentation/目录的子目录的文件。

  • 考虑从所有git - * .sh脚本添加内容:

    1. $ git add git-*.sh

    因为这个例子让shell扩展了星号(即你明确地列出了文件),所以它不考虑subdir/git-foo.sh

交互模式

当命令进入交互模式时,它显示状态子命令的输出,然后进入其交互式命令循环。

命令循环显示可用的子命令列表,并给出提示“What now>”。通常,当提示以单个>结束时。 ,您只能选择给定的一个选项并输入return,如下所示:

  1. *** Commands ***
  2. 1: status 2: update 3: revert 4: add untracked
  3. 5: patch 6: diff 7: quit 8: help
  4. What now> 1

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

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

  1. status

这显示了HEAD和索引之间的变化(即,如果你说git commit将会提交什么),以及索引和工作树文件之间的变化(即你可以在git commit之前使用git add进一步分段)每个路径。示例输出如下所示:

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

它表明foo.png与HEAD有区别(但是二进制因此无法显示行数)并且索引副本和工作树版本之间没有区别(如果工作树版本也不同,二进制代替没有)。另一个文件git-add {litdd} interactive.perl,如果你提交了索引中的内容,则添加了403行并删除了35行,但是工作树文件有进一步修改(一次添加和一次删除)。

  1. update

这会显示状态信息并发出“更新>>”提示。当提示以double >>结束时,您可以进行多个选择,与空格或逗号连接。你也可以说范围。例如。 “2-5 7,9”从列表中选择2,3,4,5,7,9。如果省略范围中的第二个数字,则将采用所有剩余的修补程序。例如。 “7-”从列表中选择7,8,9。你可以说 * 来选择一切。

然后用 * 突出显示您选择的内容,如下所示:

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

要删除选择,请在输入前添加-,如下所示:

  1. Update>> -2

进行选择后,使用空行回答以分级索引中选定路径的工作树文件的内容。

  1. revert

这与更新具有非常相似的UI,并且所选路径的分阶段信息被恢复为HEAD版本的分段信息。恢复新路径使它们无法跟踪。

  1. add untracked

这与更新还原具有非常相似的UI,并允许您向索引添加未跟踪的路径。

  1. patch

这使您可以选择状态中的一个路径,例如选择。选择路径后,它会显示索引和工作树文件之间的差异,并询问您是否要分阶段更改每个块。您可以选择以下选项之一并键入return:

  1. y - stage this hunk
  2. n - do not stage this hunk
  3. q - quit; do not stage this hunk or any of the remaining ones
  4. a - stage this hunk and all later hunks in the file
  5. d - do not stage this hunk or any of the later hunks in the file
  6. g - select a hunk to go to
  7. / - search for a hunk matching the given regex
  8. j - leave this hunk undecided, see next undecided hunk
  9. J - leave this hunk undecided, see next hunk
  10. k - leave this hunk undecided, see previous undecided hunk
  11. K - leave this hunk undecided, see previous hunk
  12. s - split the current hunk into smaller hunks
  13. e - manually edit the current hunk
  14. ? - print help

在决定所有帅哥的命运之后,如果有任何大块被选中,则使用所选的帅哥更新索引。

通过将配置变量interactive.singleKey设置为true,可以省略必须在此处键入return。

  1. diff

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

编辑补丁

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

  1. added content

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

  1. removed content

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

  1. modified content

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

还可以执行更复杂的操作。但要注意,因为补丁仅应用于索引而不是工作树,所以工作树将显示“撤消”索引中的更改。例如,将新行引入到HEAD和工作树中的索引中都会为提交提供新行,但该行似乎将在工作树中恢复。

避免使用这些结构,或者非常谨慎地使用这些结构。

  1. removing untouched content

索引和工作树之间没有差异的内容可以在上下文行中显示,以“”(空格)开头。您可以通过将空格转换为“ - ”来分阶段删除上下文行。生成的工作树文件将显示为重新添加内容。

  1. modifying existing content

还可以通过暂存它们来修改上下文行(通过将“”转换为“ - ”)并在新内容中添加“+”行来修改上下文行。类似地,可以修改“+”行以用于现有的添加或修改。在所有情况下,新修改将在工作树中显示为还原。

  1. new content

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

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

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

  • 删除上下文或删除行

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

也可以看看

git-status [1] git-rm [1] git-reset [1] git-mv [1] git-commit [1] git-update-index [1]

GIT

部分 git [1] 套件