1. 概述

在本教程中,我们将学习如何修改 Git 的提交信息(commit message),无论是最近的一次提交,还是更早的提交。

2. 修改最近一次提交信息

这是最简单的情况。我们先来构造一个提交信息中包含拼写错误的简单提交:

$ touch file1
$ git add file1
$ git commit -m "Ading file1"
[main 3e9ac2dbcd] Ading file1
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file1

我们可以通过 git log 查看最近一次提交的信息,并确认提交 hash:

$ git log -1
commit 3e9ac2dbcdde562e50c5064b288f5b3fa23f39da (HEAD -> main)
Author: baeldung <baeldung@example.com>
Date: Tue Jun 21 21:53:12 2022 +0200

 Ading file1

✅ 要修复这个拼写错误,可以使用 --amend 参数:

$ git commit --amend -m "Adding file1"
[main 66dfa06796] Adding file1
Date: Tue Jun 21 21:53:12 2022 +0200
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file1

再次查看提交日志:

$ git log -1
commit 66dfa067969f941eef5304a6fbcd5b22d0ba6c2b (HEAD -> main)
Author: baeldung <baeldung@example.com>
Date: Tue Jun 21 21:53:12 2022 +0200

 Adding file1

⚠️ 注意:提交的 hash 已经改变。严格来说,Git 并没有修改原来的提交,而是用一个新的提交替换了它。

3. 修改更早的提交信息

现在我们构造两个新的提交,让拼写错误出现在较早的那条提交信息中:

$ touch file2
$ git add file2
$ git commit -m "Ading file2"
[main ffb7a68bf6] Ading file2
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file2
$ touch file3
$ git add file3
$ git commit -m "Adding file3"
[main 517193e1e9] Adding file3
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file3

查看最近两次提交:

$ git log -2
commit 517193e1e99c784efd48086f955fcdbc3110d097 (HEAD -> main)
Author: baeldung <baeldung@example.com>
Date: Tue Jun 21 22:04:56 2022 +0200

 Adding file3

commit ffb7a68bf63c7da9bd0b261ebb9b2ca548aa1333
Author: baeldung <baeldung@example.com>
Date: Tue Jun 21 22:02:59 2022 +0200

 Ading file2

⚠️ 注意:git commit --amend 只能修改最近一次提交,因此这里我们不能使用它。

✅ 正确的做法是使用 git rebase

3.1. 启动交互式 Rebase

我们使用交互式 rebase 来修改旧的提交信息:

$ git rebase -i HEAD~2
hint: Waiting for your editor to close the file...

此时 Git 会打开默认文本编辑器,显示类似以下内容:

# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit

当前编辑器中列出的提交顺序是 从旧到新,和 git log 的顺序相反。

原始内容如下:

pick ffb7a68bf6 Ading file2
pick 517193e1e9 Adding file3

我们要修改的是第一个提交的提交信息,所以将 pick 改为 reword

reword ffb7a68bf6 Ading file2
pick 517193e1e9 Adding file3

保存并关闭编辑器后,Git 会提示我们修改第一个提交的信息:

Ading file2

修改为:

Adding file2

保存并关闭编辑器后,Git 将完成 rebase 操作。

3.2. 验证结果

查看最近两次提交信息:

$ git log -2
commit 421d446d77d4824360b516e2f274a7c5299d6498 (HEAD -> main)
Author: baeldung <baeldung@example.com>
Date: Tue Jun 21 22:04:56 2022 +0200

 Adding file3

commit a6624ee55fdb9a6a2446fbe6c6fb8fe3bc4bd456
Author: baeldung <baeldung@example.com>
Date: Tue Jun 21 22:02:59 2022 +0200

 Adding file2

⚠️ 注意:提交 hash 已改变,说明 Git 实际上替换了这些提交。

4. 推送被修改的提交

如果你的提交已经推送到远程仓库,那么由于本地提交 hash 已改变,远程仓库会拒绝你的推送请求。

✅ 此时必须使用强制推送:

$ git push --force

⚠️ 注意事项:

  • 这个命令会覆盖远程分支的历史,可能影响其他开发者
  • 仅在你确定远程分支只有你一个人使用时才使用 --force
  • 如果团队协作中有人已经基于旧提交进行了开发,强制推送可能导致冲突和混乱

5. 总结

在本文中,我们学习了两种修改提交信息的方法:

场景 命令 说明
修改最近一次提交 git commit --amend 会替换提交 hash
修改更早的提交 git rebase -i 会重写提交历史
推送已修改的提交 git push --force 有风险,慎用

⚠️ 踩坑提醒:

  • git rebase 会重写历史,慎用于已推送到远程分支的提交
  • 使用 --force 推送前,建议与团队沟通,避免协作冲突

保持良好的提交信息习惯,有助于团队协作和代码维护。


原始标题:How to Modify Git Commit Messages