git-add[-all|-A]和git-add.之间有什么区别。?


当前回答

根据Charles的指示,经过测试后,我提出的理解如下:

# 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工作目录中删除已删除的文件。

这在2.0中不再适用。添加等于为同一路径添加-A,唯一的区别是树的其他路径中是否有新文件

其他回答

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

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

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

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

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

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

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

限制器如下。

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

路径规范如下。

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

git add-A。

git add-u。

总之,我的政策是:

确保所有要添加的块/文件都以git状态进行说明。如果由于文件/文件夹不可见而缺少任何项目,请单独添加它们。拥有一个好的.gitignore文件,这样通常只有感兴趣的文件才能被跟踪和/或识别。从存储库的顶层,“gitadd-A”添加所有项目。这适用于所有版本的Git。如果需要,从索引中删除任何所需项目。如果存在大错误,请执行“gitreset”以完全清除索引。

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

-A现在是默认值旧的行为现在可以使用--ignore删除。命令行上没有路径的子目录中的gitadd-u和gitadd-A对整个树进行操作。

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

git添加。和git-add-A。在当前目录中添加新的/修改的/删除的文件gitadd—忽略删除。在当前目录中添加新的/修改的文件git add-u。在当前目录中添加修改/删除的文件如果没有圆点,则添加项目中的所有文件,而不考虑当前目录。

Git版本1.x

Command New Files Modified Files Deleted Files Description
git add -A ✔️ ✔️ ✔️ Stage all (new, modified, deleted) files
git add . ✔️ ✔️ Stage new and modified files only in current folder
git add -u ✔️ ✔️ Stage modified and deleted files only

Git 2.x版

Command New Files Modified Files Deleted Files Description
git add -A ✔️ ✔️ ✔️ Stage all (new, modified, deleted) files
git add . ✔️ ✔️ ✔️ Stage all (new, modified, deleted) files in current folder
git add --ignore-removal . ✔️ ✔️ Stage new and modified files only
git add -u ✔️ ✔️ Stage modified and deleted files only

长格式标志:

gitadd-A相当于gitadd--allgitadd-u等同于gitadd--update

进一步阅读:

初学者Git:权威实用指南学习Git的资源学习Git分支用D3解释Git

两个git add。gitadd-A将在更新版本的git中暂存所有新的、修改的和删除的文件。

不同之处在于,git add-A将文件存放在属于您工作的git存储库的“更高、当前和子目录”中。但做一个git加法。仅暂存当前目录及其后的子目录中的文件(而不是位于外部的文件,即更高的目录)。

下面是一个示例:

/my-repo
  .git/
  subfolder/
    nested-file.txt
  rootfile.txt

如果您当前的工作目录是/my repo,并且您执行rm rootfile.txt,然后是cd子文件夹,然后是git add。,则它将不暂存已删除的文件。但是,无论您从何处执行命令,执行git add-A肯定会进行此更改。

一个更精炼的快速答案:

两者都在下面(与git add--all相同)

git add -A

暂存新的+修改的文件

git add .

阶段已修改+已删除文件

git add -u