如何在Git中合并非Git源上游项目更新并保留本地自定义修改?
标准化上游跟踪方案
你原本的思路核心是完全正确的,属于上游无Git仓库场景下的标准实践,只需调整少量操作步骤让流程更严谨,全程只用Git原生功能,无需依赖外部工具或构建脚本。
初始配置步骤
- 先切换到主分支,提交所有未完成的修改,保证工作区干净
- 创建孤立的
upstream孤儿分支:git checkout --orphan upstream - 清空工作区所有现有文件,避免本地修改混入上游分支:
git rm -rf . - 将未做任何本地修改的原版上游头文件复制到工作区,提交并标注对应上游版本号:
git add xxx.h git commit -m "upstream: 导入vX.X 版本原版头文件" - 切回主分支执行合并,首次合并需要加
--allow-unrelated-histories参数,该操作属于Git原生支持的合法操作,不属于不规范用法:git merge upstream --no-commit - 此时Git会提示文件冲突,直接用主分支中已带本地修改的版本覆盖冲突文件后提交即可:
git checkout --ours xxx.h git commit -m "合并上游vX.X版本,保留本地修改"
后续上游版本更新操作
每次上游发布新版本后,只需执行以下步骤即可完成合并,全程自动保留本地修改,有冲突时按正常Git冲突流程处理即可:
- 切换到
upstream分支 - 清空工作区,放入新下载的上游新版头文件后提交:
git rm -rf . # 将新下载的xxx.h复制到当前工作区 git add xxx.h git commit -m "upstream: 更新到vY.Y版本" - 切回主分支直接合并,无需再添加额外参数:
git merge upstream - 若存在冲突,解决冲突后正常提交即可,Git会自动完成三路合并,不会丢失本地修改
方案说明
该流程完全符合Git的分支设计逻辑,首次合并添加--allow-unrelated-histories仅用于打通两个独立分支的关联,后续合并时两个分支已经存在公共祖先节点,和普通功能分支合并逻辑完全一致,所有上游版本变更、本地修改、合并记录都会完整保存在Git历史中,完全满足你的使用需求。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

