Answers:
这个答案只适用于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
git add -A -p,无法按预期工作(以交互方式询问未跟踪的文件)
git add -A :/或git add -A .
git add -u中git add -u :/,后一个参数是路径,允许您-u某些目录,:/处理整个树。
git add -u或者git add .这样做,即使考虑了为确保没有同步问题而增加的额外精神税,也使他的生活更加轻松?我不知道为什么Git不会再分解add -u为两个单独的命令add -u1,add-u2而一个命令适用于以数字开头的文件,而另一个命令适用于非数字开头的文件
这是用于快速了解的表格:
Git版本1.x:

Git版本2.x:

长格式标志:
git add -A 相当于 git add --allgit add -u 相当于 git add --update进一步阅读:
git add .仅添加当前路径上的新文件。即,如果您有一个新目录../foo,git add -A将暂存该目录,否则git add .将不会。
git add .等价于git add -A .,等价于git add "*"
在Git 2.0中,git add -A默认git add .值为:equalsgit add -A .。
git add <path>git add -A <path>现在与“ ” 相同,因此“git add dir/”将注意到您从目录中删除的路径并记录该删除。
在旧版的Git中,“git add <path>”忽略了删除。如果愿意,您可以说“
git add --ignore-removal <path>”以仅在中添加添加或修改的路径<path>。
git add -A就像git add :/(从顶部git repo文件夹添加所有内容)。
请注意,git 2.7(2015年11月)将允许您添加一个名为“: ”!
参见Junio C Hamano()提交的29abb33(2015年10月25日)。 gitster
注意 从git 2.0(2014年第一季度或2014年第二季度)开始,当谈论git add .(工作树中的当前路径)时,您还必须.在其他git add命令中使用' 。
这意味着:
“
git add -A .”等同于“git add .; git add -u .”
(请注意,额外的.' git add -A和和git add -u)
因为git add -A或git add -u会在整个工作树上(而不是仅在当前路径上)运行(仅启动git 2.0)。
这些命令将在Git 2.0中的整个树上运行,以与“
git commit -a”和其他命令保持一致。因为没有机制使“git add -u”行为像“git add -u .”,所以对于习惯于“git add -u(没有pathspec)仅更新当前子目录中路径的索引的要开始训练他们的手指明确说出“git add -u .“当他们在Git 2.0出现之前就说了这句话。当这些命令在没有路径规范的情况下运行并且在当前目录之外进行本地更改时,将发出警告,因为在这种情况下,Git 2.0中的行为将不同于今天的版本。
根据查尔斯的指示,经过测试,我的理解如下:
# 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
这篇博客文章也可能有助于理解在什么情况下可以应用这些命令:从Git Working Directory中删除已删除的文件。
Git 2.0(2014-05-28)改变了事情:
-A 现在是默认值--ignore-removal。git add -u并git add -A在命令行上没有路径的子目录中对整个树进行操作。因此对于Git 2,答案是:
git add .并git add -A .在当前目录中添加新的/修改的/删除的文件git add --ignore-removal . 在当前目录中添加新文件/修改过的文件git add -u . 在当前目录中添加修改/删除的文件一个更简化的快速答案:
git add -A
git add .
git add -u
git add :/+git add -u :/
在Git 2.x中:
如果您直接位于工作目录,那么git add -A和git add .工作没有区别。
如果您在工作目录的任何子目录中,git add -A则将添加整个工作目录中的所有文件,git add .并将添加当前目录中的文件。
就这样。
我希望这可以增加一些清晰度。
!The syntax is
git add <limiters> <pathspec>
! Aka
git add (nil/-u/-A) (nil/./pathspec)
限制符可以是-u或-A或nil。
Pathspec可以是文件路径或点“。”。指示当前目录。
有关Git如何“添加”的重要背景知识:
-A也指定,否则(点)或当前目录不是递归的。点严格指的是当前目录-它忽略了上下目录。现在,有了这些知识,我们可以应用上面的答案。
限制器如下。
-u= --update=跟踪文件的子集=>添加=否;更改=是;删除=是。=> 是否跟踪该项目。-A= --all(不这样-a,会导致语法错误)=所有未跟踪/已跟踪文件的超集,除非在2.0之前的Git中,如果给出了点filespec,则仅考虑该特定文件夹。=> 如果该项目被识别,git add -A将找到并添加它。pathspec如下。
git add -A .
git add -u .
总之,我的政策是:
git status。.gitignore文件,以便通常仅关注和/或无法识别感兴趣的文件。两者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无论您从何处执行命令,执行操作都一定会登台此更改。
git add *?