git - 重新父级 git commit 以拥有两个父级, merge 多个分支,并保留 future 的 merge 历史

标签 git git-rebase

不久前,我为一个项目创建了一个私有(private) git 存储库,并开发了一种为每个主要版本发布创建维护分支的模式。

在项目中几个月后,我现在有许多旧版本的分支,这些分支不再受到任何形式的支持。我已经意识到这是一种处理问题的凌乱方式。作为一个更整洁的替代方案,我想维护一个开发分支和一个发布分支,而不是单个版本的标签。

理想情况下,我想将当前存储库转换为这种新格式。我想在发布提交和 master 上提交之间的关系方面尽可能多地保留提交历史,但我想将所有发布分支转换为一个单独的发布分支。

desired repository layout - before and after

该存储库仅供我使用,因此我可以使用 git rebase --onto 轻松地将一个分支的内容粘贴到另一个分支的末尾。 -- 我不关心在这里保留确切的提交哈希。

我关心的是保留与主分支的 merge 历史。我想重新创建每个分支的根提交,以便基于前一个分支的提示以及它最初从 master 分支的提交 - 将其转换为 merge 提交。

然后我想保留 master 和那个分支之间的一些其他 merge ,这些 merge 发生在链的更上游。

我尝试了一些类似 git rebase --onto branchB-divergence...branchA-tip branchB 的方法(以及几个变体,包括尝试 -m 和 -i,同时浏览文档)

结果要么是意外地在 master 上复制了很多提交,并丢失了 merge 历史记录,要么不断出现需要解决的 merge 冲突。

我想要实现的目标甚至可能实现吗?我将遵循什么样的程序来重新设置这样的一系列提交?

最佳答案

不要那样做。为什么不创建一个 --orphan 'LifeSupport' 的分支,它只是一个最后的安息之地,然后将每个死分支 merge 到它上面( merge 策略 --ours),然后为每个最后的生命支持提交添加一个标签,并使用相应的版本号.这样你就可以删除旧的分支引用,并且仍然能够恢复到它们的旧版本。

或者使用 graftsreplace (Are grafts deprecated?)将旧的分支系列加入您指定的链中。然后可以通过 filter-branch 将它们卡住。 .

关于git - 重新父级 git commit 以拥有两个父级, merge 多个分支,并保留 future 的 merge 历史,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16916550/

相关文章:

php - 使用 git 和 submodule,什么是好的文件夹结构?

git - 如何打开文件并将光标移动到第一行的末尾?

带有 https 错误的 git 克隆 - 致命 : repository not found

git - git-rebase 如何识别 "aliased"提交?

git - 从巨大的 Git 存储库中删除历史记录

git - 更聪明的 rebase 避免冗余工作?

git - 仅获取远程 git 分支的子集或仅在 gitk 中显示其中的子集

git - 尝试创建 git 存储库并向其提交文件,但没有成功

git - 从中间删除 git merges

git - 除了生成的 git 树结构之外,git pull 与 git fetch + git rebase 之间还有什么重要区别吗?