【问题标题】:How to maintain a linear history in git如何在 git 中保持线性历史
【发布时间】:2016-10-04 15:36:00
【问题描述】:

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

我们的团队中有多个人,我们希望创建feature 分支来一起工作。通常我们在这个feature 分支上重新定义我们自己的个人提交,然后在功能准备好时将它合并到我们的devel 分支中。我们还依赖于一个foreign 项目(它使用不同的分支,但我们在这里假设它都在一个具有自己独立起源的foreign 分支中),我们定期合并到我们的devel 分支中。

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

  • 应保留每条提交消息(包括合并消息)
  • 必须保留提交之间的拓扑顺序
  • foreign 分支合并的提交必须被压缩为单个“合并”提交(遗憾的是没有父信息)
  • 分支masterdevelfeatureforeign 必须保持完美前向兼容(因为这是一个共享存储库)

我最初的想法是:

  1. devel 创建一个staging 分支
  2. master 之上重新设置staging
  3. 将新的staging 合并回devel

但这并没有成功,因为:

  • foreign 分支已从其原点重新定位,而不是被压扁
  • 我不得不再次处理来自devel 的所有冲突,而它们已经在devel 本身的许多合并过程中得到处理

所以我打算做以下事情:

我们称divdevel 的最新提交,而不是master(最新的分歧点)。如果master 有未合并到devel 的新提交,则中止。也就是说,如果masterdiv 之后有新的提交,则必须在此之前将它们手动合并到devel

对于从divdevel(按拓扑顺序)的每个提交,执行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


【解决方案1】:

@jamey's comment 中所述,最好删除develop 分支,将功能分支从master 中分离出来,并在合并到master 之前进行rebase。完成功能分支后,您可以:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-14
    • 2019-12-11
    • 1970-01-01
    • 2013-01-20
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    相关资源
    最近更新 更多