如何一次性添加所有修改的文件到暂存区?

在开发过程中,我们常常会一次性修改大量文件。当 git status 列出一长串红色的“未暂存的修改”时,如果一个个手动 git add <文件名>,不仅效率低下,还容易出错。其实,Git 提供了非常方便的命令,可以一次性将所有变更添加到暂存区。

最常用也最直接的命令是:

git add .

这个命令会暂存当前目录及其子目录下所有文件的变更,包括新增的文件和修改过的文件。在现代版本的 Git 中,它也包含了被删除的文件。执行完这个命令,你就可以直接运行 git commit 来创建一次完整的提交了。

不过,除了 . 之外,Git 还提供了 -A 和 -u 等参数,它们在功能上有一些细微但重要的差别。了解这些差别,可以帮助你更精确地控制需要暂存的内容。

git add .、-A、-u 的核心区别是什么?

要理解这几个命令的区别,首先需要明确 Git 的两个基本概念: 工作区(Working Directory) 和  暂存区(Staging Area)。工作区就是你当前能看到和编辑的文件目录,而暂存区则像一个“待提交”的缓冲区,存放着你希望在下一次提交中包含的变更。

git add 命令的作用,就是将工作区的变更“快照”添加到暂存区。而 .、-A 和 -u 这三个参数,决定了它添加哪些类型的变更。

git add .:暂存当前目录下的所有变更

这个命令会查找当前目录(包括所有子目录)下的文件变更,并将它们加入暂存区。它主要处理两种情况:

  • 新增的文件
  • 修改过的文件

值得注意的是,在比较旧的 Git 版本中,git add . 不会暂存被删除的文件。但在目前主流的 Git 版本(2.x 及以上)中,它的行为已经和 git add -A 基本一致,也会暂存删除操作。

git add -A (或 --all):暂存所有变更

这是最“彻底”的一个参数。它会扫描整个 Git 仓库,而不仅仅是当前目录,然后将所有类型的变更都加入暂存区,包括:

  • 新增的文件
  • 修改过的文件
  • 被删除的文件

无论你当前在哪个子目录下执行 git add -A,它影响的都是整个项目。因此,它是一个安全且行为一致的选择。

git add -u (或 --update):只暂存已追踪文件的变更

这个参数的行为比较特殊。它只会处理那些 Git  已经追踪 的文件。这意味着:

  • 它会暂存 修改过的文件
  • 它会暂存 被删除的文件
  • 但它会 忽略所有新增的文件,因为新文件还未被 Git 追踪。

这个特性在某些特定场景下很有用,比如你添加了一些临时的新文件,但又不想把它们加入到这次提交中,只想提交对现有文件的修改和删除。

一张表看懂它们的区别

为了更直观地对比,我们可以用一个简单的表格来总结这三个命令在处理不同文件状态时的行为。

命令 (Command) 新增文件 修改文件 删除文件
git add . (现代版本)
git add -A / --all
git add -u / --update

简单来说,-A 是暂存所有,-u 是暂存已追踪文件的更新(不含新增),而 . 在新版 Git 中基本等同于 -A。

那么,我到底应该用哪个?

对于绝大多数日常开发场景, git add . 或 git add -A 是最佳选择

由于在现代 Git 中 git add . 的行为已经向 git add -A 看齐,你可以放心地使用 git add . 来暂存所有变更。它足够简单,也符合直觉。

如果你想确保命令的语义最清晰、最没有歧义,使用 git add -A 是一个好习惯,因为它明确表达了“我要添加所有(All)变更”的意图。

而 git add -u 则适用于一个非常具体的场景:你只想提交对已有文件的修改和删除,并刻意忽略所有本次新增的文件。

一个需要注意的细节

git add . 的作用范围是 当前目录。如果你在一个子目录中执行它,它只会暂存该子目录及其更深层目录的变更,而不会影响到父目录或同级的其他目录。

相比之下,git add -A 和 git add -u 的作用范围始终是 整个 Git 仓库的根目录,无论你当前在哪个路径下执行命令。

因此,如果你想确保万无一失地暂存所有文件的所有变更,最稳妥的方式是先切换到项目的根目录,然后执行 git add .,或者在任何目录下直接执行 git add -A。

掌握了这几个命令,你就拥有了高效管理代码变更的基础。下次面对一长串 git status 的输出时,一个简单的命令就能清爽地将所有工作成果加入暂存区,准备进行一次清晰的提交。