此回答仅适用于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 add -A |
✔️ | ✔️ | ✔️ | 将所有(包括新增、修改和删除)的文件加入到暂存区 |
git add . |
✔️ | ✔️ | ❌ | 只将当前文件夹中的新增和修改文件加入到暂存区 |
git add -u |
❌ | ✔️ | ✔️ | 只将修改和删除的文件加入到暂存区 |
命令 | 新文件 | 修改文件 | 删除文件 | 描述 |
---|---|---|---|---|
git add -A |
✔️ | ✔️ | ✔️ | 将所有(包括新增、修改和删除)的文件加入到暂存区 |
git add . |
✔️ | ✔️ | ✔️ | 将当前文件夹中所有(包括新增、修改和删除)的文件加入到暂存区 |
git add --ignore-removal . |
✔️ | ✔️ | ❌ | 只将当前文件夹中的新增和修改文件加入到暂存区 |
git add -u |
❌ | ✔️ | ✔️ | 只将修改和删除的文件加入到暂存区 |
git add -A
等同于 git add --all
git add -u
等同于 git add --update
git add .
相当于 git add -A .
,它们也等同于 git add "*"
。 - flow2kgit 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 -A
就像 git add :/
(添加顶级 git 仓库文件夹中的所有内容)。
请注意,git 2.7(2015 年 11 月)将允许您添加名为 ":
" 的文件夹!
请参见 提交 29abb33(2015 年 10 月 25 日),作者是 Junio C Hamano (gitster
)。
git add .
(工作树中的当前路径)时,您必须在其他git add
命令中也使用'.
'。git add -A .
”等同于“git add .; git add -u .
”git add -A
和git add -u
的额外'.
')git add -A
或git add -u
将操作(仅限于从git 2.0开始)整个工作树,而不仅仅是当前路径。根据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版本已经不再适用。对于相同路径,add .
等同于add -A
,唯一的区别是树的其他路径中是否有新文件。
Git 2.0 (2014-05-28)的变化:
-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 .
则会添加当前目录下的文件。
以上就是全部内容。
更简洁的快速回答:
git add -A
git add .
git add -u
git add :/
和 git add -u :/
结合起来使用。 - Nick Volynkin无论是 git add .
还是 git add -A
都会在较新版本的Git中将所有新文件、修改过的文件和已删除文件都标记为staged。
不同之处在于,git add -A
会将属于您工作Git仓库的“更高级别、当前和子目录”的文件标记为staged。而使用 git add .
只会标记当前目录及其子目录中的文件(不包括位于外部的文件,即更高级别的目录)。
以下是一个示例:
/my-repo
.git/
subfolder/
nested-file.txt
rootfile.txt
如果您的当前工作目录是/my-repo
,并且您执行rm rootfile.txt
,然后执行cd subfolder
,接着执行git add .
,那么它将不会将已删除的文件添加到您的提交中。但是,执行git add -A
将无论在哪里执行该命令,都会将此更改添加到您的提交中。git add .
等同于 git add -A .
,只把当前目录和子目录下的文件加入到暂存区。
git add -A
把工作树中所有目录下的文件都加入到暂存区。
P.S.: 信息来源于Git 2.0(2014-05-28)。
我希望这能增加一些清晰度。
!The syntax is
git add <limiters> <pathspec>
! Aka
git add (nil/-u/-A) (nil/./pathspec)
限定符可能是 -u 或 -A 或 nil。
路径规范可以是文件路径或点,'.' 表示当前目录。
关于 Git '添加' 的重要背景知识:
-A
,则指定文件规范 = '.'(点),或当前目录,不具有递归性。Dot严格指当前目录-省略了上面和下面发现的路径。现在,有了这些知识,我们可以应用上述答案。
限制器如下:
-u
= --update
= 子集,跟踪的文件=>添加=否;更改=是;删除=是。=> 如果该项被跟踪。-A
= --all
(没有这样的-a
,这会导致语法错误)=所有未跟踪/已跟踪文件的超集,除非在Git 2.0之前,如果给出了点文件规范,则仅考虑该特定文件夹。=> 如果识别该项,则git add -A
将找到它并添加它。路径规范如下。
git add -A .
git add -u .
总之,我的策略是:
git status
中都有记录。.gitignore
文件,以便通常只有感兴趣的文件未跟踪和/或未识别。
git add *
与其他git add
命令有何不同? - Jaredgit add -A -p
不能像人们期望的那样工作(交互式地询问未被追踪的文件)。 - Erik Kaplungit add -A :/
或git add -A .
。 - Gabriel Llamasgit add -u
已经变成了git add -u :/
,其中后面的参数是路径,允许您更新某些目录,而:/
则处理整个树。 - Brizeegit add -u
或git add .
,并且即使考虑到增加的心理负担以确保没有同步问题后,这样做也会让他的生活更轻松?我想知道为什么Git不进一步将add -u
分成两个单独的命令add -u1
和add-u2
,其中一个适用于以数字开头的文件,另一个适用于以非数字开头的文件。 - Pacerier