首页 > 解决方案 > git rebase 一个浮动分支

问题描述

我在这里基于解决方案导入了另一个 repo 作为分支。

现在,新导入的分支是浮动的,它应该按照图像中指定的方式连接。

我应该如何做rebase?

git checkout imported-branch
git rebase ????? --onto ????

git rebase

标签: gitrebase

解决方案


你不能得到你画的东西,因为你画了提交哈希 ID:f8114a例如。鉴于它f8114a被绘制为根提交,这意味着它f8114a始终根提交,在过去、现在和将来也是如此。但在绘图的右侧,f8114a不是根提交:它有一个parentd0ece。因此,您声称这f8114a既是根提交(没有父级)又是常规的日常提交(一个父级,d0ece),这根本不可能。

你也许能得到你想要的。这完全取决于您想要什么。但是,尝试这样做通常是一个坏主意:如果git rebase尝试移植到其中一个分支的提交集中有任何分支和合并操作,那么rebase 本身将不得不重新执行任何一个所涉及的合并,这是破坏东西的秘诀。

现在,请记住,任何提交,无论其哈希 ID 可能是什么,以及它可能具有的父哈希 ID,都代表了该提交中包含的文件的完整且完整的快照。所以提交f8114a 一个快照。由于它没有父级(在左侧),Git 会将其显示为与没有文件的伪提交的比较。1 因此,当被视为一组更改时,f8114a包括添加其所有文件。

如果你把f8114a它复制到一个新的和改进的?commit——我们称它为f9114a,虽然实际的哈希 ID 可能会有所不同,但我们需要有一些东西来称呼它2——它确实有一个父提交,但是,现在git show和其他将副本与其父进行比较的 Git 操作有要比较的快照。所以现在,不是添加所有这些文件,差异可能会说删除大部分文件,并创建这些大多是新的文件,然后更改大量剩余的文件

如果这对您来说没问题,那么很容易在您自己的存储库中发生这种情况,而不会发生在任何人您的存储库进行的任何克隆中。只需git replace--graft选项一起使用。有关详细信息,git replace请参阅文档

一旦您对某些替代品感到满意,您就可以使用无操作git filter-repo(或旧但仍受支持,并包含在 Git 发行版中git filter-branch)来重写从imported-branch. 这将“将替换物固定到位”并允许您丢弃移植物;克隆此过滤存储库将生成过滤存储库的副本,该副本不再使用替换技巧。


1从技术上讲,Git 使用空树来伪造这个伪提交。它将您的提交树与空树进行比较,以生成所有“添加整个文件”差异块。

2如果你愿意,可以称它为 Fred、Barney 或 Wilma;只是不要晚饭。


推荐阅读