git - Git 拉回旧的特性分支,包括任何其他特性分支,但介于两者之间的分支
问题描述
我有这样的 git 时间线:
- 掌握
- 功能 1 -> 合并(到主控)
- 功能 2 -> 合并(到主控)
- 功能 3 -> 合并(到主控)
所有这些功能都按顺序发生(第一个功能 1。一旦完成,然后是功能 2,依此类推)。
Feature-2 与 Feature-1 “冲突”。冲突不是 git 冲突的意义上的冲突,而是功能方面的冲突。
现在客户决定他们更喜欢 feature-1,所以我们需要把它从死里拉回来。
拥有一个包含 feature-1 + master 中其他任何内容(在本例中为 feature-3)的新分支的最安全和最有效的方法是什么,不包括 feature-2 ?
我想出的另一种选择是:
- git 结帐功能-1
- git checkout -b 耶宝贝
- git 合并功能 3
但是你需要知道所有的分支(在这种情况下很容易,只有 feature-3)。但在实际情况下,你有很多。
已编辑:此外,它不起作用...因为 feature-3 基于 master,它包含在 feature-2 中所做的所有更改(已合并到 master)。
解决方案
没有“最安全的方法”来创建一个新的 git 历史记录,它会遗漏原始历史记录中的一个功能。
最可能的两种可能性是:
- 在 master 上创建一个分支,并
git revert <commit_id>
使用您想要恢复的任何提交(理想情况下以相反的顺序)。这将尽可能好地撤消过去所做的更改。这相对容易,但在过去恢复的提交越远,它就会变得越复杂 - 在 master 上创建一个分支,执行
git rebase interactive <merge1_commit>
并删除所有要删除的提交。这会重放历史记录,您可以在每次 rebase 提交后运行测试以确保每个步骤都有效。但是,这会使历史变平,您可能必须反复修复合并提交。
在 git 之外,您可以考虑为给定功能添加功能切换的可能性,以便所有客户获得相同的代码库,但对于某些客户,将通过配置禁用功能。在某些情况下,这将使 2 个分支的前进变得更加容易。
推荐阅读
- python - 检查多个“大”数据帧中是否存在通用组合
- node.js - 客户端发出时如何测试socket.io服务器
- python - 熊猫没有过滤多列上的数据
- python - VScode - Python 扩展 - 更改默认语言
- javascript - 虚拟 DOM 的 diffing 算法是否能确定唯一的区别并修补真实 DOM?
- html - 在输入元素中使用字体真棒图标
- python-3.x - Python BeautifulSoup - 按id抓取时表不返回
- c - 为什么从 C 打印时 CString 指针值会更改?
- swift - swift中的奇怪语法
- c# - 通过网络反序列化数据包,发送 System.Type 还是更好的方法?