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
推送前,建议与团队沟通,避免协作冲突
保持良好的提交信息习惯,有助于团队协作和代码维护。