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

git add [--all|-A]命令似乎与git add .相同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 有所不同):

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 2.0 中, git add -A是默认值: git add .等于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 :/从顶部 git repo 文件夹添加所有内容 )。
请注意,git 2.7(2015 年 11 月)将允许您添加一个名为 “ : ” 的文件夹!
参见Junio C gitstergitster 提交的 29abb33 (2015 年 10 月 25 日


请注意,在谈论git add .时, 从 git 2.0 开始(2014 年第一季度或第二季度) git add . (工作树中的当前路径),您必须使用 ' .在其他git add命令。

这意味着:

git add -A .等效于git add .; git add -u .

(请注意git add -Agit 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 . ”。

当这些命令在没有路径规范的情况下运行时,以及在当前目录之外进行本地更改时,都会发出警告 ,因为在这种情况下,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 add --all 一样

git add -A

暂存新文件和修改过的文件

git add .

阶段修改和删除文件

git add -u

Git 2.0( 2014-05-28改变事情

  • -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 .将从当前目录添加文件。

就这样。

我希望这可以增加一些清晰度。

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

限制符可以是 - u 或 - A 或 nil。

Pathspec 可以是文件路径或点 “。”。指示当前目录。

有关 Git 如何 “添加” 的重要背景知识:

  • Git 永远不会自动识别以点为前缀的不可见文件(点文件)。他们甚至从未被列为 “未跟踪”。
  • 空文件夹不会由 Git 添加。他们甚至从未被列为 “未跟踪”。 (一种解决方法是向跟踪的文件中添加一个可能不可见的空白文件。)
  • Git 状态将不会显示子文件夹信息,即未跟踪的文件,除非已跟踪该子文件夹中的至少一个文件。在此之前,Git 认为整个文件夹超出范围,称为 “空”。它没有跟踪的项目。
  • 指定 filespec ='。 (点)或当前目录不是递归的,除非也指定了-A 。点严格指的是当前目录 - 它忽略了上下目录。

现在,有了这些知识,我们可以应用上面的答案。

限制器如下。

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

pathspec 如下。

  • 在 2.0 之前的 Git 中,对于两个限制器(更新和全部),新的默认设置是对整个工作树进行操作,而不是对当前路径(Git 1.9 或更早版本)进行操作,
  • 但是,在 v2.0 中,可以将操作限制为当前路径:只需添加显式的点后缀(在 Git 1.9 或更早版本中也有效);

git add -A .

git add -u .

总之,我的政策是:

  1. 确保所有要添加的块 / 文件都被计入git status
  2. 如果由于看不见的文件 / 文件夹而缺少任何项目,请分别添加它们。
  3. 拥有一个良好的.gitignore文件,以便通常仅关注和 / 或无法识别感兴趣的文件。
  4. 在存储库的顶层,使用 “git add -A” 添加所有项目。这适用于所有版本的 Git。
  5. 如果需要,请从索引中删除所有需要的项目。
  6. 如果存在大错误,请执行 “git reset” 以完全清除索引。

git add .等于git add -A .仅从当前文件夹和子文件夹添加文件以建立索引。

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

PS:与Git 2.0有关的信息(2014-05-28)。

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

区别在于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肯定都会执行此更改。