如何在不采用未准备好生产的功能的情况下将分支合并到母版?

How to merge a branch to master without taking features that aren't production ready?

我在 Stack 中检查了很多问题,但没有弄清楚如何在我的团队中使用 Gitflow Workflow。

这是我们的分支机构:

在我的团队中,我们有三个主要分支:mastertestdev。所有功能分支都从 dev 分支出来。一旦它们有点稳定,我们将它们分支回 dev(我们正在维护该开发服务器以允许一些非开发人员在发送给客户问答之前执行一些测试)。

因此,当功能稳定到可以进行客户测试时,我们将分支 dev 合并到分支 test。一旦获得批准,test 分支将合并到 master.

我的问题是:在某些情况下,我们可以将 4 个不同的分支功能合并到 dev,然后再合并到 test。但是,出于某些原因,测试中的一个功能应该投入生产,而其他 3 个功能应该等待客户验证。

我怎样才能只发送到 prod (合并到 master) 已批准的功能,而将其他 3 个保留在 test 中而不携带合并期间的所有提交?

这看起来像是 git cherry-pick 的标准用例。这是一个命令,可让您将 selected 提交和提交范围应用到不同的分支。由于您说过您确切地知道需要应用哪一组提交,因此它是完成这项工作的完美工具。

从 git 1.7.2 开始,您可以挑选一系列提交。假设需要应用于 master 的功能 4 由 SHA1 12345 到 abc123 的提交表示。那你就做

git checkout master
git cherry-pick 12345^..abc123 

第一个提交必须是较早的。 ^ 处理起始端在范围内是排他的这一事实。有关详细信息,请参阅 。

对于 git 的早期版本,您必须单独处理每个提交:

git checkout master
git cherry-pick 12345
git cherry-pick df998
...
git cherry-pick abc123

如果事实证明您确实需要分解一些提交,请使用 git cherry-pick -n 检查补丁,然后使用 git add -p 从中获取您想要的块,如详细描述 here.

也可以使用git rebase --onto来完成同样的任务。这样做的好处是您可以交互式地进行,即 select 提交,修改他们的消息并比樱桃采摘对内容有更多的控制。上面链接的答案详细解释了如何执行此操作。