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

#0#1有什么区别?

2050673 次浏览

此答案仅适用于Git version 1. x。对于Git version 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 initecho Change me > change-meecho Delete me > delete-megit add change-me delete-megit commit -m initial
echo OK >> change-merm delete-meecho 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 -ugit status
# Changes to be committed:#   modified:   change-me#   deleted:    delete-me# Untracked files:#   add-me
git reset
git add -Agit status
# Changes to be committed:#   new file:   add-me#   modified:   change-me#   deleted:    delete-me

查尔斯的指示开始,在测试之后,我提出的理解如下:

# 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工作目录

对于相同的路径,add .等于add -A,唯一的区别是树的其他路径中是否有新文件

Git 2.0,默认为#0:#1等于#2

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月)将允许您添加名为“:”的文件夹!
提交29abb33(2015年10月25日)由Junio C Hamano(#0)


请注意从git 2.0开始(Q1或Q2 2014),当谈论#0(工作树中的当前路径)时,您必须在其他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中对整个树进行操作,以与“#0”和其他命令保持一致。因为没有机制可以让“git add -u”表现得像“git add -u .”,所以对于那些习惯于“git add -u”(没有路径规范)仅为当前子目录中的路径更新索引的人来说,在Git 2.0到来之前开始训练他们的手指明确地说出“git add -u .”是很重要的。

当这些命令在没有路径规范的情况下运行时,以及当您在当前目录之外进行本地更改时,会发出警告,因为Git 2.0中的行为会有所不同在这种情况下的今天的版本。

一个更快速的答案:

两者都在下面(与添加失败相同)

git add -A

分期新建+修改文件

git add .

阶段修改+删除的文件

git add -u

Git 版本1. x

命令 新档案 修改过的文件 已删除文件 描述
git add -A Something Something Something 暂存所有(新的、修改的、删除的)文件
git add . Something Something Something 只在当前文件夹上演新文件和修改过的文件
git add -u Something Something Something 阶段修改和删除文件只

GitVersion2.x

命令 新档案 修改过的文件 已删除文件 描述
git add -A Something Something Something 暂存所有(新的、修改的、删除的)文件
git add . Something Something Something 将所有(新建、修改、删除)文件放置在当前文件夹中
git add --ignore-removal . Something Something Something 仅上演新的和修改过的文件
git add -u Something Something Something 阶段修改和删除文件只

长型旗帜:

  • git add -A等于 git add --all
  • git add -u等于 git add --update

进一步阅读:

Git 2.0(2014-05-28)改变了 :

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

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

  • 在工作目录中添加新的/修改/删除的文件
  • git add --ignore-removal .在工作目录中添加新的/修改过的文件
  • git add -u .在工作目录中添加修改/删除的文件
  • 如果没有点,添加项目中的所有文件,不管工作目录是什么。

我希望这能让你更清楚。

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

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

Pathspec 可能是一个文件路径或点,’.’来表示工作目录。

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

  • Git 永远不会自动识别以点为前缀的不可见文件(dotfiles)。它们甚至从未被列为“未被追踪”。
  • Git 永远不会添加空文件夹。它们甚至从未被列为“未被追踪”。(变通方法是向所跟踪的文件添加一个可能不可见的空白文件。)
  • Git 状态不会显示子文件夹信息,即未跟踪的文件,除非该子文件夹中至少有一个文件被跟踪。在此之前,Git 认为整个文件夹都超出了作用域范围,就像‘ em pty’一样。里面没有跟踪的物品。
  • 指定 filespec =’(点)或工作目录不是递归的,除非同时指定了 -A。点严格地指工作目录-它省略了上面和下面的路径。

现在,考虑到这些知识,我们可以应用上面的答案。

限制条件如下。

  • -u = --update = 所跟踪文件的子集 = > Add = No; Change = Yes; Delete = Yes。= > 如果该项目被跟踪。
  • -A = --all(没有这样的 -a,它会产生语法错误) = 所有未跟踪/跟踪文件的超集,除非在2.0之前的 Git 中,如果给定了点文件规格,那么只考虑特定的文件夹。= > 如果该项目是可识别的,git add -A将找到它并添加它。

路径规范如下。

  • 在 Git before 2.0中,对于两个限制器(update 和 all) ,新的默认设置是对整个工作树进行操作,而不是当前路径(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 重置’完全清除索引。

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

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

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

Git 2. x:

  • 如果你直接位于 工作目录,那么 git add -Agit add .的工作没有区别。

  • 如果您在 工作目录的任何子目录中,git add -A将添加来自整个 工作目录的所有文件,而 git add .将添加来自您的 工作目录的文件。

仅此而已。

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

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

当添加一个 .,将更新的范围限制到您当前所在的目录时,按照 Git 文档

如果在使用-a 选项时没有给出 <pathspec>,那么整个工作树中的所有文件都会被更新(旧版本的 Git 用于限制对工作目录及其子目录的更新)。

我要补充的一点是,如果使用 --interactive-p模式,那么 git add将表现得好像使用了 update (-u)标志,而不会添加新文件。

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 的暂存机制,这在其他 SCM 工具中找不到。 所以我总是用:

\git add --all && \git commit --all

(即使使用 \git add --all\git commit也足够了)


add:

--no-ignore-removal  --all     | add, modify, and remove index entries to match the working tree
--ignore-removal     --no-all  | add, modify             index entries to match the working tree


--intent-to-add                | add an entry for the path to the index,  with no content

-A--all的简称

git add <pathspec>等于:

用于 Git 的2.35.1版本: git add --all <pathspec>
Git 的老版本: git add --no-all <pathspec>

但是 git add后面什么都没有,不等于 git add --all,也什么都不做:

enter image description here

git add --all(省略 <pathspec>) : 处理整个工作树(Git 的旧版本)中的所有文件 用于限制对工作目录及其子目录的更新)。

全力以赴

告诉命令自动暂存已修改和删除的文件,。 没有告诉 Git 的新文件不会受到影响