git commit 是什么?
git commit 命令用于将你暂存区 中的更改(通过 git add 添加的文件)永久保存到你的本地仓库中,每一次 commit 都会创建一个新的“快照”,记录了项目在那一刻的状态。
你可以把它想象成给项目拍了一张照片,并在这张照片上写下了备注(提交信息),解释这张照片记录了什么内容。
基础用法
最简单的用法
git commit
执行这个命令后,如果你的 Git 配置中没有默认的文本编辑器,它会弹出一个让你填写提交信息的编辑器窗口(通常是 Vim 或 Nano),你需要在这里输入你的提交信息,保存并退出后,提交才会完成。
推荐的用法:使用 -m 选项
这是最常用、最高效的方式,可以直接在命令行中附带提交信息。
git commit -m "你的提交信息"
示例:
# 假设你已经用 git add index.html style.css 暂存了文件 $ git commit -m "添加首页样式和布局" [master (root-commit) a1b2c3d] 添加首页样式和布局 2 files changed, 45 insertions(+) create mode 100644 index.html create mode 100644 style.css
输出信息解读:
[master a1b2c3d]:master是分支名,a1b2c3d是这次提交的唯一哈希 ID(也叫 Commit Hash)。2 files changed:有 2 个文件被修改。45 insertions(+):新增了 45 行代码。create mode ...:创建了 2 个新文件。
git commit 的工作流程(三棵树理论)
理解 Git 的工作原理能帮助你更好地使用 commit,Git 通常被比喻为“三棵树”:

- Working Directory (工作目录):你正在操作的文件,它们的状态可能是
Untracked(未跟踪),Modified(已修改), 或Staged(已暂存)。 - Staging Area (暂存区):一个“中间人”区域,你可以把文件的修改从工作区“添加”到这里,告诉 Git:“嘿,这些是我下次要提交的修改”。
.gitDirectory (Git 仓库):Git 的数据存放地,当你执行git commit时,Git 会将暂存区里的内容打包成一个“快照”,并保存到仓库中。
一个完整的提交流程是:
修改文件 -> git add <file> (将修改放入暂存区) -> git commit -m "信息" (将暂存区内容提交到仓库)
常用选项与参数
-m, --message
描述:指定提交信息,这是最常用的选项。
git commit -m "修复登录按钮的样式问题"
-a, --all
描述:自动将所有已跟踪 且已修改 的文件添加到暂存区,然后再进行提交。它不会包含未跟踪的文件。
# 修改了几个已跟踪的文件,但没有用 git add 暂存它们 $ git status # ...显示你修改了 file1.txt, file2.txt # 使用 -a 选项,可以省略 git add 步骤 $ git commit -am "更新了几个已跟踪的文件"
--amend
描述:修正 上一次的提交,这是一个非常强大的功能,有两种常见用法:
-
修改上一次提交的信息:
# 你刚刚提交,但发现信息写错了 $ git commit -m "拼写错误的提交信息" # 修正提交信息 $ git commit --amend -m "正确的提交信息"
这会覆盖掉上一次的提交,而不是创建一个新的提交,提交的哈希值也会改变。
-
将暂存的文件合并到上一次提交中:
# 你提交了,但忘记添加一个文件 $ git commit -m "添加了功能A" # 发现忘了添加 file_b.js $ git add file_b.js # 使用 --amend,将 file_b.js 的修改合并到上一次提交中 $ git commit --amend --no-edit # --no-edit 表示不修改提交信息
这同样会覆盖上一次的提交。
-S, --gpg-sign
描述:使用 GPG 对你的提交进行签名,用于验证提交者的身份,这在开源项目或需要高安全性的环境中很常见。
git commit -S -m "一个需要签名的提交"
--allow-empty
描述:创建一个空的提交,即没有修改任何文件,这在某些自动化流程(如触发 CI/CD)或标记某个重要时间点时很有用。
git commit --allow-empty -m "项目里程碑:完成 v1.0 版本开发"
提交信息的最佳实践
写一个好的提交信息和写好代码同样重要,一个好的提交信息能让你的团队协作更顺畅,也让历史记录更容易理解。
推荐的格式 (Conventional Commits):
<类型>(<范围>): <描述>
[可选的脚注]
类型:
feat: 新功能fix: 修复 Bugdocs: 仅文档更改(如 README, .md 文件)style: 不影响代码含义的更改(格式、空格、分号等)refactor: 既不是修复 Bug 也不是添加功能的代码更改perf: 提高性能的代码更改test: 添加或修改测试用例chore: 构建过程或辅助工具的变动
范围:
- 可选的,用于说明影响的范围,例如组件或模块名,在大型项目中常用。
描述:
- 使用现在时态,"add feature" 而不是 "added feature"。
- 简洁明了,不超过 50 个字符。
- 如果需要,可以像写命令一样,以动词开头。 **
- 提供更详细的修改说明。
- 解释为什么要进行这次修改,而不仅仅是做了什么。
- 可以换行,每行不超过 72 个字符。
示例:
# 一个简单的修复 git commit -m "fix: 修复用户登录时密码为空导致的崩溃问题" # 一个新功能 git commit -m "feat(user-profile): 添加头像上传功能" # 一个有详细说明的提交 git commit -m "refactor(api): 重构用户认证模块 - 将旧的 cookie 认证方式替换为 JWT - 提高了安全性和可扩展性 - 移除了不再需要的 `authenticate_user` 函数"
常见问题与解决
Q1: 提交信息写错了,怎么办?
- 如果还没有推送到远程仓库:
- 只改信息:
git commit --amend -m "新信息" - 改信息并修改文件:修改文件 ->
git add->git commit --amend
- 只改信息:
- 如果已经推送到远程仓库:
- 情况比较复杂,通常需要使用
git rebase -i或git revert来修正。尽量避免在已推送的提交上修改。
- 情况比较复杂,通常需要使用
Q2: 我提交了,但发现还有文件没加,怎么办?
- 使用
git commit --amend,先把漏掉的文件git add进来,然后执行git commit --amend,它会将新文件合并到上一次提交中。
Q3: git commit 和 git push 有什么区别?
git commit:将更改保存到本地仓库。git push:将你本地的提交推送到远程仓库(如 GitHub, GitLab),让其他协作者也能看到。- 简单说:
commit是“存钱到自己的钱包”,push是“转账到公共账户”。
| 命令 | 描述 |
|---|---|
git commit -m "信息" |
最常用,创建一个带有指定信息的提交。 |
git commit -am "信息" |
自动添加所有已修改的文件并提交(跳过 git add)。 |
git commit --amend |
修正上一次的提交(修改信息或添加文件)。 |
git commit --allow-empty |
创建一个空的提交。 |
掌握 git commit 是使用 Git 的第一步,也是最重要的一步,养成良好、一致的提交习惯,会让你的版本控制历史清晰、专业,极大地提升个人和团队的协作效率。
