directory search
Guides gitattributes giteveryday gitglossary gitignore gitmodules gitrevisions gittutorial gitworkflows Administration git archive git bundle git clean git filter-branch git fsck git gc git instaweb git reflog Basic Snapshotting git add git commit git diff git mv git reset git rm git status Branching and Merging git branch git checkout git log git merge git mergetool git stash git tag Debugging git bisect git blame git grep Email git am git format-patch git request-pull git send-email External Systems git fast-import git svn Getting and Creating Projects git clone git init Git git annotate git archimport git bisect-lk2009 git check-attr git check-mailmap git check-ref-format git checkout-index git cherry git citool git column git credential git credential-cache git credential-store git cvsexportcommit git cvsimport git cvsserver git diff-files git diff-tree git difftool git fast-export git fetch-pack git fmt-merge-msg git get-tar-commit-id git gui git http-backend git http-fetch git http-push git imap-send git index-pack git interpret-trailers git ls-remote git ls-tree git mailinfo git mailsplit git merge-file git merge-index git merge-one-file git merge-tree git mktag git mktree git name-rev git notes git p4 git pack-objects git pack-redundant git pack-refs git parse-remote git patch-id git prune git prune-packed git quiltimport git receive-pack git remote-ext git remote-fd git remote-testgit git repack git replace git rerere git send-pack git sh-i18n git sh-setup git shell git show-branch git show-index git stripspace git unpack-file git unpack-objects git upload-archive git upload-pack git var git verify-commit git verify-tag git whatchanged git worktree Inspection and Comparison git describe git shortlog git show Miscellaneous api credentials api index gitcli gitcore tutorial gitcredentials gitcvs migration gitdiffcore githooks gitk gitnamespaces gitremote helpers gitrepository layout gitsubmodules gittutorial 2 gitweb gitweb.conf pack format User Manual Patching git apply git cherry-pick git rebase git revert Plumbing Commands git cat-file git check-ignore git commit-tree git count-objects git diff-index git for-each-ref git hash-object git ls-files git merge-base git read-tree git rev-list git rev-parse git show-ref git symbolic-ref git update-index git update-ref git verify-pack git write-tree Server Admin git daemon git update-server-info Setup and Config git git config git help Sharing and Updating Projects git fetch git pull git push git remote git submodule
characters

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/file1dir/file2)来更新索引以匹配整个目录的当前状态(例如,指定dir将记录dir/file1工作树中修改的文件,dir/file2添加到工作中的文件树,也是一个文件dir/file3,从工作树移除需要注意的是旧版本的Git用于忽略删除的文件;使用--no-all,如果你想添加修改或新的文件,但忽略删除那些选项。

有关<pathspec>语法的更多详细信息,请参阅pathspecgitglossary [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

你也可以说sstastatus只要选择是唯一的上方。

主要的命令循环有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版本的阶段信息。恢复新路径使得它们不受追踪。

添加未跟踪

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

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.singleKeytrue来省略必须在此输入return 。

diff

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

编辑补丁

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

添加内容

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

删除内容

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

修改的内容

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

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

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

删除未触及的内容

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

修改现有内容

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

新的内容

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

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

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

  • 删除上下文或删除行

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

Previous article: Next article: