【问题标题】:Git flow - get rid of a particular featureGit 流程 - 摆脱特定功能
【发布时间】:2015-05-13 09:07:43
【问题描述】:

我目前正在尝试在我的团队中建立一个开发流程并阅读有关 GitFlow 的信息。看起来很有趣,但我可以发现一些问题。

让我们假设以下场景:

我们完成了功能F1F2F3,并将它们合并到develop 分支中。基于此,我们创建了一个release 分支。

如果我们想摆脱功能F3,我们该怎么办?

看看这张图片以获得更好的想法。

【问题讨论】:

  • 什么会导致您从版本中删除功能?理论上,当它进入develop 时,它已经过测试并准备就绪(基本上是库存)。
  • @R0MANARMY 在我看来,可能有很多原因。客户拒绝为该功能付费,他们不希望在该版本或类似版本中使用它。
  • 我认为没有一个好的通用的、纯粹的 git 解决方案。在您的示例中,假设您想删除功能 1,并且作为该功能的一部分,您引入了功能 2 所依赖的重构。如果特性是真正独立的,那么答案就是在客户签署发布之前不要将它们合并到 devel 分支中。

标签: git branch release git-flow


【解决方案1】:

这确实是 git-flow 的一个弱点。在我看来,有多种方法可以解决这个问题,其中没有一种是完美的。


功能恢复

一种方法是简单地revert F3 中的 merge 提交。

git checkout <release-branch>
git revert --mainline 1 <hash-of-f3-merge-commit>

--mainline 1 (short -m 1) 告诉 git 恢复合并提交相对于它的 first 父级的更改,这是合并更改的分支。在我们的例子中这将是develop

另一方面,当您将release 分支合并回develop 时,这会导致问题,因为这也会合并还原。您可能必须重新合并该功能 (F3) 到 develop

替代发行版

这种方法将您的发布分支基于master 的最新状态,而不是develop

git checkout -b master <release-branch>

从这里开始,您可以cherry-pick 要包含在版本中的每个功能。再次使用--mainline 选项。

git cherry-pick --mainline 1 <hash-of-f1-merge-commit>
git cherry-pick --mainline 1 <hash-of-f2-merge-commit>

或者,您可以将功能分支 merge 放入发布分支,而不是 cherry-picking 他们,这将导致相同的结果,但历史会更加混乱(这可以通过使用 --squash 选项后跟git commit,但你实际上已经完成了cherry-pick)。

git merge F1
git merge F2

如果每个版本只包含一小部分已开发的功能,替代发布基础方法还不错,但如果您想发布大量功能,则很难使用。


我个人更喜欢后一种方法,因为它可以在没有 reverts 和重复的 merge 提交的情况下生成更清晰的历史记录。

【讨论】:

  • 感谢 Zeeker,是的,我也认为替代版本可能是更好的选择。至少更干净。你认为除了 gitflow 之外还有其他不同的工作流程可能使用额外的 predevelop 分支吗?或者通过合并回master来使用短开发分支而不是长分支?
  • @Rober 遗憾的是,我不知道有任何其他工作流程可以更好地处理这种情况。而且我不确定predevelop 分支是什么意思。您必须记住,git-flow 不是在 git 中做事的唯一真正的方式,它是一个强大而灵活的工作流程,但没有什么可以阻止您进行修改你认为合适的。
猜你喜欢
  • 1970-01-01
  • 2010-09-27
  • 2015-09-29
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
  • 2020-04-08
  • 2010-12-10
相关资源
最近更新 更多