git commit 是什么
git commit 把暂存区(index)里的内容固化成一次快照,成为仓库历史上一个不可变的提交对象。它只读取暂存区、不直接看工作区,所以改动必须先 git add。每个提交记录作者、提交者、时间戳、提交信息与父提交指针,Git 的分支、合并、回溯都建立在提交之上。
三区模型与提交边界
理解提交要先区分三个位置:工作区是磁盘上的文件,暂存区(index)是本次提交的取材区,HEAD 是上一个提交。git add 从工作区取到暂存区,git commit 把暂存区写成新提交并让 HEAD 前移。因为中间隔着暂存区,同一份文件可以只提交一半改动,也可以先攒多步再合成一次提交。
基本信息
| 适用平台 | Linux / macOS / Windows(Git 2.23 以上) |
|---|---|
| 语法 | git commit [选项] [--] <路径>… |
| 权限要求 | 对仓库有写权限,不涉及系统权限 |
| 常用参数 | -m 信息;-a 已跟踪改动;--amend 修补;-F 读文件 |
| 高风险参数 | --no-verify 跳过钩子;--allow-empty 允许空提交 |
典型使用场景
- 日常开发:add 之后写一条语义清晰的提交,留下可回滚的进度点
- 紧急修复:一个 -m 直接完成提交,不用打开编辑器
- 自动化脚本:CI 里用 -m 与 --author 指定信息与身份
- 补漏:忘了加文件时先 add,再 --amend 补进上一条提交
- 整理历史:先提交再 rebase -i 合并、拆分或改写信息
- 多段信息:-m 传两次可以拼出主题与正文,不必进编辑器来回切换
常用示例
常用示例
git commit -m 'fix: 修正重试次数判断' # 最常用:一行给出提交信息
git commit -a -m 'chore: 同步生成文件' # 跳过 add,提交已跟踪文件的全部改动
git commit # 打开编辑器,可写多段信息
git add -p && git commit -m 'refactor: 拆出校验函数' # 只提交选定的补丁块
git commit --dry-run # 演练:不生成提交,先看会提交什么
git add forgotten.txt && git commit --amend --no-edit # 把漏加文件补进上一条提交结果怎么看
| 现象 | 含义 | 下一步 |
|---|---|---|
| nothing to commit | 暂存区与 HEAD 一致 | 改动还没 add,或确实没改动 |
| [main 3f6a2b1] 3 files changed | 提交成功,中括号内是分支与短哈希 | 用 git show 3f6a2b1 复核内容 |
| Aborting commit due to empty message | 提交信息为空被拒 | 补写信息,或确认是否要空信息提交 |
| pre-commit 钩子报错中止 | 本地校验没通过 | 按提示修问题,别急着 --no-verify |
| Your branch is ahead by 1 commit | 本地领先远端一个提交 | 需要同步时再 git push |
| HEAD detached 提示 | 处于分离头指针状态 | 要保留这次提交就先新建分支 |
常用选项速查
| 选项 | 作用 | 注意点 |
|---|---|---|
| -m <信息> | 直接给出提交信息 | 可重复使用,两段之间自动分隔 |
| -a | 自动暂存已跟踪文件的修改 | 不含新文件,删除同样需要 add |
| --amend | 替换上一条提交 | 哈希变化,已推送则需强推 |
| --no-verify | 跳过钩子校验 | 谨慎使用,风险见下方坑点 |
| -F <文件> | 从文件读取提交信息 | 适合长信息与脚本生成 |
| --author | 覆盖作者身份 | 提交者仍是当前操作者 |
提交前自查组合
提交前自查组合
git status --short # 逐行确认哪些文件会进这次提交
git diff --staged # 通读即将提交的实际改动
git diff --cached --stat # 先看规模,再决定阅读顺序commit 只认暂存区。想只提交某几个文件的改动,就先 git add 指定路径再 commit;用 -a 会把所有已跟踪文件的改动一次性带走,容易混进无关内容。
--amend 会生成新的提交哈希,旧提交只能靠 reflog 找回;已推送的提交被 amend 后必须强推,会改写协作者看到的历史,共享分支上先确认无人基于旧提交工作。
提交信息建议首行不超过 50 字符、说明做了什么,空行之后写正文说明为什么这么做。团队若采用 Conventional Commits,首行形如 feat(scope): 描述,便于工具生成变更日志。
默认编辑器由 core.editor 与 GIT_EDITOR 环境变量决定。CI 或脚本环境里没有可交互的编辑器,务必带上 -m 或 -F,否则会一直停在等待输入的状态。