git笔记之已push到远程,想把最新的两个commit合并为一个commit, 使用reword和fixup

code review!
文章目录
- [git笔记之已push到远程,想把最新的两个commit合并为一个commit, 使用reword和fixup](#git笔记之已push到远程,想把最新的两个commit合并为一个commit, 使用reword和fixup)
-
- [已经把最新的两个 commit push 到远程了,现在想把它们**合并成一个 commit**(一个保留/修改消息,一个丢弃消息),推荐用 **interactive rebase** + `reword` + `fixup` 的方式。](#已经把最新的两个 commit push 到远程了,现在想把它们合并成一个 commit(一个保留/修改消息,一个丢弃消息),推荐用 interactive rebase +
reword+fixup的方式。) - 其他常见变体
- 注意事项
- 如果不想交互式编辑消息,可以这样
- [已经把最新的两个 commit push 到远程了,现在想把它们**合并成一个 commit**(一个保留/修改消息,一个丢弃消息),推荐用 **interactive rebase** + `reword` + `fixup` 的方式。](#已经把最新的两个 commit push 到远程了,现在想把它们合并成一个 commit(一个保留/修改消息,一个丢弃消息),推荐用 interactive rebase +
已经把最新的两个 commit push 到远程了,现在想把它们合并成一个 commit (一个保留/修改消息,一个丢弃消息),推荐用 interactive rebase + reword + fixup 的方式。
- 启动交互式 rebase(针对最近 2 个 commit):
bash
git rebase -i HEAD~2
或者用更安全的写法(推荐):
bash
git rebase -i HEAD~2
这会打开一个编辑器,内容类似下面这样(假设的 commit 从旧到新):
pick abc1234 第一个 commit 的消息(较早的那个)
pick def5678 第二个 commit 的消息(最新的那个)
-
修改命令:
- 把第一个 commit(要保留消息的那个)改成
reword(或简写r),这样可以修改提交消息。 - 把第二个 commit 改成
fixup(或简写f),这样会把它的改动合并进去,但丢弃它的提交消息。
- 把第一个 commit(要保留消息的那个)改成
修改后变成:
reword abc1234 第一个 commit 的消息
fixup def5678 第二个 commit 的消息
保存并退出编辑器(vim 是 :wq,其他编辑器按对应方式保存)。
-
修改提交消息:
Git 会再次打开编辑器,让编辑第一个 commit 的消息。
修改成想要的最终消息后,保存退出。
-
强制推送(因为改写了历史):
bash
git push origin <的分支名> --force-with-lease
推荐用 --force-with-lease(比 -f 安全一点,如果别人已经 push 了,它会失败)。
其他常见变体
-
如果想保留第二个 commit 的消息,而丢弃第一个的:
- 把第一个改成
fixup - 把第二个改成
reword
- 把第一个改成
-
如果两个消息都不想要,直接用
fixup合并,然后在 reword 阶段写新消息。
注意事项
- 已 push 的分支:改历史后必须 force push,团队协作时要提前告知其他人(避免他们 pull 后出问题)。
- 如果在 PR 中,force push 后 PR 会自动更新。
- 操作前最好
git log --oneline -5确认一下最近的 commit 顺序。
如果不想交互式编辑消息,可以这样
如果确定要用第一个 commit 的消息,只改动内容,可以直接:
bash
git reset --soft HEAD~2
git commit --amend -m "新的合并后的提交消息"
git push origin <分支> --force-with-lease
但用 rebase -i + reword + fixup 更灵活,推荐这种方式。