【发布时间】:2016-10-04 15:36:00
【问题描述】:
由于不同的原因,我需要维护一个线性的master 分支。也就是说,该分支中的提交不能有多个父级。
我们的团队中有多个人,我们希望创建feature 分支来一起工作。通常我们在这个feature 分支上重新定义我们自己的个人提交,然后在功能准备好时将它合并到我们的devel 分支中。我们还依赖于一个foreign 项目(它使用不同的分支,但我们在这里假设它都在一个具有自己独立起源的foreign 分支中),我们定期合并到我们的devel 分支中。
但是,所有这些工作最终都必须以线性形式转发到master 分支。我们可以将所有这些更改压缩到 master 中的单个提交中(使用 git reset --soft devel),然后将 master 合并回 devel。但是,我们希望尽可能地保留我们的提交:
- 应保留每条提交消息(包括合并消息)
- 必须保留提交之间的拓扑顺序
- 从
foreign分支合并的提交必须被压缩为单个“合并”提交(遗憾的是没有父信息) - 分支
master、devel、feature、foreign必须保持完美前向兼容(因为这是一个共享存储库)
我最初的想法是:
- 从
devel创建一个staging分支 - 在
master之上重新设置staging - 将新的
staging合并回devel。
但这并没有成功,因为:
-
foreign分支已从其原点重新定位,而不是被压扁 - 我不得不再次处理来自
devel的所有冲突,而它们已经在devel本身的许多合并过程中得到处理
所以我打算做以下事情:
我们称div 是devel 的最新提交,而不是master(最新的分歧点)。如果master 有未合并到devel 的新提交,则中止。也就是说,如果master 在div 之后有新的提交,则必须在此之前将它们手动合并到devel。
对于从div 到devel(按拓扑顺序)的每个提交,执行git reset --soft 并将更改提交到master(使用相同的提交消息)。这意味着:
- 不在
div之后但在devel之前的提交被压扁:那些要么从foreign合并(在这种情况下我们很高兴),要么从master合并(在这种情况下,实际提交是已经在主人身上) - 介于两者之间的提交会一个接一个地正确推送到
master,除了devel的并行分支,这看起来就像每次都撤消另一侧的提交(这很丑陋,但可能是不可避免的)李>
最后,我将master 合并回devel,这个合并提交将成为下次的div。
由于我想最小化“撤消”/“重做”的数量,我将在所选拓扑顺序中添加以下限制:devel 中只有一个父级的提交将具有与父级相同的提交master.
总而言之,这似乎过于复杂。是否有一种内置方法可以让线性分支跟随非线性分支?否则,我的策略会奏效还是我错过了真正重要的细节?
【问题讨论】:
-
考虑到 squash-commits 和 rebase 的风险性质,听起来使用功能分支并不是您团队的解决方案。您可能希望直接提交给 master(当然,不如功能分支理想,但实现了您想要的线性历史,并且丢失提交的风险更小)。
-
我不认为你可以维护master和开发分支来实现这个目标。您最好的选择似乎是放弃开发,从 master 分支功能,然后在合并到 master 之前重新设置功能分支。如果您想在合并到 master 之前“组装”功能分支,您可以使用一次性集成分支并尝试利用 rerere 来避免在合并到 master 时重做合并冲突
-
foreign分支呢?我不能变基(它不在我的控制之下)。
标签: git