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

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 的方式。

  1. 启动交互式 rebase(针对最近 2 个 commit):
bash 复制代码
git rebase -i HEAD~2

或者用更安全的写法(推荐):

bash 复制代码
git rebase -i HEAD~2

这会打开一个编辑器,内容类似下面这样(假设的 commit 从旧到新):

复制代码
pick abc1234 第一个 commit 的消息(较早的那个)
pick def5678 第二个 commit 的消息(最新的那个)
  1. 修改命令

    • 把第一个 commit(要保留消息的那个)改成 reword(或简写 r),这样可以修改提交消息。
    • 把第二个 commit 改成 fixup(或简写 f),这样会把它的改动合并进去,但丢弃它的提交消息

修改后变成:

复制代码
reword abc1234 第一个 commit 的消息
fixup   def5678 第二个 commit 的消息

保存并退出编辑器(vim 是 :wq,其他编辑器按对应方式保存)。

  1. 修改提交消息

    Git 会再次打开编辑器,让编辑第一个 commit 的消息。

    修改成想要的最终消息后,保存退出。

  2. 强制推送(因为改写了历史):

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 更灵活,推荐这种方式。

相关推荐
寺中人7 分钟前
Git 版本控制完全入门指南:从安装到实战,提交 + 分支 + 协作 + 冲突解决全拆解
git·开发工具·版本控制·团队协作·代码管理
91刘仁德44 分钟前
C++ 继承和多态 设计模式
c语言·c++·笔记
库玛西1 小时前
哈夫曼树与前缀编码:数据压缩的贪心核心
c语言·c++·笔记·考研
荔枝梅梅2 小时前
新手程序员 SSH 第一课:从 Git 仓库连接失败理解 SSH 协议与密钥配置
git
玄芯散人2 小时前
【筑基·057】Git代码时光机:版本控制入门到分支管理
git·版本控制·嵌入式开发
Rabitebla3 小时前
【Linux系统编程】 指令(二):一条路径是怎么定位到文件的
linux·c++·笔记·学习·算法
库玛西3 小时前
数据结构与算法之美:树、森林与二叉树全解析
c语言·数据结构·笔记·考研·算法·学习方法
szephyr5 小时前
Git 分支管理实战:feature/release/hotfix 怎么用才不乱
git·分支管理·团队协作·工作流·hotfix
一木 之林5 小时前
手搓家庭服务器:二手装机、Docker部署、端口映射与frp内网穿透
服务器·人工智能·git·编辑器
小李不想当小白5 小时前
PCB结构与组成(PCB设计入门学习笔记)
经验分享·笔记·单片机·嵌入式硬件·学习·pcb工艺·pcb