Git回退已推送的两次提交 仅保留最新提交创建PR合并如何操作?
操作错误点
- 撤销逻辑和顺序错误:你执行
git revert的目标和顺序完全不符合需求。你本意是保留今日提交、清除10天前的提交修改,结果先撤销了今日的c12345d提交,再撤销10天前的212345f提交,最终本地分支的状态相当于直接回到了两次提交之前的版本,完全没有保留你今日的修改。 - 本地修改未同步到远程:你在本地做的两次revert操作仅存在于本地分支,没有推送到PR #46对应的远程分支,所以GitHub端的PR页面依然会保留原来的两次提交记录和对应文件。
- 分支使用逻辑错误:你直接在原来PR #46对应的分支上做新修改,新提交自然会自动归入旧PR,没有基于最新的master分支拉取独立分支承载今日的修改。
正确修复步骤
第一步:恢复本地分支到包含两次提交的状态
首先撤销你刚才做的两次错误的revert操作,回到执行revert之前的状态,此时本地分支会包含10天前+今日的两次提交:
git reset --hard HEAD~2
注意:执行reset前确认你本地没有其他未提交的修改,否则会丢失未提交内容。
第二步:移除10天前的提交,仅保留今日提交
使用变基操作删除10天前的提交记录:
git rebase -i HEAD~2
执行命令后会弹出编辑界面,找到10天前的提交(哈希前缀212345f)对应的那一行,把行首的pick改成drop,保存退出后变基会自动执行,完成后你的本地分支就只会保留今日的提交了。
第三步:清理旧PR内容(可选)
如果你要清理已经关闭的PR #46对应的远程分支内容,可以强制推送当前分支到远程对应分支:
git push -f origin 你原来的PR对应分支名
推送完成后旧PR #46的页面就只会显示今日的提交内容,如果你不需要清理旧PR可以直接跳过这一步。
第四步:创建新PR合并今日修改
更稳妥的方式是直接从最新的远程master拉取新分支,把今日的提交迁移到新分支后提新PR:
- 切换到本地master分支,拉取最新远程代码:
git checkout master git pull origin master
- 新建独立功能分支:
git checkout -b 今日修改对应的新分支名
- 把今日的提交cherry-pick到新分支:
git cherry-pick c12345d
- 推送新分支到远程,创建新PR即可,此时新PR只会包含今日的修改内容。
内容的提问来源于stack exchange,提问作者jahan
相关产品推荐
相关产品推荐

