Difference between “git add -A” and “git add .”
命令
此答案仅适用于Git版本1.x。对于Git版本2.x,请参阅其他答案。
总结:
git add -A 阶段所有更改git add . 阶段新文件和修改,不删除git add -u 阶段修改和删除,无新文件
细节:
关于
您可以这样测试差异(注意,对于git版本2.x,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | 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 1.x版:
Git版本2.x:
长格式标志:
git add -A 相当于git add --all 。git add -u 相当于git add --update 。
进一步阅读:
- 初学者Git:权威实用指南
- 有15分钟时间想学吉特吗?(以互动方式)
- http://pcottle.github.io/learngitbraching/
- http://www.wei-wang.com/explaingitwithd3/
使用git 2.0时,
git add is the same as"git add -A " now, so that
"git add dir/ " will notice paths you removed from the directory and
record the removal.
In older versions of Git,"git add " used to ignore removals.You can say"
git add --ignore-removal " to
add only added or modified paths in, if you really want to.
请注意,从Git2.0(2014年第1季度或第2季度)开始,在讨论
这意味着:
"
git add -A . " is equivalent to"git add .; git add -u . "
(注意,对于
因为
Those commands will operate on the entire tree in Git 2.0 for consistency with"
git commit -a " and other commands.
Because there will be no mechanism to make"git add -u " behave as if"git add -u . ", it is important for those who are used to"git add -u " (without pathspec) updating the index only for paths in the current subdirectory to start training their fingers to explicitly say"git add -u . " when they mean it before Git 2.0 comes.A warning is issued when these commands are run without a pathspec and when you have local changes outside the current directory, because the behaviour in Git 2.0 will be different
from today's version in such a situation.
根据查尔斯的指示,在测试完我提出的理解之后,将如下:
1 2 3 4 | # 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工作目录中删除已删除的文件。
更精辟的快速答案:
是否都在下面(与git add相同--all)1 | git add -A |
准备新的+修改过的文件
1 | git add . |
阶段已修改+已删除文件
1 | git add -u |
Git2.0发生了变化:
-A 现在是违约- 旧的行为现在可以在
--ignore-removal 中使用。 - 在命令行上没有路径的子目录中,
git add -u 和git add -A 对整个树进行操作。
对于Git 2,答案是:
git add . 和git add -A . 在当前目录中添加新的/修改的/删除的文件git add --ignore-removal . 在当前目录中添加新的/修改过的文件git add -u . 在当前目录中添加修改/删除的文件- 如果没有点,则添加项目中的所有文件,而不考虑当前目录
在Git 2 x中:
如果您直接位于工作目录,那么
git add -A 和git add . 工作时没有差别。如果您在工作目录的任何子目录中,
git add -A 将添加整个工作目录中的所有文件,git add . 将添加当前目录中的文件。
就这样。
我终于明白了,多谢大家。我希望这能增加一些清晰度。
1 2 3 4 | !The syntax is git add <limiters> <pathspec> ! Aka git add (nil/-u/-A) (nil/./pathspec) |
限制器可以是-u或-a或nil。
路径规范可以是文件路径或点,"."以指示当前目录。
有关Git"添加"方式的重要背景知识。
- 不可见的文件,那些以点(dotfiles)为前缀的文件永远不会被git自动识别。它们甚至从未被列为"未跟踪"。
- Git从不添加空文件夹。它们甚至从未被列为"未跟踪"。(解决方法是将可能不可见的空白文件添加到跟踪文件中。)
- Git状态不会显示子文件夹信息,即未跟踪的文件,除非跟踪该子文件夹中的至少一个文件。在此之前,Git认为整个文件夹超出范围,即"空"。它没有跟踪项目。
- 指定filespec='.'(dot)或当前目录不是递归的,除非也指定了-a。点严格地指当前目录-它省略了上面和下面找到的路径。
现在,考虑到这些知识,我们可以应用上面的答案。
限制器如下。
- -U=--更新=跟踪文件的子集=>添加=否;更改=是;删除=是。=>如果跟踪项目。
- -A=--所有(没有这样的-A,它给出语法错误)=superset所有未跟踪/跟踪的文件,除非在git<2.0中,其中如果给定了dot filespec,那么只考虑特定的文件夹。=>如果项目被识别,git add-a会找到并添加它。
路径规范如下。
- 在git<2.0中,对于两个限制器(update和all),新的默认值是在整个工作树上操作,而不是当前路径(git<1.9)。
- 但是,在v2.0中,操作可以限制在当前路径:只需添加显式的点后缀(在git<=1.9中也有效);
总之,我的政策是:
- 1.确保要添加的任何块/文件都在Git状态下记帐。
- 1a.如果由于不可见的文件/文件夹而丢失了任何项目,请单独添加。
- 2.拥有一个良好的gitignore,这样通常只有感兴趣的文件才不会被跟踪和/或识别。
- 3.从回购的顶层,"git add-a"添加所有项目。这适用于所有版本的Git。
- 4.如果需要,从索引中删除任何需要的项目。
- 6.如果存在大错误,请执行"git reset"以完全清除索引。
P.S.:信息与Git2.0有关。
-a选项添加、修改和删除索引项以匹配工作树。
在Git2中,
当添加
If no
is given when -A option is used, all files in the entire working tree are updated (old versions of Git used to limit the update to the current directory and its subdirectories).
我要补充的一点是,如果使用
不同之处在于,
下面是一个例子:
1 2 3 4 5 | /my-repo .git/ subfolder/ nested-file.txt rootfile.txt |
如果您当前的工作目录是
希望这能消除差异。