Git分支合并策略:避免Cherry-picking的合并方法

47次阅读
没有评论

问题描述

在公司的Git项目中遇到了一个问题,他们有两个主要的Git分支:Release分支和Master分支。Release分支包含准备好进行测试的代码,而Master分支包含最终准备部署的代码。有时他们并不希望将所有Release分支上的代码都合并到Master分支,因为有各种原因可能导致某些代码不能直接合并,比如延迟的计划、需要更多的测试、出现了问题等。用户想知道在这种情况下,使用什么样的Git DevOps策略能够只将特定的代码项合并到Master分支?他们还指出,数据库的处理方式与普通应用程序不同,因为他们是在执行变更脚本,而不是覆盖二进制文件等。

解决方案

在解决这个问题之前,我们先来了解一下关于Cherry-picking的一些背景信息。有人认为Cherry-picking在某些情况下是不好的,但实际上,这只是工具的一种使用方式,根据不同的情况,使用Cherry-picking可能是合适的,也可能不合适。因此,我们需要找到一种既能满足合并需求,又能避免Cherry-picking的策略。

使用”Branch per Feature”策略

一个适用于这种场景的策略是”Branch per Feature”,这个策略在合并特定代码项时非常有效。下面是这个策略的主要原则:

  1. 每个分支都从Master分支开始。 这意味着Release分支也是从Master分支派生的。
  2. 只有特定的”feature-123″分支接收常规提交。 这些分支代表不同的功能特性。
  3. 使用一个”qa”分支进行测试。 这个分支从Master分支新建,然后将需要在测试中的”feature-123″分支合并进来。需要注意的是,每次修改”qa”分支时都需要新建一个分支,不允许其他提交。
  4. 当”qa”分支发布/部署后,将其重命名为”master”并取代之前的Master分支。 这时,剩余的”feature-123″分支将会被rebase到新的Master分支上。这个过程可以利用git rerere缓存来避免重复的冲突解决。

这个策略的核心思想是,不允许直接在Master分支上合并代码,而是使用一个专门的”qa”分支来测试。这样,不合并的代码项也能通过这个策略合理地进行测试和合并,同时避免了Cherry-picking的问题。

附加信息

  • 如果你的开发团队可以接受rebase操作,这个策略会非常顺畅,因为rebase可以避免大量的合并提交和冲突。
  • 可以根据需要创建多个类似”qa”分支,比如一个用于已完成但未经过完整测试的”rc”(release candidate)分支,以及一个用于接近“完成”但未经过测试的特性的”qa”分支。
  • 可以参考Adam Dymitruk的相关博客文章,他详细解释了这个策略的细节。你可能需要为其中的每个步骤编写自己的工具(例如,从Jira中自动拉取要进入”qa”分支的特性分支,而不是手动执行这个操作)。

示例代码:

#!/bin/bash
# 启动容器A
docker run -d --name container_a your_image_a
# 等待容器A完全启动
while ! docker exec container_a echo "Container A is ready"; do
  sleep 1
done
# 启动容器B
docker run -d --name container_b your_image_b

以上是解决该问题的两种主要策略,你可以根据团队的情况选择适合的策略来管理分支合并。务必充分了解每种策略的优缺点,以及团队成员对rebase等操作的接受程度,来做出明智的决策。

正文完