使用 Git,是否可以为多个开发人员之间的单个合并拆分合并冲突解决方案?
Using Git, is it possible to split up merge conflict resolution for a single merge between multiple developers?
一些背景:
目前在 CVS 上并希望转移到 Git。我们每个月左右都会为复杂的自定义内部平台进行计划发布。
在当前的开发工作流程中,我们有多个分支,每个分支对应一个我们计划发布的版本,例如:
- 发布 7000,可能会在 5 月发布
- Release 7100,大概八月出来
- Release 7200,大概九月出
(我们可以同时处理六个计划中的版本)。
我们还为目前没有发布日期的大型项目命名了项目分支。当日期已知时,它们最终会合并到选定的计划发布分支中。
每个版本都非常大(很多功能),因为发布需要中断,我们不能太频繁,我们实际上可以每个月左右获得一次发布停机时间的批准。
随之而来的是合并冲突。我们有一份 CVS 报告,其中提供了要完成的手动合并列表,我们将工作分配给了几个开发人员。有什么方法可以对 Git 做同样的事情 - 在多个开发人员之间拆分合并工作以从一个分支合并到另一个分支(导致许多冲突)?
编辑:
这就是我最终所做的(请注意,我们正在使用 Atlassian Stash/BitBucket 服务器进行拉取请求/代码审查):
- 合并守护进程:从目标分支
创建一个新的"manual merges"分支
- 合并守护进程:开始合并以获取冲突列表
- 合并守护进程:通知管理器并等待冲突解决
- 经理:分摊开发人员之间的矛盾
- 开发人员:每个开发人员从合并分支创建并签出 "feature" 分支,然后开始将源标记合并到他们的功能分支 - 他们在他们的环境中遇到冲突。他们只解决他们负责的文件的冲突,然后进行软重置以中止合并,并只提交他们解决的文件。然后他们将他们的功能分支(经过审核)合并到 "manual merges" 分支。
- 合并守护进程:开发人员解决冲突后,从 "manual merges" 分支检出修改后的文件(仅更改的文件)。此时应该解决所有手动冲突。提交并推送。
这是一种方法:
- 开始合并
- 使用
git diff --name-only --diff-filter=U
打印合并冲突列表
- 使用
git reset --hard HEAD
重置为开始合并之前的状态
但是,最好不要让这些事情累积起来,而不是进行大规模的冲突解决练习,这可能会引入更多错误。
您可以将 7100
设为 7000
的一个分支而不是 master
,并定期将 7000
变基或合并到 7100
中。
您还可以通过将每个功能保留在单独的分支(feature-a
、feature-b
等)上并在接近发布时一次将它们合并为一个来做到这一点,并且您确切知道里面会有什么。
假设您的每个开发人员都有自己的存储库克隆,则无法在所有这些克隆的同一分支中拆分单个合并和冲突解决工作。当开发人员在她的分支上执行 git merge
并遇到冲突时,合并将保持 "in-progress"(因此,无法进行进一步的提交)直到解决该分支中的所有冲突并且合并完成合并犯罪。
也就是说,您仍然可以指派每个开发人员在他自己的克隆存储库中的不同分支上解决冲突;只是不是一个分支上有多个开发人员。
如果你真的必须坚持现有的分支设置并且你可以干净地划分冲突解决工作而不需要团队成员踩到每个脚趾,你可以尝试在共享机器上拥有一个公共存储库,每个人都可以可以访问(例如,通过 ssh
)。只需执行 git merge
,输出中确定的冲突就是您的报告:-)
一般来说,通过经常合并它们来避免让分支彼此偏离太远。进行合并盛宴,尤其是在临近发布日期时,可能会非常紧张且容易出错。
关于您对严格的 SLA 限制发布周期的评论的旁注,您是否考虑过不同的发布技术,例如 blue/green 部署或集群策略(适合您的产品)可能有助于减少停机时间和降低风险?
也许 Gerrit,笼统地说 "Git server",可以帮助您:它具有 变化 的概念。每个更改都归用户(通常是开发人员)所有。开发人员可以将功能推送到未来的发布分支,但不会直接应用于该分支(例如,通过推送到 magic 分支 refs/for/release-7100
)。
一旦某人(例如发布经理)决定确实应该接管此功能,就可以提交更改。如果发布分支在此期间分歧太大,开发人员将收到通知并需要解决冲突。推送解决冲突后,终于可以再次提交变更了。
我还没有亲自尝试过这个工作流程,但我想这可行。无论如何,我认为值得一试……;-)
哦,天哪,我们的团队最近经历了这个,最初对这个限制感到沮丧。从分支 "source" 合并到 "destination",我们的(公认的 hackkey)解决方案是:
- 对于每个团队成员,我们在各自的机器上克隆了 "destination" 的副本作为 "destinationMerging"。
- 然后我们每个人,在 destinationMerging 目录中,'git merge source'
- 这产生了一个冲突文件列表。我们建立了一个我们所有人都可以编辑的冲突清单。 (您可以在 Google 文档中执行此操作。)
- 然后我们开始逐个文件地合并冲突。当我们中的一个人开始处理一个新文件时,我们会将其从列表中剔除。勾选表示 "it is done or it is being worked on".
- 当我们完成一个文件时,我们会将其复制到原始 "destination" 存储库和 commit/push 这些更改。
- 解决并推送所有冲突文件后,来自 "destination" 的一个人拉取所有更改并继续 'git merge source'
绝对不优雅,但它完成了工作。我理解 "it's better to just not let these things build up" 但是当它们发生时,它们需要被修复,这就是我们能够以分布式方式进行的方式。
一些背景:
目前在 CVS 上并希望转移到 Git。我们每个月左右都会为复杂的自定义内部平台进行计划发布。
在当前的开发工作流程中,我们有多个分支,每个分支对应一个我们计划发布的版本,例如:
- 发布 7000,可能会在 5 月发布
- Release 7100,大概八月出来
- Release 7200,大概九月出
(我们可以同时处理六个计划中的版本)。
我们还为目前没有发布日期的大型项目命名了项目分支。当日期已知时,它们最终会合并到选定的计划发布分支中。
每个版本都非常大(很多功能),因为发布需要中断,我们不能太频繁,我们实际上可以每个月左右获得一次发布停机时间的批准。
随之而来的是合并冲突。我们有一份 CVS 报告,其中提供了要完成的手动合并列表,我们将工作分配给了几个开发人员。有什么方法可以对 Git 做同样的事情 - 在多个开发人员之间拆分合并工作以从一个分支合并到另一个分支(导致许多冲突)?
编辑:
这就是我最终所做的(请注意,我们正在使用 Atlassian Stash/BitBucket 服务器进行拉取请求/代码审查):
- 合并守护进程:从目标分支 创建一个新的"manual merges"分支
- 合并守护进程:开始合并以获取冲突列表
- 合并守护进程:通知管理器并等待冲突解决
- 经理:分摊开发人员之间的矛盾
- 开发人员:每个开发人员从合并分支创建并签出 "feature" 分支,然后开始将源标记合并到他们的功能分支 - 他们在他们的环境中遇到冲突。他们只解决他们负责的文件的冲突,然后进行软重置以中止合并,并只提交他们解决的文件。然后他们将他们的功能分支(经过审核)合并到 "manual merges" 分支。
- 合并守护进程:开发人员解决冲突后,从 "manual merges" 分支检出修改后的文件(仅更改的文件)。此时应该解决所有手动冲突。提交并推送。
这是一种方法:
- 开始合并
- 使用
git diff --name-only --diff-filter=U
打印合并冲突列表 - 使用
git reset --hard HEAD
重置为开始合并之前的状态
但是,最好不要让这些事情累积起来,而不是进行大规模的冲突解决练习,这可能会引入更多错误。
您可以将 7100
设为 7000
的一个分支而不是 master
,并定期将 7000
变基或合并到 7100
中。
您还可以通过将每个功能保留在单独的分支(feature-a
、feature-b
等)上并在接近发布时一次将它们合并为一个来做到这一点,并且您确切知道里面会有什么。
假设您的每个开发人员都有自己的存储库克隆,则无法在所有这些克隆的同一分支中拆分单个合并和冲突解决工作。当开发人员在她的分支上执行 git merge
并遇到冲突时,合并将保持 "in-progress"(因此,无法进行进一步的提交)直到解决该分支中的所有冲突并且合并完成合并犯罪。
也就是说,您仍然可以指派每个开发人员在他自己的克隆存储库中的不同分支上解决冲突;只是不是一个分支上有多个开发人员。
如果你真的必须坚持现有的分支设置并且你可以干净地划分冲突解决工作而不需要团队成员踩到每个脚趾,你可以尝试在共享机器上拥有一个公共存储库,每个人都可以可以访问(例如,通过 ssh
)。只需执行 git merge
,输出中确定的冲突就是您的报告:-)
一般来说,通过经常合并它们来避免让分支彼此偏离太远。进行合并盛宴,尤其是在临近发布日期时,可能会非常紧张且容易出错。
关于您对严格的 SLA 限制发布周期的评论的旁注,您是否考虑过不同的发布技术,例如 blue/green 部署或集群策略(适合您的产品)可能有助于减少停机时间和降低风险?
也许 Gerrit,笼统地说 "Git server",可以帮助您:它具有 变化 的概念。每个更改都归用户(通常是开发人员)所有。开发人员可以将功能推送到未来的发布分支,但不会直接应用于该分支(例如,通过推送到 magic 分支 refs/for/release-7100
)。
一旦某人(例如发布经理)决定确实应该接管此功能,就可以提交更改。如果发布分支在此期间分歧太大,开发人员将收到通知并需要解决冲突。推送解决冲突后,终于可以再次提交变更了。
我还没有亲自尝试过这个工作流程,但我想这可行。无论如何,我认为值得一试……;-)
哦,天哪,我们的团队最近经历了这个,最初对这个限制感到沮丧。从分支 "source" 合并到 "destination",我们的(公认的 hackkey)解决方案是:
- 对于每个团队成员,我们在各自的机器上克隆了 "destination" 的副本作为 "destinationMerging"。
- 然后我们每个人,在 destinationMerging 目录中,'git merge source'
- 这产生了一个冲突文件列表。我们建立了一个我们所有人都可以编辑的冲突清单。 (您可以在 Google 文档中执行此操作。)
- 然后我们开始逐个文件地合并冲突。当我们中的一个人开始处理一个新文件时,我们会将其从列表中剔除。勾选表示 "it is done or it is being worked on".
- 当我们完成一个文件时,我们会将其复制到原始 "destination" 存储库和 commit/push 这些更改。
- 解决并推送所有冲突文件后,来自 "destination" 的一个人拉取所有更改并继续 'git merge source'
绝对不优雅,但它完成了工作。我理解 "it's better to just not let these things build up" 但是当它们发生时,它们需要被修复,这就是我们能够以分布式方式进行的方式。