git add .、git add -A 和 git add -u 有什么区别?
在 Git 中,git add .、git add -A 和 git add -u 都是用来将工作区的修改添加到暂存区(Staging Area)的命令,但它们在处理的范围和文件状态(新建、修改、删除)上有所区别。
为了让你一目了然,我们先看一张总结表(基于目前大家普遍使用的 Git 2.0 及以上版本):
| 命令 | 英文全称 | 提交新文件 (Untracked) | 提交修改 (Modified) | 提交删除 (Deleted) | 作用范围 |
|---|---|---|---|---|---|
git add . |
N/A (点代表当前目录) | ✅ 是 | ✅ 是 | ✅ 是 | 当前目录及其子目录 |
git add -A |
git add --all |
✅ 是 | ✅ 是 | ✅ 是 | 整个 Git 仓库 (无论你处于哪个目录) |
git add -u |
git add --update |
❌ 否 | ✅ 是 | ✅ 是 | 整个 Git 仓库 (仅限已追踪的文件) |
详细解释:
1. git add .
- 含义:在 Linux/Unix 系统中,
.代表当前目录。所以这个命令的意思是“把当前目录及子目录下的所有变化添加到暂存区”。 - 包括:新建的文件、修改的文件、删除的文件。
- 注意:如果你在仓库的根目录执行
git add .,它的效果和git add -A几乎一模一样。但如果你在某个子目录下执行,它只会提交该子目录下的变化,不会理会其他目录的变化。
2. git add -A (或者 git add --all)
- 含义:
A代表 All。意思是将整个 Git 仓库中所有的变化都添加到暂存区。 - 包括:新建的文件、修改的文件、删除的文件。
- 特点:无论你当前终端停留在仓库的哪个子目录下,执行这个命令都会把整个项目所有的改动全部
add。
3. git add -u (或者 git add --update)
- 含义:
u代表 Update。意思是只更新那些已经被 Git 追踪(Tracked)的文件。 - 包括:修改的文件、删除的文件。
- 不包括:新建的文件(因为新建的文件还是 Untracked 状态,Git 还不认识它们)。
- 使用场景:当你在项目中修改和删除了一些文件,同时又产生了一些不想提交的临时文件、测试文件(且没有写进
.gitignore)时,使用git add -u可以完美避开这些新创建的无用文件。
⚠️ 一个重要的历史遗留问题(关于 Git 1.x 和 Git 2.x)
如果你在网上查阅资料,可能会看到有些旧博客说:“git add . 不能提交被删除的文件”。
这个说法在今天已经过时了。
- 在 Git 1.x 版本中:
git add .确实不包含删除的文件。当年为了把删除的文件也加进去,必须用git add -A。 - 从 Git 2.0 版本开始(2014年发布):Git 官方修改了行为,
git add .已经可以包含删除的文件了。
由于现在绝大多数人使用的都是 Git 2.x 或更高版本,所以你完全可以放心:在仓库根目录下,git add . 等同于 git add -A。
总结建议:
- 最常用:
git add .(通常在项目根目录下执行,简单快捷)。 - 最严谨:如果你身处子目录,但想提交整个项目的所有改动,用
git add -A。 - 最安全:如果你只想提交改动和删除的旧文件,不想不小心把刚新建的草稿/测试文件交上去,用
git add -u。