如何在git中维护线性历史记录

时间:2016-10-04 15:36:00

标签: git

出于不同的原因,我需要维护一个线性master分支。也就是说,该分支中的提交不能有多个父级。

我们的团队中有多个人,我们希望feature个分支机构一起工作。通常我们在这个feature分支上重新设置我们自己的个人提交,然后在功能准备好时将其合并到我们的devel分支中。我们还依赖于foreign项目(它使用不同的分支,但我们在这里假设它都在一个foreign分支中,它有自己独立的原点)我们经常合并到我们的{{ 1}}分支。

但是,所有这些工作必须最终以线性形式转发到devel分支。我们可以将所有这些更改压缩到master中的单个提交中(使用master),然后将git reset --soft devel合并回master。但是,我们希望尽可能保留我们的提交:

  • 应保留每个提交消息(包括合并消息)
  • 必须保留提交之间的拓扑顺序
  • 承认来自devel分支的合并必须被压缩为单个'合并'提交(不幸的是没有父信息)
  • 分支foreignmasterdevelfeature必须保持完美向前兼容(因为这是一个共享存储库)

我最初的想法是:

  1. foreign
  2. 创建staging分支
  3. devel
  4. 上的staging
  5. 将新master合并为staging
  6. 但这并没有成功,因为:

    • devel分支,是从它的起源重新定位而不是被压扁
    • 我必须再次处理来自foreign的所有冲突,而我们在devel本身的许多合并过程中已经处理过这些冲突

    所以我打算做以下事情:

    devel最新提交的div不在devel(最近的分歧点)。如果master包含未合并到master的新提交,则中止。也就是说,如果在devel之后master中有新的提交,则必须在此之前手动合并到div

    对于从develdiv的每个提交(按拓扑顺序),执行devel并将更改提交到git reset --soft(使用相同的提交消息)。这意味着:

    • 提交不在master之后,但在div被压扁之前提交:这些提交要么从devel合并(在这种情况下我们很高兴),要么从foreign合并(在这种情况下,实际提交已经在master中)
    • 之间的提交被一个接一个地正确地推入master,除了master的并行分支,这看起来像每次都撤消另一方(这很难看,但可能是不可避免的)

    最后,我将devel合并回master,此合并提交将成为下次devel

    我希望尽量减少'撤消'重做'我会在选定的拓扑顺序中添加以下限制:div中只有一个父级的提交将具有与devel中的父级相同的提交。

    总而言之,这似乎过于复杂。是否有内置方法使线性分支遵循非线性分支?否则,我的策略会有效还是我错过了非常重要的细节?

1 个答案:

答案 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命令。这允许您在当前分支之上创建单个提交,其效果与合并另一个分支相同(或者在章鱼的情况下更多)。