出于不同的原因,我需要维护一个线性master
分支。也就是说,该分支中的提交不能有多个父级。
我们的团队中有多个人,我们希望feature
个分支机构一起工作。通常我们在这个feature
分支上重新设置我们自己的个人提交,然后在功能准备好时将其合并到我们的devel
分支中。我们还依赖于foreign
项目(它使用不同的分支,但我们在这里假设它都在一个foreign
分支中,它有自己独立的原点)我们经常合并到我们的{{ 1}}分支。
但是,所有这些工作必须最终以线性形式转发到devel
分支。我们可以将所有这些更改压缩到master
中的单个提交中(使用master
),然后将git reset --soft devel
合并回master
。但是,我们希望尽可能保留我们的提交:
devel
分支的合并必须被压缩为单个'合并'提交(不幸的是没有父信息)foreign
,master
,devel
,feature
必须保持完美向前兼容(因为这是一个共享存储库)我最初的想法是:
foreign
staging
分支
devel
staging
master
合并为staging
。但这并没有成功,因为:
devel
分支,是从它的起源重新定位而不是被压扁foreign
的所有冲突,而我们在devel
本身的许多合并过程中已经处理过这些冲突所以我打算做以下事情:
让devel
最新提交的div
不在devel
(最近的分歧点)。如果master
包含未合并到master
的新提交,则中止。也就是说,如果在devel
之后master
中有新的提交,则必须在此之前手动合并到div
。
对于从devel
到div
的每个提交(按拓扑顺序),执行devel
并将更改提交到git reset --soft
(使用相同的提交消息)。这意味着:
master
之后,但在div
被压扁之前提交:这些提交要么从devel
合并(在这种情况下我们很高兴),要么从foreign
合并(在这种情况下,实际提交已经在master中)master
,除了master
的并行分支,这看起来像每次都撤消另一方(这很难看,但可能是不可避免的)最后,我将devel
合并回master
,此合并提交将成为下次devel
。
我希望尽量减少'撤消'重做'我会在选定的拓扑顺序中添加以下限制:div
中只有一个父级的提交将具有与devel
中的父级相同的提交。
总而言之,这似乎过于复杂。是否有内置方法使线性分支遵循非线性分支?否则,我的策略会有效还是我错过了非常重要的细节?
答案 0 :(得分:1)
正如@jamey's comment中所述,最好放弃develop
分支,从master
拆分功能分支,然后在合并到master
之前进行重新分支。完成功能分支后,您可以执行以下操作:
git rebase master myfeature
git checkout master
git merge --ff-only myfeature
如果需要合并foreign
分支中的更改,请执行以下操作:
git merge --squash foreign
git commit
来自git merge
的手册页:
--squash
生成工作树和索引状态,就好像发生了真正的合并(合并信息除外),但实际上没有提交,移动
HEAD
或记录$GIT_DIR/MERGE_HEAD
(导致用于创建合并提交的下一个git commit
命令。这允许您在当前分支之上创建单个提交,其效果与合并另一个分支相同(或者在章鱼的情况下更多)。