关于git add:”git add-a”和”git add”的区别。

Difference between “git add -A” and “git add .”

命令git add [--all|-A]似乎与git add .相同。这是正确的吗?如果不是,它们有什么不同?


此答案仅适用于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的输出会有所不同):

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版:enter image description here

Git版本2.x:enter image description here

长格式标志:

  • 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 -A为默认值:git add .等于git add -A .

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.

git addgit add :/类似(从顶部git repo文件夹添加所有内容)。请注意,Git2.7(2015年11月)将允许您添加名为":的文件夹"!见Junio C Hamano的Commit 29ABB33(2015年10月25日)(gitster)。

请注意,从Git2.0(2014年第1季度或第2季度)开始,在讨论git add .时(工作树中的当前路径),您还必须在其他git add命令中使用'.

这意味着:

"git add -A ." is equivalent to"git add .; git add -u ."

(注意,对于git add -Agit add -u的额外'.)

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

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 -ugit add -A对整个树进行操作。

对于Git 2,答案是:

  • git add .git add -A .在当前目录中添加新的/修改的/删除的文件
  • git add --ignore-removal .在当前目录中添加新的/修改过的文件
  • git add -u .在当前目录中添加修改/删除的文件
  • 如果没有点,则添加项目中的所有文件,而不考虑当前目录


在Git 2 x中:

  • 如果您直接位于工作目录,那么git add -Agit 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中也有效);

git add -A .

git add -u .

总之,我的政策是:

  • 1.确保要添加的任何块/文件都在Git状态下记帐。
  • 1a.如果由于不可见的文件/文件夹而丢失了任何项目,请单独添加。
  • 2.拥有一个良好的gitignore,这样通常只有感兴趣的文件才不会被跟踪和/或识别。
  • 3.从回购的顶层,"git add-a"添加所有项目。这适用于所有版本的Git。
  • 4.如果需要,从索引中删除任何需要的项目。
  • 6.如果存在大错误,请执行"git reset"以完全清除索引。

git add .等于git add -A .只从当前文件夹和子文件夹向索引添加文件。

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

P.S.:信息与Git2.0有关。


-a选项添加、修改和删除索引项以匹配工作树。

在Git2中,-A选项现在是默认的。

当添加.时,根据git文档,将更新的范围限制为当前所在目录。

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).

我要补充的一点是,如果使用--interactive-p模式,那么git add的行为将类似于使用了update(-u标志,而不是添加新文件。


git add .git add -A都将把所有新的、修改过的和删除过的文件放在git的新版本中。

不同之处在于,git add -A将文件分为"更高、当前和子目录",这些目录属于您的工作Git存储库。但是,执行git add .操作时,只会将文件放在当前目录中,并将子目录放在当前目录之后(而不是放在更高目录之外的文件)。

下面是一个例子:

1
2
3
4
5
/my-repo
  .git/
  subfolder/
    nested-file.txt
  rootfile.txt

如果您当前的工作目录是/my-repo,您执行rm rootfile.txt,然后执行cd subfolder,然后执行git add .,那么它将不会暂存删除的文件。但是,无论您从何处执行命令,执行EDOCX1[1]都肯定会逐步进行这种更改。

希望这能消除差异。