git add -A 与 git add . 有什么区别
Git 2.0 之后两者都会暂存新增、修改和删除,区别只在范围:git add -A 作用于整个仓库(无论在哪个子目录执行),git add . 只作用于当前目录及其子目录。老版本 Git 1.x 中 git add . 不暂存删除。
Git 2.0 起,两者暂存的变更类型完全一样(新增、修改、删除都包含),唯一区别是作用范围:git add -A(即 --all)覆盖整个仓库,你在任何子目录执行都会暂存全仓的改动;git add . 只覆盖当前目录及其子目录。
对比表
| 命令 | 范围 | 暂存删除? |
|---|---|---|
git add -A |
整个仓库 | 是 |
git add . |
当前目录树 | 是(Git 2.0+) |
git add -u |
整个仓库 | 是,但只针对已跟踪文件(不添加新文件) |
历史包袱
Git 1.x 时代 git add . 不暂存删除,git add -A 才暂存——很多老教程的差异说法来自那个年代。2.0 之后这个差异被抹平,只剩范围之别。如果你在维护古董服务器上的 Git 1.x,记住那时 -A 和 . 确实不同。
实用建议
git add -A # 全仓改动一把梭(提交前 git status 确认)
git add . # 在子目录里只想暂存本目录改动时
git add src/ tests/ # 精确指定路径,最安全
git add -p # 要逐块挑选时用交互模式
提交前养成 git status + git diff --cached 检查暂存区的习惯,比纠结用哪个命令更防事故。
常见问题(FAQ)
Q:git add * 和 git add . 一样吗?
不一样。* 是 shell 通配符展开,不匹配点开头文件且对删除处理不同;. 是 Git 的路径参数。别用 *。
Q:怎么只暂存修改和删除、不加新文件?
git add -u(--update),只处理已被 Git 跟踪的文件。
Q:误 add 了不想提交的文件怎么撤?
git restore --staged <文件>(老语法 git reset HEAD <文件>),改动留在工作区不丢。