1. 问题场景
你已经在一个文件夹里执行了 git init,建好了仓库。接着在里面写了一个 README.txt 文件,满心欢喜地以为 Git 已经在帮你记录了。但实际上,这时候 Git 还不知道这个文件的存在。怎么才能让 Git 正式接手,开始跟踪文件的变化?这就是 git add 和 git commit 要做的事。
2. 核心命令
-
git add <文件名>将指定文件从工作区添加到暂存区。相当于告诉 Git:"这个文件的改动我准备保存了"。
-
git add .将当前目录下所有 改动(新增、修改、删除)一次性全部添加到暂存区。使用前要确认一下
git status,避免把不该提交的文件一并加进去。 -
git commit -m "提交说明"将暂存区里的所有内容打包成一个历史快照,永久存入版本库。
-m后面的双引号里是本次提交的简要描述,必须写,而且要写清楚。
3. 实战演示
我们继续用上一篇创建的 myproject 仓库来演示。如果你还没有这个仓库,就新建一个并初始化。
3.1 第一次提交
进入仓库目录,创建一个 ReadMe 文件并写入两行内容:
bash
$ cd myproject
$ echo "hello git" > ReadMe
$ echo "hello git again" >> ReadMe
用 cat 看一眼文件内容确认:
bash
$ cat ReadMe
hello git
hello git again
现在用 git add 把文件加入暂存区:
bash
$ git add ReadMe
这一步没有任何输出,通常意味着成功了。接着执行 git commit:
bash
$ git commit -m "My first commit: add ReadMe file"
[master (root-commit) c614289] My first commit: add ReadMe file
1 file changed, 2 insertions(+)
create mode 100644 ReadMe
输出信息告诉我们:这次提交生成了一串 commit id(这里是 c614289,你的会不同),修改了一个文件,新插入了两行内容。
3.2 提交说明怎么写
-m 后面的提交说明不是随便写写的,它和代码一样重要。一个好的提交说明能让半年后的你自己或同事立刻明白这次提交做了什么。一般建议用英文简明扼要,格式可以统一为"动词 + 名词短语",比如:
add user login modulefix bug in payment calculationupdate README with install steps
如果一次提交改了太多东西,说明你的提交粒度太大了,尽量让一次提交只做一件逻辑完整的事。
3.3 多次 add,一次 commit
暂存区的存在让你可以分几次把不同的文件加入,最后一次性提交。比如,在 myproject 里再新建两个文件:
bash
$ touch file1.txt file2.txt
分开添加,然后一起提交:
bash
$ git add file1.txt
$ git add file2.txt
$ git commit -m "add two new files"
[master 0a3b7d2] add two new files
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file1.txt
create mode 100644 file2.txt
也可以直接用 git add file1.txt file2.txt 一次加多个,或者用 git add . 把所有新增文件都加上。但 git add . 范围比较宽,建议先在提交前用 git status 看一眼到底加了哪些文件。
4. 查看状态与差异
这两个命令在你日常使用中的频率可能比 commit 本身还要高。
4.1 git status ------ 看状态
随时执行它,Git 会告诉你三件事:工作区里有未暂存的修改吗?暂存区里有待提交的内容吗?有哪些文件还没被跟踪?
bash
$ git status
On branch master
nothing to commit, working tree clean
当工作区和暂存区都干净时,输出如上。如果你修改了 ReadMe 但还没 add,会显示:
bash
$ echo "a new line" >> ReadMe
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: ReadMe
no changes added to commit (use "git add" and/or "git commit -a")
Git 会明确提示你哪些文件被修改了,并且告诉你下一步可以怎么做。
4.2 git diff ------ 看具体改了什么
git status 只告诉你"有改动",git diff 会展示出具体的改动内容。不加参数时,它比较的是工作区 和暂存区(如果暂存区为空,就是和最新一次提交比较)。
bash
$ git diff
diff --git a/ReadMe b/ReadMe
index e69de29..3b18e51 100644
--- a/ReadMe
+++ b/ReadMe
@@ -2,2 +3,3 @@
hello git
hello git again
+a new line
前面带 + 的绿色行是新增的,带 - 的红色行是删除的(这里没有)。这个输出格式看起来很原始,但习惯之后非常高效。
5. 注意事项
- 正确流程是固定的 :修改文件 →
git add→git commit。跳过add直接commit,Git 什么都不会提交。 git add .要谨慎 :它会把所有改动一次加进去,很容易把调试用的临时文件、本地配置等不该提交的东西也卷进去。建议先git status看一眼,再用git add精确指定文件,或者用.gitignore过滤(后面会讲)。- commit id 是唯一标识 :每一次提交都有一个独一无二的 hash 值(如
c614289),它是你回溯版本时的钥匙。不需要记完整,Git 允许只取前几位。
6. 要点总结
git add是把修改从工作区放入暂存区的动作,相当于"挑选"。git commit -m "说明"是把暂存区的内容正式存入版本库,形成历史节点。- 日常工作流就三个动作:修改 → add → commit。
git status是使用频率最高的命令,随时用它来掌握当前仓库状态。- 提交说明要写清楚,为未来的自己和协作者负责。
7. 练习题
- 进入上一篇创建的
learning-git仓库,新建一个文本文件notes.txt,写入任意内容。 - 用
git add添加该文件,然后用git commit提交,提交说明要清晰。 - 再创建两个文件
a.txt和b.txt,练习多次 add、一次 commit。 - 修改
notes.txt,然后分别在 add 前和 add 后运行git status和git diff,观察输出变化。 - 故意不 add 就执行
git commit,看看 Git 会给出什么提示。