【问题标题】:Resolve merge conflict only for some files and commit to branch for other teams to resolve theirs仅解决某些文件的合并冲突,并提交到分支以供其他团队解决
【发布时间】:2018-05-29 20:07:03
【问题描述】:

简而言之,我们有一个存储库,用于托管不同功能团队的代码,即服务器端、移动、ci、自动化 qa 等。

现在,当我们尝试将支持分支的错误修复下拉到 dev-release-branch 时,会出现很多与不同团队/开发领域相关的冲突。由于我们没有一个人覆盖服务器端和移动端,因此很难为一个人解决冲突。

这里的问题是:是否有可能只解决一些冲突(例如服务器端),然后推送到中间分支,并让其他团队解决与其开发领域相关的冲突。并且只有在所有团队解决了所有冲突之后,才最终合并中间分支。

也许我们在这里做错了什么。任何建议都将不胜感激(除了将代码库拆分为单独的 repo,为此为时已晚)。

【问题讨论】:

    标签: git git-pull merge-conflict-resolution


    【解决方案1】:
    git checkout -b server-team-merge dev-release-branch
    git merge support-team-fixes
    # fix the conflicts you can fix here
    git commit -m "server-team partial merge of $(git describe support-team-fixes)"
    

    每个其他团队也这样做。然后合并部分合并的分支——如果结果真的不相交,你可以一次全部完成,这将是一个微不足道的操作,

    git checkout dev-release-branch
    git merge {server,mobile,ci,automation}-team-merge
    

    但如果出现这种抱怨,请一次将它们合并为一个,以找出关于如何解决某些冲突的不同想法。

    当您合并一个分支时,git 将结果视为结果提交中合并历史的正确和完整合并,因此任何后续合并都会将整个历史标识为共享,并且没有什么可做的。但是,如果您从同一个父级进行多次独立合并,则这些合并不在彼此的历史记录中,并且可以产生您想要的任何结果;在这些结果的后续合并中,Git 可以查看提交的祖先并识别正确的基础。

    【讨论】:

    • 抱歉,在合并后我应该如何处理超出我范围的修复还不是很清楚 - 只是让它们处于冲突状态而不提交?
    • 如果它们不属于我们的范围,我们是否可以从提交中排除所有自动合并的文件?我想要服务器分支只包含与服务器相关的修复。
    • 您当然可以在提交合并结果之前覆盖对范围外文件的所有本地更改,xargs -d\\n git checkout MERGE_HEAD -- <out-of-scope-files 只是按原样获取传入的内容(如果可能没有冲突,您可以使用 @ 987654324@ 合并以强制有机会进行此类修复)。可能通过标记git ls-files 输出来生成此类更改的日志,并验证是否有人在最终提交中为每个更改提供担保。
    • 但是不冲突的更改应该在每次合并中以相同的方式自动合并,因此最终合并从哪里获取内容无关紧要,实际上都是相同的差异。仔细想想,我认为不需要重置。对于冲突解决,大概您有某种方法可以确定谁,在哪个合并中进行更改,有权解决每个冲突,因此只需采用该分支的版本,因此在其他分支中所做的任何事情都没有任何区别。
    【解决方案2】:

    好吧,你可以试试这样的:

    1. 结帐dev-release-branch 并开始与support-branch 的第一次合并。
    2. 解决尽可能多的冲突(由一个人)。该人无法合并的文件和目录应恢复为dev-release-branch 状态。
    3. 将结果状态提交为a-half-of-a-merge,将其保存为(临时本地)标签。
    4. dev-release-branch 恢复到合并前的状态
    5. 由另一个能够合并源代码树其他部分的人与support-branch 执行另一个合并。再次重申,不考虑在第 2 步中考虑的更改。
    6. 如果有要合并的更改,请重复步骤 3-5(当然,选择不同的标签名称)。

    当最后一个“域”的所有冲突都解决了,但尚未创建合并提交时,让我们开始合并来自不同“半标签”的更改。

    1. 将当前更改集添加到索引中。
    2. cherry-pick 从第一个 half-tag 更改。您必须使用-m 开关(可能是-m 1)和--no-commit 指定合并父级
    3. 解决您在此阶段遇到的任何冲突。希望这份清单简短明了
    4. 将更改添加到索引
    5. 对所有half-tags 重复步骤 2-4
    6. 最终提交 The Great 合并。
    7. 现在可以安全删除所有半标签。

    您可能已经注意到,整个过程有些漫长、复杂和繁琐。对于未来的版本,我建议将项目拆分为适当数量的子项目,然后使用 git submodules 将它们组合成一个大项目。

    【讨论】:

    • 我们有类似的想法,但我的印象是我们遗漏了一些东西,应该在 git 中有更简单的方法。
    • 嗯,有一种更简单的方法——查看@jthill 的答案。但是他的方法在历史图表中留下了一堆中间合并,而且可能更重要的是,它有效地打击了 CI 机器人的机械思维。
    猜你喜欢
    • 2020-12-28
    • 2021-07-28
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 2020-06-15
    • 2021-01-20
    相关资源
    最近更新 更多