You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Git中处理双上游Android项目的变更合并,避免重复解决冲突?

双上游开源Android项目的高效合并与冲突管理方案

1. 配置上游远程仓库

  • 为两个上游项目添加独立的Git远程仓库,方便追踪更新:
    git remote add upstream1 <上游1仓库URL>
    git remote add upstream2 <上游2仓库URL>
    
  • 定期拉取上游最新版本(仅拉取,不自动合并):
    git fetch upstream1
    git fetch upstream2
    

2. 启用冲突解决记忆(Rerere)

Git的rerere功能会自动记录冲突的解决方式,下次遇到完全相同的冲突时自动应用之前的解决方案,彻底避免重复劳动:

  • 在当前仓库开启rerere:
    git config --local rerere.enabled true
    
  • 第一次合并上游分支时,由于历史无关需要添加--allow-unrelated-histories,后续合并无需该参数:
    # 第一次合并上游1的主分支
    git merge upstream1/main --allow-unrelated-histories
    # 手动解决冲突后提交,rerere会记录解决方案
    git add .
    git commit -m "Merge upstream1 vX.X.X"
    
    # 合并上游2的主分支(首次同样需要--allow-unrelated-histories)
    git merge upstream2/main --allow-unrelated-histories
    
    后续再合并上游更新时,rerere会自动处理之前解决过的冲突,仅当本地和上游对同一行内容有新修改时,才需要手动介入。

3. 针对strings.xml的自定义合并策略

对于需要整合两个上游及自身新增字符串的strings.xml,可以通过自定义合并驱动实现自动合并:

  1. 在仓库的.git/config中添加合并驱动配置:
    [merge "xml-string-combine"]
        name = Combine string resources from multiple sources
        driver = python3 scripts/combine_strings.py %A %B %O
    
  2. 在仓库根目录创建.gitattributes文件,指定strings.xml使用该驱动:
    res/values/strings.xml merge=xml-string-combine
    
  3. 编写scripts/combine_strings.py脚本,核心逻辑:
    • 解析基础版本(%O)、本地版本(%A)、上游版本(%B)的XML内容
    • 按name属性合并所有<string>元素,优先保留本地修改的内容,自动去重
    • 将合并结果写入本地版本文件(%A),完成自动合并
      这样只有当同一name的字符串在本地和上游都被修改时,才会触发手动冲突解决。

4. 避免保留上游完整历史

如果不想存储上游项目的完整历史,可使用浅克隆拉取上游:

# 仅拉取上游最新1个提交的历史
git fetch upstream1 --depth 1
git fetch upstream2 --depth 1

此方式仅保留上游的最新版本,大幅减少本地仓库体积,但无法追溯上游历史,适合仅关注最新版本的场景。

5. 推荐工作流

  1. 上游发布新版本时,先拉取所有上游更新:git fetch upstream1 && git fetch upstream2
  2. 依次合并两个上游分支,利用rerere自动处理重复冲突
  3. 手动解决少数新冲突,提交合并结果
  4. 测试合并后的代码,确认无误后发布下游新版本

内容的提问来源于stack exchange,提问作者bmiller59

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 22:30:54