git add .,git add -A,git add -u,git add * 的区别与联系
考查知识点
-
Git 的使用
导读
主要看开发中基础工具的使用熟练度,以及在使用过程中是有自己的总结思考还是能用就行。
题解
这几个命令在不同版本的 Git 中稍有差异。
对于 Git Version 1.x:
-
git add .
:会将当前工作区中当前目录(包括子目录)下的所有新文件和对已有文件的改动提交至暂存区,但不包括被删除的文件。 -
git add -u
:git add --update
的简写形式,它只会监控当前整个工作区中之前已被add
的文件,即已被跟踪(tracked)的文件,也就是只会将当前整个工作区中被修改和被删除的文件提交至暂存区。而新文件因为未被跟踪(untracked),所以不会被提交至暂存区。 -
git add -A
:git add --all
的简写形式,它会将当前整个工作区中所有的文件改动提交至暂存区,包括新增、修改和被删除的文件,不受当前所在目录限制。
注意:你会看到有些文章说 git add -A
属于 git add .
和 git add -u
功能的合集,这是不对的。因为 git add .
只会提交当前目录(包括子目录)下的新文件和对已有文件的改动,而 git add -A
不受当前目录限制。也就是说,git add .
和 git add -u
功能的合集只能属于 git add -A
功能的子集。
总结详见下图:
Git Version 1.x | 新文件 | 被修改的文件 | 被删除的文件 | 是否受当前所在目录限制 | 说明 |
---|---|---|---|---|---|
git add -A. | ✅ | ✅ | ✅ | ❌ | 将当前整个工作区中所有的文件改动提交至暂存区,包括新增、修改和被删除的文件,不受当前所在目录限制 |
git add . | ✅ | ✅ | ❌ | ✅ | 将当前工作区中当前目录(包括子目录)下的所有新文件和对已有文件的改动提交至暂存区,但不包括被删除的文件 |
git add -u. | ❌ | ✅ | ✅ | ❌ | 将当前整个工作区中被修改和被删除的文件提交至暂存区。而新文件因为未被跟踪(untracked),所以不会被提交至暂存区 |
对于 Git Version 2.x:
在 Git --version 2.x 中对 git add .
的功能做了改动,git add .
会提交当前工作区中当前目录(包括子目录)下所有的文件改动,不像在 Git --version 1.x 时那样不包括被删除的文件。
Git Version 2.x 中如果想在使用 git add .
时不提交被删除的文件,可以使用 git add --ignore-removal
加上匹配符 .
,即 git add --ignore-removal .
。
git add --ignore-removal
后的匹配符是可以更换的(但不能缺省),例如 git add --ignore-removal -A
可以实现在 git add -A
时不提交被删除的文件。
有些文章说在 Git --version 2.x 中 git add .
和 git add -A
的功能变得完全相同,这是不对的。因为我们之前提到过,git add .
提交的文件改动受当前所在目录限制,它只会提交当前工作区中当前目录(包括子目录)下的文件改动,而 git add -A
不受当前所在目录的限制,提交的是当前整个工作区中所有的文件改动。
git add *
git add *
表示添加当前目录(包括子目录)下的所有文件改动,但不包括文件名以 .
符号开头的文件的改动。这是 Shell 命令,git 只是接收文件列表。而 git add .
的功能与 git add *
基本相同,只是 git add .
会将文件名以 .
符号开头的文件的改动也提交至暂存区。
总结详见下图:
Git Version 2.x | 新文件 | 被修改的文件 | 被删除的文件 | 是否受当前所在目录限制 | 说明 |
---|---|---|---|---|---|
git add -A | ✅ | ✅ | ✅ | ❌ | 将当前整个工作区中所有的文件改动提交至暂存区,包括新增、修改和被删除的文件,不受当前所在目录限制 |
git add . | ✅ | ✅ | ✅ | ✅ | 将当前工作区中当前目录(包括子目录)下的所有的文件改动提交至暂存区,包括新增、修改和被删除的文件 |
git add -u. | ❌ | ✅ | ✅ | ❌ | 将当前整个工作区中被修改和被删除的文件提交至暂存区。而新文件因为未被跟踪(untracked),所以不会被提交至暂存区 |
git add * | ❌ | ✅ | ✅ | ✅ | 将当前工作区中当前目录(包括子目录)下的所有的文件改动提交至暂存区,包括新增、修改和被删除的文件,但不包括文件名以 . 符号开头的文件的改动 |