Git 暂存与提交(核心循环)
更新时间:2026-08-25。本篇覆盖日常提交循环的四条命令:
git status(看状态)、git add(放入暂存区)、git commit(写入历史)、git diff(看差异)。这是使用频率最高的一组命令,也是理解 Git 三区域模型的钥匙。
提交循环:三区域的流转

1. git status:随时确认状态
bash
git status # 详细输出
git status --short # 紧凑输出(-s)--short 输出两列状态码,第一列是暂存区状态、第二列是工作区状态:
| 状态码 | 含义 |
|---|---|
?? | 未跟踪(Untracked,新文件) |
A | 已暂存的新文件 |
M | 已修改(第一列=已暂存,第二列=未暂存) |
D | 已删除 |
R | 已重命名 |
U | 冲突未解决 |
bash
$ git status -s
M README.md # 工作区改过,未暂存
M main.cpp # 已暂存
MM utils.h # 暂存后又改了
?? new.txt # 新文件未跟踪状态栏第一行常提示
Changes not staged(工作区有修改)与Changes to be committed(已暂存),两者对应不同的restore用法,见 撤销与回退。
2. git add:把文件放入暂存区
bash
git add <file> # 单个文件
git add src/ # 整个目录
git add *.c # 通配符
git add -A # 所有变更(新增+修改+删除),推荐
git add -u # 只处理已跟踪文件(不含新文件)
git add -p # 交互式分块暂存(精细控制提交内容)
git add -i # 交互式模式交互式分块 -p 是最值得养成的习惯:一个大文件里混着两处无关改动时,用 y/n/s/e 逐块选择,把一次大改动拆成多个语义独立的提交,配合 git commit -m 形成干净的历史。
.gitignore:告诉 Git 别理哪些文件
gitignore
# 构建产物
build/ *.o *.exe
# 依赖与密钥
node_modules/ .env *.pem
# 编辑器
.vscode/ .idea/ *.swp
.gitignore只影响未跟踪文件。已跟踪的文件即使写进 ignore 也会被提交,需先git rm --cached <file>解除跟踪。
3. git commit:写入历史
bash
git commit -m "feat: 添加登录接口" # 常规提交
git commit -am "fix: 修复空指针" # 跳过 add,直接提交已跟踪文件的变更
git commit --amend # 修补上一个提交(未推送时)
git commit --allow-empty -m "空提交" # 触发 CI 等场景提交信息规范(Conventional Commits)
| 前缀 | 语义 | 示例 |
|---|---|---|
feat | 新功能 | feat: 支持批量导出 |
fix | 修 bug | fix: 修复越界读 |
refactor | 重构(行为不变) | refactor: 抽取公共函数 |
docs | 文档 | docs: 补充部署说明 |
test | 测试 | test: 增加边界用例 |
perf | 性能优化 | perf: 热点循环改为无锁 |
--amend 注意:它把当前暂存区的内容并入上一个提交并重写其哈希。只应在本地方使用——一旦推送过,修改历史会与远端冲突(详见 历史改写)。
4. git diff:查看差异
bash
git diff # 工作区 vs 暂存区(未暂存的改动)
git diff --staged # 暂存区 vs 上次提交(已暂存的改动)
git diff HEAD # 工作区+暂存区 vs 上次提交(全部改动)
git diff <commit1> <commit2> # 任意两次提交之间
git diff --stat # 只看统计摘要
git diff --color=never # 脚本场景禁用颜色怎么看 git diff 输出:- 开头是删除/旧内容,+ 开头是新增/新内容,@@ -x,y +a,b @@ 是 hunk 头(旧文件第 x 行起 y 行、新文件第 a 行起 b 行)。
diff
@@ -10,7 +10,7 @@
int n = 0;
- n = compute(); # 旧行
+ n = compute_fast(); # 新行常用流程串联
bash
git status -s # 1. 看有哪些改动
git diff # 2. 确认未暂存改动内容
git add -p # 3. 分块挑选
git diff --staged # 4. 确认将要提交的内容
git commit -m "feat: 说明本次变更" # 5. 提交
git log --oneline -3 # 6. 确认历史易错点
git commit -am不管新文件:-a只暂存已跟踪文件的修改/删除,新文件必须显式git add。- 提交后才发现漏了文件:
git add <漏掉的> && git commit --amend(未推送时)。 git diff默认不显示新文件:未跟踪文件不在 diff 里,需先git add再git diff --staged查看。- 把密钥/日志提交了:发现后立即
git rm --cached+ 加入.gitignore,若已推送需更换密钥(历史仍含密钥)。
一句话总结:status 看状态、add 挑内容、commit 存快照、diff 核差异——四步构成提交循环,先 add -p 分块、后规范提交信息,是保持历史可读的关键。