如何在Git中还原SVN分支间缺失的合并历史?
如何在Git中还原SVN分支间的合并历史并保持双向同步
完全可以在Git仓库中还原SVN里trunk到branch/A的合并记录,核心是通过Git的合并与变基操作,在不改变现有代码内容的前提下,为分支历史补全合并关联节点,同时不破坏后续的双向同步流程。
具体操作步骤
备份分支(避免操作失误)
先为当前的branch/A创建备份分支:git branch branch/A-backup定位对应提交哈希
- 在Git的
trunk分支中,找到对应SVNcommit42的Git提交哈希(记为TRUNK_COMMIT):可以通过git log搜索SVN提交ID或提交信息定位,例如:git log trunk --grep="svn commit 42" --oneline - 在Git的
branch/A分支中,找到对应SVNcommit43的父提交哈希(记为BRANCH_PARENT):即commit43在SVN执行合并操作之前的那个提交。
- 在Git的
补全合并历史节点
- 切换到临时分支,基于
BRANCH_PARENT创建:git checkout -b temp-fix BRANCH_PARENT - 执行空合并(仅建立历史关联,不修改代码内容):
这里git merge --no-ff -s ours TRUNK_COMMIT-s ours策略会确保合并后的代码与BRANCH_PARENT完全一致,因为branch/A的后续提交已经包含了SVN合并后的内容,我们只需要补全历史关联。
- 切换到临时分支,基于
重放后续提交到合并节点之后
将branch/A中BRANCH_PARENT之后的所有提交(包括commit43)变基到新的合并节点上:git rebase --onto temp-fix BRANCH_PARENT branch/A验证与清理
- 查看分支历史,确认合并节点已正确关联:
git log --graph --oneline branch/A - 确认无误后,删除临时分支:
git branch -D temp-fix
- 查看分支历史,确认合并节点已正确关联:
双向同步注意事项
- 完成历史修复后,重新检查
git svn的分支映射配置,确保trunk和branch/A与SVN路径的对应关系正确。 - 后续从SVN拉取代码时,使用
git svn fetch后,需确保分支合并逻辑与SVN保持一致,避免冲突。 - 推送到SVN时,使用
git svn dcommit要严格对应分支路径,防止提交到错误的SVN节点。
内容的提问来源于stack exchange,提问作者Feuerteufel
相关产品推荐
相关产品推荐

