“git add -A”和“git add”之间的区别。

时间:2009-02-21 06:51:07

标签: git git-add

命令git add [--all|-A]似乎与git add .相同。它是否正确?如果没有,它们有何不同?

12 个答案:

答案 0 :(得分:3906)

此答案仅适用于 Git版本1.x 。对于Git版本2.x,请参阅其他答案。


<强>要点:

  • git add -A阶段所有更改

  • git add .暂存新文件和修改,无删除

  • git add -u进行修改和删除,没有新文件


<强>详情:

git add -A相当于git add .; git add -u

关于git add .的重要一点是,它会查看工作树并将所有这些路径添加到分阶段更改中(如果它们已更改或是新的且未被忽略),它不会进行任何“rm”操作

git add -u会查看所有跟踪的文件,并将这些文件的更改分级,如果这些文件不同或已被删除。它不会添加任何新文件,只会对已经跟踪的文件进行更改。

git add -A是执行这两种操作的便捷捷径。

您可以使用类似的方式测试差异(请注意,对于Git版本2.x,git add . git status 的输出会有所不同):

git init
echo Change me > change-me
echo Delete me > delete-me
git add change-me delete-me
git commit -m initial

echo OK >> change-me
rm delete-me
echo Add me > add-me

git status
# Changed but not updated:
#   modified:   change-me
#   deleted:    delete-me
# Untracked files:
#   add-me

git add .
git status

# Changes to be committed:
#   new file:   add-me
#   modified:   change-me
# Changed but not updated:
#   deleted:    delete-me

git reset

git add -u
git status

# Changes to be committed:
#   modified:   change-me
#   deleted:    delete-me
# Untracked files:
#   add-me

git reset

git add -A
git status

# Changes to be committed:
#   new file:   add-me
#   modified:   change-me
#   deleted:    delete-me

答案 1 :(得分:784)

以下是快速了解的表格:

Git版本1.x enter image description here

Git版本2.x enter image description here

长篇标志:

  • git add -A相当于git add --all
  • git add -u相当于git add --update

进一步阅读:

答案 2 :(得分:157)

Git 2.0, git add -A is default: git add . equals git add -A .

  

git add <path>现在与“git add -A <path>”相同,所以   “git add dir/”会注意到您从目录中删除的路径   记录删除。
  在旧版本的Git中,“git add <path>”过去常常忽略删除。

     

您可以说“git add --ignore-removal <path>”   如果您真的想要,请在<path>中添加仅添加或修改的路径。

git add就像git add :/add everything from top git repo folder) 请注意,git 2.7(2015年11月)将允许您添加名为“:”的文件夹! 请commit 29abb33查看Junio C Hamano (gitster)(2015年10月25日)。


请注意starting git 2.0 (Q1 or Q2 2014),在谈到 git add . (工作树中的当前路径)时,您必须在另一个{.中使用git add'{ 1}}命令。

这意味着:

  

git add -A .”相当于“git add .; git add -u .

(请注意.git add -A的额外“git add -u

因为git add -Agit add -u会在整个工作树上运行(仅启动git 2.0),而不仅仅是在当前路径上运行。

  

这些命令将在Git 2.0中的整个树上运行,以与“git commit -a”和其他命令保持一致。   因为没有任何机制可以使“git add -u”表现得像“git add -u .”,所以对于那些习惯于“git add -u”(没有pathspec)更新索引的人来说非常重要对于当前子目录中的路径,开始训练他们的手指在Git 2.0出现之前明确说出“git add -u .”。

     

在没有pathspec的情况下运行这些命令并在当前目录之外进行本地更改时会发出警告,因为Git 2.0中的行为会有所不同   在这种情况下从今天的版本开始。

答案 3 :(得分:129)

Charles' instructions开始,经过测试,我的建议理解如下:

# For the next commit
$ git add .   # Add only files created/modified to the index and not those deleted
$ git add -u  # Add only files deleted/modified to the index and not those created
$ git add -A  # Do both operations at once, add to all files to the index

此博客文章也可能有助于了解这些命令可能应用于何种情况: Removing Deleted Files from your Git Working Directory

答案 4 :(得分:34)

更简洁的快速回答:

以下两者(与 git add --all 相同)

git add -A

分阶段新修改的文​​件

git add .

Stages modified + deleted files

git add -u

答案 5 :(得分:26)

使用Git 2.0

Things changed

  • -A现在是默认
  • --ignore-removal
  • 现在可以使用旧的行为
  • git add -ugit add -A位于命令行上没有路径的子目录中,对整个树进行操作

因此,对于git 2,答案是:

  • git add .git add -A .在当前目录中添加新/已修改/已删除的文件
  • git add --ignore-removal .在当前目录中添加新/修改过的文件
  • git add -u .在当前目录中添加已修改/已删除的文件
  • 不带点,添加项目中的所有文件,无论当前目录是什么

答案 6 :(得分:23)

Git 2.x

  • 如果您直接位于工作目录,那么git add -Agit add .可以正常工作。

  • 如果您位于工作目录的任何子目录中,git add -A将添加整个工作目录中的所有文件,并{{1将添加当前目录中的文件

就是这样。

答案 7 :(得分:11)

最后我想我得到了这个,非常感谢大家。我希望这可以增加一些清晰度。

!The syntax is
git add <limiters> <pathspec>
! Aka
git add (nil/-u/-A) (nil/./pathspec)

限制器可能是-u或-A或nil。

Pathspec可能是文件路径或点,&#39;。&#39;指示当前目录。

关于git&#39;添加&#39;。

的重要背景知识
  • 不可见的文件,以点为前缀的那些文件(dotfiles)永远不会被Git自动识别。它们甚至从未被列为“未跟踪”。
  • git永远不会添加空文件夹。它们甚至从未被列为“未跟踪”。 (解决方法是向跟踪的文件添加一个可能不可见的空白文件。)
  • Git状态不会显示子文件夹信息,即未跟踪文件,除非跟踪该子文件夹中的至少一个文件。在此之前,git认为整个文件夹超出了范围,而且是空的&#39;。它没有被跟踪的物品。
  • 指定filespec =&#39;。&#39; (点)或当前目录不是递归的,除非还指定了-A。 Dot严格指当前目录 - 它省略了上面和下面找到的路径。

现在,鉴于这些知识,我们可以应用上述答案。

限制因素如下。

  • -u = --update =跟踪文件的子集=&gt;添加=否;改变=是;删除=是。 =&GT; iff项目被跟踪。
  • -A = --all(没有这样的-a,这给出了语法错误)=所有未跟踪/跟踪文件的超集,除非在Git&lt; 2.0,其中如果给出点文件规范,则仅考虑该特定文件夹。 =&GT;如果该项被识别,git add -A将找到并添加它。

pathspec如下。

  • 在Git&lt; 2.0中,对于两个限制器(更新和全部),新的默认值是在整个工作树上运行,而不是当前路径(git&lt; = 1.9),
  • 但是,在v2.0中,操作可以限制为当前路径:只需添加显式点后缀(在Git&lt; = 1.9中也有效);

git add -A .

git add -u .

总之,我的政策是;

  • 1.确保要添加的任何数据库/文件都以git状态计算。
  • 1A。如果由于不可见的文件/文件夹而丢失任何项目,请单独添加。
  • 2.有一个好的gitignore,所以通常只有感兴趣的文件没有跟踪和/或无法识别。
  • 3.从回购的顶层开始,&#34; git add -A&#34;添加所有项目。这适用于所有版本的git。
  • 4.如果需要,从索引中删除任何所需的项目。
  • 6.如果有大错误,请执行git reset&#39;完全清除指数。

答案 8 :(得分:9)

git add .等于git add -A .仅将文件添加到当前和子文件夹的索引中。

git add -A将文件添加到工作树中所有文件夹的索引中。

P.S。:信息与Git 2.0有关。

答案 9 :(得分:3)

-A选项添加,修改和删除索引条目以匹配工作树。

在GIT 2中,-A选项现在是默认选项。

根据Git documentation

,添加了.并将更新范围限制为您当前所在的目录时
  

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

我要添加的一件事是,如果使用--interactive-p模式,则git add的行为就像使用了update(-u)标志而不添加新标志一样文件

答案 10 :(得分:2)

git add .git add -A都将在git的较新版本中暂存所有新文件,已修改文件和已删除文件。

区别在于git add -A在属于您的git存储库的“更高,最新和子目录”中暂存文件。但是执行git add .仅在当前目录及其后的子目录中暂存文件(而不是位于外部目录(即更高目录)中的文件)。

这是一个例子:

/my-repo
  .git/
  subfolder/
    nested-file.txt
  rootfile.txt

如果您当前的工作目录是/my-repo,并且您执行了rm rootfile.txt,然后是cd subfolder,然后是git add .,那么它将不会暂存已删除的文件。但是无论您从何处执行命令,执行git add -A无疑都可以进行此更改。

希望这可以清除差异。

答案 11 :(得分:0)

描述每个标志的作用很有用。使用bit之类的CLI,您可以在键入时访问标志说明。