Git: Git提交详解与提交信息规范

提交(Commit)是Git的核心操作,每次提交都会创建一个唯一的版本快照,记录项目在某个时刻的完整状态。

1. 提交基础概念

(1) 什么是提交

提交是Git版本控制的基本单位,包含以下信息:

100%
graph TB
    A[工作区<br/>Working Directory] -->|git add| B[暂存区<br/>Staging Area]
    B -->|git commit| C[版本库<br/>Repository]
    C --> D[生成提交对象<br/>Commit Object]
    D --> E[SHA-1哈希<br/>a1b2c3d4e5f6...]
    
    style A fill:#fff3cd
    style B fill:#d4edda
    style C fill:#c3e6cb
    style E fill:#cce5ff

(2) 提交流程

完整的提交流程包括三个步骤:

  1. 修改文件:在工作区编辑文件
  2. 暂存修改:使用 git add 将修改添加到暂存区
  3. 创建提交:使用 git commit 将暂存区内容提交到版本库

(3) 提交的作用


2. 基本提交操作

(1) 首次提交

▶ 示例:创建首次提交

BASH
# 初始化仓库
git init

# 创建文件
echo "# My Project" > README.md

# 查看状态
git status
# Untracked files:
#   README.md

# 添加到暂存区
git add README.md

# 提交
git commit -m "Initial commit"

# 输出:
# [main (root-commit) a1b2c3d] Initial commit
#  1 file changed, 1 insertion(+)
#  create mode 100644 README.md

(2) 常规提交

▶ 示例:常规提交流程

BASH
# 修改文件
echo "## Features" >> README.md

# 查看修改
git diff
# +## Features

# 添加到暂存区
git add README.md

# 查看暂存状态
git status
# Changes to be committed:
#   modified:   README.md

# 提交
git commit -m "Add features section"

# 查看提交历史
git log --oneline
# a1b2c3d Add features section
# b2c3d4e Initial commit

(3) 批量提交

▶ 示例:批量添加和提交

BASH
# 创建多个文件
touch file1.js file2.js file3.js

# 添加所有文件
git add .

# 或者添加特定类型的文件
git add *.js

# 提交
git commit -m "Add multiple JavaScript files"

# 查看提交
git show
# commit a1b2c3d4e5f6...
# Author: 张三 <zhangsan@example.com>
# Date:   Mon Jan 1 10:00:00 2026 +0800
#
#     Add multiple JavaScript files
#
# diff --git a/file1.js b/file1.js
# new file mode 100644
# index 0000000..e69de29

3. 提交信息规范

(1) 提交信息的重要性

好的提交信息能够:

(2) Conventional Commits规范

这是目前最流行的提交信息规范,格式如下:

TEXT 📖 仅展示
<type>(<scope>): <subject>

<body>

<footer>

各部分说明:

(3) 提交类型

类型 说明 使用场景
feat 新功能 添加新的功能特性
fix 修复Bug 修复程序错误
docs 文档修改 更新文档内容
style 代码格式 不影响代码含义的格式修改
refactor 重构 不添加功能也不修复Bug的代码重构
perf 性能优化 提升代码性能
test 测试 添加或修改测试代码
chore 构建/工具 构建过程或辅助工具的变动
ci CI配置 修改CI配置文件
revert 回退 回退之前的提交

▶ 示例:规范提交信息

BASH
# 单行提交 - 新功能
git commit -m "feat: 添加用户登录功能"

# 单行提交 - Bug修复
git commit -m "fix: 修复登录验证错误"

# 带范围的提交
git commit -m "feat(auth): 添加JWT认证支持"

# 多行提交
git commit -m "feat(user): 添加用户注册功能" -m "支持邮箱和手机号注册" -m "添加表单验证和错误提示"

# 带页脚的提交(关闭Issue)
git commit -m "fix: 修复登录页面样式问题" -m "Closes #123"

# 使用编辑器编写详细提交信息
git commit
# 会在编辑器中打开,可以编写详细的提交信息

(4) 提交信息最佳实践

好的提交信息:

TEXT 📖 仅展示
feat(auth): 添加OAuth2.0登录支持

- 支持Google、GitHub、微信第三方登录
- 添加登录状态持久化
- 实现自动刷新Token机制

Closes #456

不好的提交信息:

TEXT 📖 仅展示
update
fix bug
修改了一些东西
WIP

4. 提交选项详解

(1) 常用提交选项

选项 说明 示例
-m 提交信息 git commit -m "message"
-a 自动暂存已跟踪文件 git commit -a -m "message"
--amend 修改最后一次提交 git commit --amend
--no-verify 跳过提交钩子 git commit --no-verify -m "message"
--allow-empty 允许空提交 git commit --allow-empty -m "message"
-s 添加Signed-off-by git commit -s -m "message"

▶ 示例:使用提交选项

BASH
# 自动暂存并提交(只对已跟踪文件有效)
echo "new content" >> README.md
git commit -a -m "Update README"

# 添加签名
git commit -s -m "feat: 添加新功能"
# 会在提交信息中添加:
# Signed-off-by: 张三 <zhangsan@example.com>

# 跳过pre-commit钩子
git commit --no-verify -m "WIP: 临时保存"

# 查看提交详情
git show HEAD

(2) 提交模板

可以配置提交模板,确保团队成员遵循统一的提交信息格式。

BASH
# 创建提交模板
cat > .git/commit-template << 'EOF'
# <type>(<scope>): <subject>
#
# type可选值:
# feat, fix, docs, style, refactor, perf, test, chore
#
# subject规则:
# - 使用祈使句
# - 首字母小写
# - 结尾不加句号
EOF

# 配置使用模板
git config commit.template .git/commit-template

# 使用模板提交
git commit
# 会打开编辑器,显示模板内容

5. 修改提交

(1) 修改最后一次提交

▶ 示例:修改提交信息

BASH
# 修改最后一次提交的提交信息
git commit --amend -m "feat: 添加用户登录功能(修正后)"

# 输出:
# [main d4e5f6g] feat: 添加用户登录功能(修正后)
#  Date: Mon Jan 1 10:00:00 2026 +0800
#  1 file changed, 1 insertion(+)

(2) 追加文件到最后一次提交

▶ 示例:追加遗漏的文件

BASH
# 假设提交后发现遗漏了一个文件
git add forgotten-file.txt

# 追加到最后一次提交,不修改提交信息
git commit --amend --no-edit

# 或者追加并修改提交信息
git commit --amend -m "feat: 添加用户登录功能及相关配置"

(3) 修改提交的作者信息

▶ 示例:修改作者信息

BASH
# 修改最后一次提交的作者
git commit --amend --author="李四 <lisi@example.com>"

# 修改提交日期
git commit --amend --date="2026-01-01 10:00:00"

(4) 修改提交的注意事项

100%
graph TB
    A[修改提交] --> B{提交是否已推送?}
    B -->|未推送| C[可以安全修改]
    B -->|已推送| D[需要强制推送]
    D --> E[可能影响其他开发者]
    E --> F[谨慎使用]
    
    style C fill:#d4edda
    style F fill:#f8d7da

⚠️ 重要警告:


6. 提交最佳实践

(1) 原子性提交

每次提交应该只包含一个逻辑变更:

好的做法:

BASH
# 提交1:添加功能
git add feature.js
git commit -m "feat: 添加用户登录功能"

# 提交2:修复Bug
git add fix.js
git commit -m "fix: 修复登录验证错误"

# 提交3:更新文档
git add README.md
git commit -m "docs: 更新登录功能文档"

不好的做法:

BASH
# 一次提交包含多个不相关的修改
git add .
git commit -m "添加功能、修复Bug、更新文档"

(2) 提交频率

(3) 提交前检查

▶ 示例:提交前检查清单

BASH
# 1. 查看将要提交的内容
git status

# 2. 查看具体修改
git diff

# 3. 查看暂存区内容
git diff --staged

# 4. 确认无误后提交
git commit -m "feat: 添加新功能"

# 5. 查看提交结果
git show

(4) 忽略文件配置

通过 .gitignore 文件排除不需要提交的文件:

TEXT 📖 仅展示
# .gitignore示例

# 依赖目录
node_modules/
vendor/

# 编译输出
dist/
build/
*.o
*.class

# IDE配置
.vscode/
.idea/
*.swp

# 环境配置
.env
.env.local

# 日志文件
*.log
logs/

# 操作系统文件
.DS_Store
Thumbs.db

❓ 常见问题

Q 提交后发现漏了文件怎么办?
A 使用 git add 添加遗漏的文件,然后执行 git commit --amend --no-edit 追加到最后一次提交。注意:只能修改未推送的提交。
Q 如何撤销最后一次提交?
A 使用 git reset --soft HEAD~1 可以撤销提交但保留修改在暂存区;使用 git reset --mixed HEAD~1 撤销提交并将修改放回工作区;使用 git reset --hard HEAD~1 会完全丢弃修改。
Q 提交信息应该用什么语言?
A 建议使用英文,因为Git和大多数开源项目都使用英文。如果团队内部项目,也可以使用中文,但要保持统一。
Q 如何查看某个提交的详细内容?
A 使用 git show <commit-id> 查看指定提交的详细信息,包括提交元数据和文件差异。使用 git show 不带参数查看最后一次提交。
Q 为什么提交时提示"nothing to commit"?
A 这表示暂存区没有内容。需要先用 git add 将修改添加到暂存区,或者使用 git commit -a 自动暂存已跟踪文件的修改。

📖 小节


📝 作业

  1. 基础题:创建一个Git仓库,添加README.md文件,使用规范的提交信息进行首次提交,然后查看提交历史。

  2. 进阶题:模拟提交后发现遗漏文件的场景,使用 --amend 选项追加文件到最后一次提交,并验证提交内容。

  3. 挑战题:配置提交模板,创建一个符合Conventional Commits规范的模板文件,并使用该模板进行提交,确保提交信息符合规范格式。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏