Git回滚提交删除文件后,如何重新创建Pull Request
解决Revert后重新提交PR且保留历史的方案
这种情况真的太常见了——我自己也碰到过好几次:辛辛苦苦提交的PR被团队revert,之后想重新推上去,结果同步上游代码时直接把自己的文件删了,还得纠结怎么保留提交历史。别慌,这有两个干净的解决方案,既能恢复文件,又能保住你的提交记录,显得专业又靠谱。
首先先理清楚你需要用到的几个关键Commit SHA:
- 你最初提交
src/code.go的那个Commit(记为YOUR_COMMIT_SHA) - 团队用来revert你的PR的那个Commit(记为
REVERT_COMMIT_SHA)
方案1:直接撤销Revert提交(最简洁的方式)
这个方法会生成一个新的Commit,明确表示「恢复之前被revert的提交」,完整保留所有历史脉络,团队也能清晰看到操作逻辑。
- 确保本地关联上游团队仓库
如果还没添加上游远程,先执行:
git remote add upstream team/projectname
- 拉取上游最新代码
切换到你的master分支,拉取上游的最新提交:
git checkout master git fetch upstream
- 撤销Revert操作
因为revert的是一个合并提交,需要用-m 1指定父分支(通常选1,对应上游的master分支):
git revert -m 1 REVERT_COMMIT_SHA
执行后Git会自动恢复src/code.go,同时生成一个新Commit,说明是恢复了之前的revert操作。
- 推送到你的Fork并创建新PR
git push origin master
现在直接去平台创建新PR即可,所有历史记录都完整保留。
方案2:重新应用原始提交(适合需要修改代码的情况)
如果你的原始提交需要做一些调整再重新提交,用这个方法更灵活:
- 基于上游最新代码创建新分支
git checkout -b reapply-my-change upstream/master
- 重新应用你的原始提交
git cherry-pick YOUR_COMMIT_SHA
此时会触发冲突(因为上游的revert提交删除了文件),手动打开src/code.go保留你的代码内容,然后执行:
git add src/code.go git cherry-pick --continue
- 推送新分支并创建PR
git push origin reapply-my-change
基于这个新分支创建PR,历史记录里会显示你原始的提交,加上解决冲突的新提交,逻辑清晰。
为什么直接git pull upstream master会删文件?
因为上游仓库里的REVERT_COMMIT_SHA是明确删除src/code.go的提交,pull的时候Git会把这个提交合并进来,自然就会删掉文件。而上面的两种方案,要么撤销那个revert,要么跳过revert的影响重新应用你的提交,都能完美保留历史。
内容的提问来源于stack exchange,提问作者tpc1095
相关产品推荐
相关产品推荐

