Git:已合并至master分支的多提交如何压缩并修改提交信息?
解决Master分支提交压缩与信息修正的方案
当然有办法实现你的需求!这里我们需要用到Git的**交互式变基(Interactive Rebase)**来重写Master分支的历史,将多个零散的WIP提交压缩为一个带有正确工单编号和信息的提交。不过要注意:重写公共分支的历史会影响其他协作开发者,一定要提前和团队沟通确认后再操作。
具体操作步骤
1. 确保本地Master分支是最新状态
首先切换到Master分支并拉取远程最新代码:
git checkout master git pull origin master
2. 启动交互式变基
我们需要定位到要修改的提交范围的前一个稳定提交——也就是日志里的040db7d97 [maven-release-plugin] prepare for next development iteration。执行以下命令启动变基:
git rebase -i 040db7d97
这个命令会打开一个文本编辑器,列出从040db7d97之后的所有提交。
3. 配置提交压缩规则
在打开的编辑器中,你会看到类似这样的内容:
pick 7832f7911 PTAP-XXXX - WIP Authentication pick 96984a70c PTAP-XXXX - WIP Authentication part 2 pick e0b964795 PTAP-XXXX - WIP Authentication anonymous pick aa0af50da PTAP-XXXX - WIP Authentication anonymous-2 pick 21d9271d8 PTAP-XXXX - WIP Authentication anonymous pick ef7c71eb5 PTAP-XXXX - WIP Authentication anonymous pick 76f5107bc PTAP-XXXX - WIP Authentication anonymous pick d5bf94fdc PTAP-XXXX - checkstyle issues pick 16b304566 (pta_temp) PTAP-XXXX - WIP Authentication anonymous updates
我们需要把第一个提交保留为pick,其他所有需要压缩的提交的pick替换为squash(或缩写s):
pick 7832f7911 PTAP-XXXX - WIP Authentication squash 96984a70c PTAP-XXXX - WIP Authentication part 2 squash e0b964795 PTAP-XXXX - WIP Authentication anonymous squash aa0af50da PTAP-XXXX - WIP Authentication anonymous-2 squash 21d9271d8 PTAP-XXXX - WIP Authentication anonymous squash ef7c71eb5 PTAP-XXXX - WIP Authentication anonymous squash 76f5107bc PTAP-XXXX - WIP Authentication anonymous squash d5bf94fdc PTAP-XXXX - checkstyle issues squash 16b304566 (pta_temp) PTAP-XXXX - WIP Authentication anonymous updates
squash会将该提交合并到前一个提交,并保留所有提交信息供你编辑;- 如果不需要保留其他提交的信息,可以用
fixup(或缩写f),它会直接丢弃该提交的信息,只保留第一个提交的内容。
编辑完成后保存并退出编辑器。
4. 修改合并后的提交信息
接下来Git会自动打开另一个编辑器窗口,让你编辑合并后的最终提交信息。你需要删除所有旧的WIP相关信息,替换为:
PTAP-330- Add anonymous authentication
保存并退出编辑器,Git就会完成提交的压缩与信息替换。
5. 强制推送修改后的历史到远程
因为我们重写了公共分支的历史,普通的git push会失败,需要使用强制推送。推荐使用--force-with-lease,它比直接--force更安全,能避免意外覆盖其他人的提交:
git push origin master --force-with-lease
重要注意事项
- 通知团队成员:重写Master分支历史后,所有在这个分支上工作的开发者需要重新同步本地代码,执行
git pull --rebase来获取修改后的历史,避免代码冲突。 - 备份分支:如果担心操作出错,可以先创建一个备份分支:
git checkout -b master-backup,这样即使变基失败,也能快速恢复到原来的状态。
内容的提问来源于stack exchange,提问作者drissi
相关产品推荐
相关产品推荐

