Git推送后移除develop、kernel分支多余提交的实现方法
问题场景与诉求
操作前提
- 所有操作不得破坏master分支的任何内容
问题背景
- 初始同步develop分支时执行命令如下:
git checkout develop git pull upstream develop # 拉取上游develop分支最新更新到本地 git push origin develop # 将本地develop分支同步到个人远端origin仓库
- 操作失误在本地develop分支产生错误提交,后续回退操作额外生成3条冗余提交:
d3b229f9 (develop) Merge branch 'develop' of github.com:ROCmSoftwarePlatform/bench into develop 16daa203 Revert "kernel converter tool to create yaml file from lib 97e834cb kernel converter tool to create yaml file from lib"
- 基于携带冗余提交的develop分支创建工作分支kernel,执行命令:
git checkout -b kernel - 在kernel分支完成全部代码修改后推送远端并创建PR,当前需要将kernel分支变更合入develop,但要求提交历史完全剔除d3b229f9、16daa203、97e834cb这3条冗余记录,最终仅保留有效提交
5a555e7a对应的提交信息。
备注:此前尝试对kernel分支执行squash merge操作,无法清除develop分支上已存在的冗余提交记录。
当前kernel分支提交列表如下:
5a555e7a (HEAD -> kernel, origin/kernel) new tool yaml file d3b229f9 (develop) Merge branch 'develop' of github.com:softwarePlatform/Benchmark into develop 16daa203 Revert "kernel converter tool to create yaml file from lib logic" 97e834cb kernel converter tool to create yaml file from lib logic f4af1648 (upstream/develop) Merge pull request #1244 from xxxxx/develop b1a07da2 update version for new release
解决方案
按以下步骤操作即可完全清理冗余提交,全程不会影响master分支:
1. 修复本地及个人远端的develop分支
3条冗余提交是本地develop误操作产生的,上游官方develop分支的基准点为干净的f4af1648,直接重置对齐即可:
# 切换到本地develop分支 git checkout develop # 拉取上游最新仓库状态 git fetch upstream # 将本地develop硬重置到上游develop的干净版本,彻底清除本地3条冗余提交 git reset --hard upstream/develop # 强制推送到个人远端origin仓库,覆盖远端携带冗余提交的develop版本 # 若为多人协作仓库,强制推送前务必同步团队成员,避免其他成员本地旧代码冲突 git push origin develop --force
执行完成后,本地和个人远端的develop分支将完全对齐上游官方版本,无任何冗余提交。
2. 重建干净的kernel分支
原有kernel分支基于错误版本的develop创建,基线携带冗余提交,直接将有效提交迁移到干净基线上即可:
# 基于修复完成的干净develop分支创建临时分支 git checkout -b kernel-clean develop # 将kernel分支上唯一的有效提交5a555e7a拣选到当前干净分支 git cherry-pick 5a555e7a
拣选完成后查看提交日志,确认分支仅包含上游develop原有提交 + 有效提交5a555e7a,无3条冗余记录即可。
3. 替换原有kernel分支,自动更新PR
验证代码功能、提交历史均无误后,用干净分支替换原有kernel分支,推送到远端后PR会自动同步更新:
# 删除本地携带冗余提交的旧kernel分支 git branch -D kernel # 将临时干净分支重命名为kernel git branch -m kernel-clean kernel # 强制推送到个人远端,覆盖旧的kernel分支 git push origin kernel --force
4. 完成PR合入
此时PR的提交历史仅保留单条有效提交,直接按仓库规范选择merge或squash merge合入即可,不会再出现冗余提交记录。
注意事项
- 所有操作仅涉及develop、kernel两个分支,完全不会触碰master分支,符合操作要求
- 执行硬重置、强制推送操作前,确认本地没有未提交的有效代码,避免代码丢失
- 多人协作场景下,强制推送公共分支(develop)后,通知所有团队成员执行
git fetch upstream && git reset --hard upstream/develop同步本地develop版本,避免后续将旧的冗余提交重新推到远端
内容的提问来源于stack exchange,提问作者Ahamed Kamal
相关产品推荐
相关产品推荐

