Git 什么';合并长期功能分支和主分支的策略是什么?

Git 什么';合并长期功能分支和主分支的策略是什么?,git,merge,Git,Merge,例如,长期功能分支可能持续两周以上。在此期间,许多其他特性/错误修复分支可能会合并到主分支上 有时,长期特性分支需要这些分支,例如修复了阻塞性致命错误的分支 因此,我尝试每两天将主分支合并到长期功能分支上。最后,我将特征分支合并到主分支上 M1 -> M2 -> M3 -> M4 -> M5 \ \ \ \ / F1 -> F2 -> F3 -> F4 但事实上,我想了解以下历史: M1 -> M2 -> M3 -

例如,长期功能分支可能持续两周以上。在此期间,许多其他特性/错误修复分支可能会合并到主分支上

有时,长期特性分支需要这些分支,例如修复了阻塞性致命错误的分支

因此,我尝试每两天将主分支合并到长期功能分支上。最后,我将特征分支合并到主分支上

M1 -> M2 -> M3 -> M4 -> M5
 \    \     \     \  /
F1 -> F2 -> F3 -> F4
但事实上,我想了解以下历史:

M1 -> M2 -> M3 -> M4 -> M5
 \                   /
F1 -> F2 -> F3 -> F4
因为我可以在还原M5时还原整个分支

我不喜欢
merge--squash特性
,因为有不止一个人涉及该特性分支,我希望保留历史记录

M1 -> M2       -> M3        -> M4    -> M5
 \                                     /
F1 -> M2'-> F2 -> M3' -> F3 -> M4' -> F4
M’表示由‘merge--squash master’生成的提交,但我认为这不好


那么,合并主功能分支和长期功能分支的最佳方法是什么?

您可以在功能分支中重新设置主功能的基础,而不是合并主功能分支中的主功能;当然有一个更新的主控:

git checkout feature
git rebase master
在功能结束时,将其与
--no ff
选项(无快进)合并到master中,以保持分叉:

git checkout master
git merge --no-ff feature
然后你会得到这样的结果:

M1 - M2 - M3             M4 - M5 - M6
            \           /
             F1 - F2 - F3

M4提交将是一个合并提交,如果要删除该功能,您可以恢复该提交。

这些目标相互矛盾-如果重写历史(挤压/重定基址)不是一个选项,那么您必须接受提交历史将代表随时间发生的合并操作的实际顺序。(真正的解决方案是避免有多个贡献者的长期分支…)而不是在master之上合并I-rebase。这样,我的承诺总是在顶部。历史记录在某种程度上得到了保留(至少提交顺序/内容)。@OliverCharlesworth:也许那些多个贡献者可以从功能分支分支并发送PRs:)@OliverCharlesworth一个前端和后端的功能有两个开发人员要一起工作。您可以通过还原M5来还原整个分支。这里有一些警告。请参见
--mainline
选项和引用OP中的。引用:“涉及的人不止一人-我希望历史保持不变”即使有更多的人,历史也将保持不变。我可以添加的是使用设置为保留的rebase进行拉取:
git pull--rebase=preserve
,我认为这是一个非常好的PracticeseBase,根据定义,它肯定不会保留原始历史。我没有说在master中使用rebase功能,但恰恰相反。如果您在功能中重新设置master的基础(如我的代码示例),master将位于功能的底部,并且两个历史记录都将被保留,我保证no-
rebase
将创建新提交并删除旧提交。如果你是唯一一个使用该分支的人,那么这很好,但是如果其他人参与了该分支,则会导致巨大的痛苦。