首页 > 解决方案 > Git 拉回旧的特性分支,包括任何其他特性分支,但介于两者之间的分支

问题描述

我有这样的 git 时间线:

  1. 掌握
  2. 功能 1 -> 合并(到主控)
  3. 功能 2 -> 合并(到主控)
  4. 功能 3 -> 合并(到主控)

所有这些功能都按顺序发生(第一个功能 1。一旦完成,然后是功能 2,依此类推)。

Feature-2 与 Feature-1 “冲突”。冲突不是 git 冲突的意义上的冲突,而是功能方面的冲突。

在此处输入图像描述

现在客户决定他们更喜欢 feature-1,所以我们需要把它从死里拉回来。

拥有一个包含 feature-1 + master 中其他任何内容(在本例中为 feature-3)的新分支的最安全和最有效的方法是什么,不包括 feature-2 ?

我想出的另一种选择是:

  1. git 结帐功能-1
  2. git checkout -b 耶宝贝
  3. git 合并功能 3

但是你需要知道所有的分支(在这种情况下很容易,只有 feature-3)。但在实际情况下,你有很多。

已编辑:此外,它不起作用...因为 feature-3 基于 master,它包含在 feature-2 中所做的所有更改(已合并到 master)。

标签: git

解决方案


没有“最安全的方法”来创建一个新的 git 历史记录,它会遗漏原始历史记录中的一个功能。

最可能的两种可能性是:

  • 在 master 上创建一个分支,并git revert <commit_id>使用您想要恢复的任何提交(理想情况下以相反的顺序)。这将尽可能好地撤消过去所做的更改。这相对容易,但在过去恢复的提交越远,它就会变得越复杂
  • 在 master 上创建一个分支,执行git rebase interactive <merge1_commit>并删除所有要删除的提交。这会重放历史记录,您可以在每次 rebase 提交后运行测试以确保每个步骤都有效。但是,这会使历史变平,您可能必须反复修复合并提交。

在 git 之外,您可以考虑为给定功能添加功能切换的可能性,以便所有客户获得相同的代码库,但对于某些客户,将通过配置禁用功能。在某些情况下,这将使 2 个分支的前进变得更加容易。


推荐阅读