仅解决某些文件的合并冲突并提交其他团队的分支以解决他们的冲突
Resolve merge conflict only for some files and commit to branch for other teams to resolve theirs
简而言之,我们有一个存储库,用于托管不同功能团队的代码,即服务器端、移动、ci、自动化质量检查等。
现在,当我们试图从 support-branch 错误修复下拉到 dev-release-branch 时,许多冲突似乎与不同的 teams/areas 开发有关。由于我们没有一个人负责服务器端和移动端,因此很难为一个人解决冲突。
这里的问题是:是否可以通过某种方式只解决部分冲突(例如服务器端),然后推送到中间分支,让其他团队解决与他们开发领域相关的冲突。只有在所有团队解决所有冲突后,才能最终合并中间分支。
也许我们这里做错了什么。任何建议都会被采纳ci(除了将代码库拆分成单独的 repo,这太晚了)。
嗯,你可以尝试这样的事情:
- 签出
dev-release-branch
并开始与 support-branch
的第一次合并。
- 解决尽可能多的冲突(由一个人)。那个人无法合并的文件和目录应该恢复到
dev-release-branch
状态。
- 将结果状态提交为
a-half-of-a-merge
,将其保存为(临时本地)标签。
- 恢复
dev-release-branch
到合并前的状态
- 由另一个能够合并源代码树其他部分的人与
support-branch
执行另一个合并。同样,还原不被视为步骤 2 中的更改。
- 如果有更改要合并,请重复步骤 3-5(当然,选择不同的标签名称)。
当最后一个 "domain" 的所有冲突都已解决,但尚未创建合并提交时,让我们开始合并来自不同 "half-tags" 的更改。
- 将当前更改集添加到索引。
cherry-pick
从第一个 half-tag
开始变化。您必须使用 -m
开关(可能 -m 1
)和 --no-commit
指定合并父级
- 解决您在此阶段遇到的任何冲突。希望列表简短或明显
- 将更改添加到索引
- 对所有
half-tags
重复步骤 2-4
- 最终提交 The Great 合并。
- 现在可以安全删除所有半标签了。
您可能已经注意到,整个过程有些漫长、复杂和繁琐。对于未来的版本,我建议将项目拆分为适当数量的子项目,然后使用 git submodules
.
将它们组合成一个大项目
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 可以看到提交的祖先并识别正确的基础。
简而言之,我们有一个存储库,用于托管不同功能团队的代码,即服务器端、移动、ci、自动化质量检查等。
现在,当我们试图从 support-branch 错误修复下拉到 dev-release-branch 时,许多冲突似乎与不同的 teams/areas 开发有关。由于我们没有一个人负责服务器端和移动端,因此很难为一个人解决冲突。
这里的问题是:是否可以通过某种方式只解决部分冲突(例如服务器端),然后推送到中间分支,让其他团队解决与他们开发领域相关的冲突。只有在所有团队解决所有冲突后,才能最终合并中间分支。
也许我们这里做错了什么。任何建议都会被采纳ci(除了将代码库拆分成单独的 repo,这太晚了)。
嗯,你可以尝试这样的事情:
- 签出
dev-release-branch
并开始与support-branch
的第一次合并。 - 解决尽可能多的冲突(由一个人)。那个人无法合并的文件和目录应该恢复到
dev-release-branch
状态。 - 将结果状态提交为
a-half-of-a-merge
,将其保存为(临时本地)标签。 - 恢复
dev-release-branch
到合并前的状态 - 由另一个能够合并源代码树其他部分的人与
support-branch
执行另一个合并。同样,还原不被视为步骤 2 中的更改。 - 如果有更改要合并,请重复步骤 3-5(当然,选择不同的标签名称)。
当最后一个 "domain" 的所有冲突都已解决,但尚未创建合并提交时,让我们开始合并来自不同 "half-tags" 的更改。
- 将当前更改集添加到索引。
cherry-pick
从第一个half-tag
开始变化。您必须使用-m
开关(可能-m 1
)和--no-commit
指定合并父级
- 解决您在此阶段遇到的任何冲突。希望列表简短或明显
- 将更改添加到索引
- 对所有
half-tags
重复步骤 2-4
- 最终提交 The Great 合并。
- 现在可以安全删除所有半标签了。
您可能已经注意到,整个过程有些漫长、复杂和繁琐。对于未来的版本,我建议将项目拆分为适当数量的子项目,然后使用 git submodules
.
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 可以看到提交的祖先并识别正确的基础。