如何推送并合并特定提交历史?Perforce转Git场景技术求助
解决Perforce SubProj新变更合并到Git SuperProj的步骤
既然你之前已经完成过一次全量导入合并,现在核心问题是要避免重复导入旧历史,只把新的变更合并到SuperProj里。下面是具体的操作流程,我会尽量讲得直白:
1. 准备工作:关联两个仓库
首先确保你已经把带新变更的SubProj完整导入到本地Git仓库(假设这个仓库路径是~/subproj-new),然后处理SuperProj:
# 克隆SuperProj到本地(如果还没克隆的话) git clone <你的SuperProj远程仓库地址> cd superproj # 把本地新导入的SubProj仓库添加为临时远程 git remote add subproj-temp ~/subproj-new git fetch subproj-temp
2. 找到历史关联的基点
你需要找到上次合并后,SubProj的最后一个提交ID——这个提交在SuperProj的历史里也存在(因为之前全量合并过)。
- 在SuperProj里搜索之前合并SubProj的记录,比如用提交信息关键词:
找到那次合并提交后,查看它的父提交(也就是当时SubProj的最终提交),记为git log --grep="合并SubProj" --onelineOLD_LAST_COMMIT。 - 去新导入的SubProj仓库里确认这个提交存在:
如果能找到,说明新旧历史是连续的,接下来就简单了。cd ~/subproj-new git log --oneline | grep "$OLD_LAST_COMMIT"
3. 合并新变更到SuperProj
这里分两种场景,选适合你的方式:
场景A:新提交不多,用Cherry-pick逐个迁移
如果SubProj的新变更只有几个提交,直接单独迁移更灵活:
# 回到SuperProj的目标分支(比如main) cd superproj git checkout main # 列出SubProj里从OLD_LAST_COMMIT之后的所有新提交 git log --oneline subproj-temp/main ^OLD_LAST_COMMIT # 把这些提交ID逐个cherry-pick过来,比如提交ID是abc123、def456 git cherry-pick abc123 def456
如果遇到冲突,解决冲突后执行git cherry-pick --continue,直到所有提交都应用完成。
场景B:新提交很多,直接合并分支
如果新提交数量多,Git会自动识别共同历史,只合并新内容:
cd superproj git checkout main # 合并SubProj的主分支到当前分支 git merge subproj-temp/main
遇到冲突时,解决冲突后执行git commit完成合并即可。
4. 收尾工作
合并完成后,推送到SuperProj的远程仓库:
git push origin main
如果不需要再关联本地的SubProj临时仓库了,可以删掉它:
git remote remove subproj-temp
特殊情况处理:历史提交ID不一致
如果因为导入配置变化,导致新导入的SubProj里旧历史的提交ID和SuperProj里的不一样,就需要用rebase --onto重构新提交:
# 回到新导入的SubProj仓库,创建临时分支 cd ~/subproj-new git checkout -b temp-new-changes # 把OLD_LAST_COMMIT之后的提交,重新基于SuperProj里对应的提交(记为SUPER_OLD_COMMIT)构建 git rebase --onto SUPER_OLD_COMMIT OLD_LAST_COMMIT temp-new-changes # 回到SuperProj,合并这个重构后的分支 cd superproj git merge ~/subproj-new/temp-new-changes
操作前记得备份仓库,避免误操作丢数据哦!
内容的提问来源于stack exchange,提问作者Sandra K
相关产品推荐
相关产品推荐

