1. 概述

本文将介绍几种修改 Git 提交的方法。这些方法在修复提交信息、合并历史提交、删除错误提交等场景中非常实用。

需要注意的是,修改 Git 提交历史属于危险操作,尤其是涉及多人协作的远程分支时,可能导致冲突或数据丢失。因此,使用时要格外小心。

2. 使用 --amend 修改最近一次提交

git commit --amend 是修改最近一次提交的快捷方式。你可以:

  • 修改最近一次的提交信息
  • 将暂存区的改动添加到最近一次提交中

Git 会将原提交替换为一个新的提交,所以本质上它并不是“修改”,而是“重写”。

示例

我们先进行一次普通提交:

git commit -m "Commit 1"

然后使用 --amend 修改提交信息:

git commit --amend

此时会打开编辑器,我们可以修改提交信息,保存后 Git 会生成一个新提交。

如果我们想添加新的改动到最近一次提交而不修改信息,可以使用:

git commit --amend --no-edit

这样可以将暂存区的内容合并进最近一次提交,而不会弹出编辑器。

✅ 优点:操作简单,适合修复刚提交的内容
❌ 缺点:只能修改最近一次提交

3. 使用 rebase -i 修改历史提交

如果要修改更早的提交,可以使用 git rebase -i(interactive rebase)功能。它允许我们对提交历史进行:

  • 重写提交信息(reword)
  • 合并多个提交(squash / fixup)
  • 删除提交(drop)
  • 编辑提交内容(edit)
  • 插入执行命令(exec)

示例

我们先查看当前提交历史:

git log

输出如下:

commit 5742fcbe1cb14a9c4f1425eea9032ffb4c6191e5 (HEAD -> master)
Author: [email protected]
Date:   Fri Jul 1 08:11:52 2022 +0530
    commit 5

commit e9ed266b84dd29095577ddd8f6dc7fcf5cf9db0d
Author: [email protected]
Date:   Fri Jul 1 08:11:37 2022 +0530
    commit 4

commit 080e3ecc041b7be1757af67bf03db982135b9093
Author: [email protected]
Date:   Fri Jul 1 08:11:18 2022 +0530
    commit 3

commit d5923e0ced1caff5874d8d41f39d197b5e1e2468
Author: [email protected]
Date:   Fri Jul 1 08:10:58 2022 +0530
    commit 2

commit 1376dc1182a798b16dc85239ec7382e8340d5267
Author: [email protected]
Date:   Wed Jun 29 22:41:08 2022 +0530
    Amended Commit 1 - Added new file

现在我们想修改 Amended Commit 1 - Added new file 之后的提交,可以使用以下命令启动交互式 rebase:

git rebase -i 1376dc1182a798b16dc85239ec7382e8340d5267

编辑器会列出从该提交之后的所有提交:

pick d5923e0 commit 2
pick 080e3ec commit 3
pick e9ed266 commit 4
pick 5742fcb commit 5

我们修改为:

reword d5923e0 commit 2-updated
edit 080e3ec commit 3
squash e9ed266 commit 4
drop 5742fcb commit 5

保存退出后,Git 会按顺序执行这些操作:

  • reword:进入编辑器修改提交信息
  • edit:暂停 rebase,允许你修改提交内容
  • squash:合并当前提交到上一个提交
  • drop:删除该提交

edit 阶段,你可以使用 git commit --amend 修改提交内容,完成后执行:

git rebase --continue

最后你会看到所有提交已被重写。

⚠️ 注意:执行 rebase 后,提交的 hash 会变化,因此如果这些提交已经被推送到远程仓库,需要使用 git push -f 强制推送,这可能会导致协作者的本地历史混乱。

4. 查看提交日志和 reflog

完成 rebase 后,我们再次查看提交历史:

git log

输出如下:

commit 917c583d5bb02803ee43cf87a2143f201c97bbe8 (HEAD -> master)
Author: [email protected]
Date:   Fri Jul 1 08:11:18 2022 +0530
commit 3 - squashed with commit 4

commit 178e8ebec178c166d1c9def2d680f41933eba29b
Author: [email protected]
Date:   Fri Jul 1 08:10:58 2022 +0530
commit 2-alter

commit 1376dc1182a798b16dc85239ec7382e8340d5267
Author: [email protected]
Date:   Wed Jun 29 22:41:08 2022 +0530
Amended Commit 1 - Added new file

可以看到:

  • commit 5 被删除
  • commit 4 被合并进 commit 3
  • commit 2 的信息被修改

使用 reflog 查看操作历史

如果你不确定自己做了什么,或者想恢复某个操作,可以使用:

git reflog

输出如下:

917c583 (HEAD -> master) HEAD@{0}: rebase -i (finish): returning to refs/heads/master
917c583 (HEAD -> master) HEAD@{1}: rebase -i (squash): commit 3 - squashed with commit 4
9433120 HEAD@{2}: commit (amend): commit 3 - updated
...

reflog 是本地操作的“操作日志”,可以用于回滚到某个状态。

5. 总结

方法 适用场景 是否改变提交 hash 是否推荐用于远程分支
--amend 修改最近一次提交
rebase -i 修改历史提交、合并、删除等
reflog 查看本地操作历史、恢复误操作 -

📌 使用建议:

  • 只在本地分支使用 rebase 修改历史
  • 不要对已推送到远程的提交进行 rebase
  • 使用前最好备份当前分支,避免误操作

如无必要,尽量避免修改提交历史,尤其是多人协作的项目中。如果只是为了修复提交信息,建议优先使用 --amend 并及时推送。


原始标题:Modify a Specified Commit in Git