如何解决合并策略与我们的 Git 工作流程的冲突
How to address Merge Strategy Conflicts with our Git Workflow
我在这里看到了很多类似的问题,但是none回答了我们的具体问题。我的问题实际上是关于合并策略,但我必须先描述我们的 git 流程。
我已经为理想的 Git 工作流程做了很多阅读最佳实践,但我发现没有任何东西完全适合我们的需求。所以我们可能使用了不理想的方法。
流程如下:
我们有一个 master 分支,与生产环境保持一致。我们有一个 releasable 分支来在预生产环境中使用真实数据测试发布包。我们有一个 stable 分支用于在稳定环境中进行测试。当我们开始开发新功能时,我们会从 master 创建一个 feature 分支。功能完成后,我们通过 pull pequest 将其合并到 stable。这是问题所在;许多功能要么在测试完成后被取消,要么必须等待未来的发布,所以我们必须从 master 分支出来,因为我们不希望这些功能出现在我们的新分支。因此,我们也无法将 stable 与 releasable 合并。因此,如果该功能已准备就绪,我们将通过另一个拉取请求将 feature 分支合并到 releasable。现在,由于合并提交,stable 和 releasable 之间存在不同的提交。包准备好部署后,我们将 releasable 与 master 合并。我的问题来了;当我们从 master 创建一个新的 feature 分支以开始处理新功能时,它的提交历史与 略有不同稳定。由于这种差异,有时所有文件更改都会显示在 feature 分支和 stable 之间的差异中,即使它们的内容相同。
我们正在使用 Bitbucket。我考虑过在拉取请求中使用 -ff 而不是 --no--ff,但我也不想丢失合并提交。我也考虑过在 Bitbucket 中使用 Rebase, merge (rebase + merge --no-ff) merge 策略,但我不确定它会解决我们没有干净的 pull request 的问题.
总而言之,我需要对 stable 进行干净的拉取请求,仅包含在 feature 分支中完成的更改,而无需牺牲太多了。
如有任何帮助,我们将不胜感激。
没有一种放之四海而皆准的方法 Git 分支策略,但有一些概括可以涵盖大多数情况。他们往往属于以下类别之一:
- 单个长期共享分支(通常是
main
或 master
)。这可以进一步细分为 2 个子类别:A.) 基于主干的开发 (TBD),其中开发人员都在 main
的本地副本上工作,B.) 开发人员从 main
分支出来,他们的拥有个人分支并合并回 main
。即使这有很多选项,例如变基然后快进合并,或变基和 --no-ff
,或根本不变基,或 with/without 拉取请求等,但总体包含的想法是一个共享每个人都工作的分支。这在 CI/CD 类型的交付中很受欢迎。
- 至少一个长期共享分支,以及一些短期 throwaway 集成分支。这就是 Git 的维护者使用的,它被称为“Gitworkflows”。 这是我要为您推荐的类别;下面有更多详细信息。
- 单独的长期共享分支,用于在当前待定版本以及待定版本之后的下一个未来版本上同时开发。此类别是类似于“Git Flow”的策略风格。
- 其他三个的一些组合。
请注意,您的问题与 this one, and the answer there 非常相似,这几乎是我在您的情况下推荐的问题,但有一些调整。主要区别在于,在您的情况下,您有 2 个长期存在的分支(master
和 releasable
),并且您可能会受益于使 stable
分支成为您重置的一次性分支到 master
每隔一段时间。 (如果您希望与 Git 工作流程更紧密地对齐,您也可以将 stable
重命名为 next
。)我发现 1 或 2 周的重置频率通常对 next
支线。重置的次数越多越好,因为它更类似于合并到 master
时发生的情况。但是您不希望它经常让尚未完成测试的开发人员感到不安,然后不得不重新合并到 next
以在重置后继续测试。 一个可能解决您当前问题的重置频率是在您将 releasable
合并到 master
后立即将 stable
重置为 master
。
旁注:在我的公司,我们根据项目在同一个回购协议中使用所有 3 类策略(因此我们属于第 4 类)。对于我们的 Git Flow 项目,我们还利用 next
作为沙盒开发环境中的“预测试”,以便在合并到 develop
之前可以实现良好的集成水平。我们每周为该项目重置一次 next
。
我在这里看到了很多类似的问题,但是none回答了我们的具体问题。我的问题实际上是关于合并策略,但我必须先描述我们的 git 流程。 我已经为理想的 Git 工作流程做了很多阅读最佳实践,但我发现没有任何东西完全适合我们的需求。所以我们可能使用了不理想的方法。
流程如下:
我们有一个 master 分支,与生产环境保持一致。我们有一个 releasable 分支来在预生产环境中使用真实数据测试发布包。我们有一个 stable 分支用于在稳定环境中进行测试。当我们开始开发新功能时,我们会从 master 创建一个 feature 分支。功能完成后,我们通过 pull pequest 将其合并到 stable。这是问题所在;许多功能要么在测试完成后被取消,要么必须等待未来的发布,所以我们必须从 master 分支出来,因为我们不希望这些功能出现在我们的新分支。因此,我们也无法将 stable 与 releasable 合并。因此,如果该功能已准备就绪,我们将通过另一个拉取请求将 feature 分支合并到 releasable。现在,由于合并提交,stable 和 releasable 之间存在不同的提交。包准备好部署后,我们将 releasable 与 master 合并。我的问题来了;当我们从 master 创建一个新的 feature 分支以开始处理新功能时,它的提交历史与 略有不同稳定。由于这种差异,有时所有文件更改都会显示在 feature 分支和 stable 之间的差异中,即使它们的内容相同。
我们正在使用 Bitbucket。我考虑过在拉取请求中使用 -ff 而不是 --no--ff,但我也不想丢失合并提交。我也考虑过在 Bitbucket 中使用 Rebase, merge (rebase + merge --no-ff) merge 策略,但我不确定它会解决我们没有干净的 pull request 的问题.
总而言之,我需要对 stable 进行干净的拉取请求,仅包含在 feature 分支中完成的更改,而无需牺牲太多了。
如有任何帮助,我们将不胜感激。
没有一种放之四海而皆准的方法 Git 分支策略,但有一些概括可以涵盖大多数情况。他们往往属于以下类别之一:
- 单个长期共享分支(通常是
main
或master
)。这可以进一步细分为 2 个子类别:A.) 基于主干的开发 (TBD),其中开发人员都在main
的本地副本上工作,B.) 开发人员从main
分支出来,他们的拥有个人分支并合并回main
。即使这有很多选项,例如变基然后快进合并,或变基和--no-ff
,或根本不变基,或 with/without 拉取请求等,但总体包含的想法是一个共享每个人都工作的分支。这在 CI/CD 类型的交付中很受欢迎。 - 至少一个长期共享分支,以及一些短期 throwaway 集成分支。这就是 Git 的维护者使用的,它被称为“Gitworkflows”。 这是我要为您推荐的类别;下面有更多详细信息。
- 单独的长期共享分支,用于在当前待定版本以及待定版本之后的下一个未来版本上同时开发。此类别是类似于“Git Flow”的策略风格。
- 其他三个的一些组合。
请注意,您的问题与 this one, and the answer there 非常相似,这几乎是我在您的情况下推荐的问题,但有一些调整。主要区别在于,在您的情况下,您有 2 个长期存在的分支(master
和 releasable
),并且您可能会受益于使 stable
分支成为您重置的一次性分支到 master
每隔一段时间。 (如果您希望与 Git 工作流程更紧密地对齐,您也可以将 stable
重命名为 next
。)我发现 1 或 2 周的重置频率通常对 next
支线。重置的次数越多越好,因为它更类似于合并到 master
时发生的情况。但是您不希望它经常让尚未完成测试的开发人员感到不安,然后不得不重新合并到 next
以在重置后继续测试。 一个可能解决您当前问题的重置频率是在您将 releasable
合并到 master
后立即将 stable
重置为 master
。
旁注:在我的公司,我们根据项目在同一个回购协议中使用所有 3 类策略(因此我们属于第 4 类)。对于我们的 Git Flow 项目,我们还利用 next
作为沙盒开发环境中的“预测试”,以便在合并到 develop
之前可以实现良好的集成水平。我们每周为该项目重置一次 next
。