Rebase 后将一个分支的根更改为另一个分支

Change Root of a Branch to another Branch after Rebase

我使用 Git 进行版本控制,我正在尝试完成一些我不确定是否容易实现的事情。我有一个功能分支 feature1.1,其中有一些提交。我还有一个分支似乎是该功能的最后一次提交 feature1.2。这是因为 feature1.2 依赖于 feature1.1 但不一定需要或想要在同一分支上。

目前,当我变基 feature1.1 时,我最终不得不挑选 feature1.2 到我变基 feature1.1.

后创建的新分支中

有更好的方法吗?

基本上,我想要这个

                F feature1.2
               /
      C---D---E feature1.1
     /
A---B---G---H---I---J---K master

变成这样

                                      F' feature1.2
                                     /
                          C'---D'---E' feature1.1
                         /
A---B---G---H---I---J---K master

分支没有根。

好吧,这有点言过其实了。 feature1.1 的根是提交 A。所以更准确地说分支没有有用

分支 ,是指向一个特定提交的指针:feature1.1 指向您标记为 E 的提交,其哈希取决于它的内容和历史一直追溯到根。这意味着您有两个 不同的 提交,您都标记了 E:其中一个的父链为 DCB, ...还有一个 D, C, K, ...

git rebase 所做的是 复制 提交到具有不同父哈希 ID(通常也有不同的基本源代码树)的新提交。新提交与旧提交非常相似,但并不相同。所以你需要给他们新的名字,比如C'-D'-E'

旧提交会在您的存储库中保留一段时间(默认情况下至少 30 天)。当您将 C-D-E 复制到新链时,不会影响原始 F.

现在您需要将 F 复制到 F'。如果你天真地这样做,可能会出现问题,with git checkout feature1.2; git rebase feature1.1: Git 不知道它 shouldn't copy C-D-E 了。它可以在新 feature1.1 上看到 C'-D'-E',但它并不知道这些来自 C-D-E。如果提交闻起来足够相似,1 rebase 会注意到它已经拥有它们,并跳过复制它们。但是,如果它们在第一次变基期间发生了足够大的变化,它会再次 .

复制它们

要防止 Git 甚至 查找 原始 C-D-E 链,您需要 git rebase --onto。或者,您可以使用交互式变基:此处 Git 为您提供了一个包含要复制的建议提交集的文件,您可以手动删除已复制的那些。

请记住,任何拥有您的原始提交副本(具有与您的原始副本相同的哈希 ID)的人都将保留他们的副本。他们也必须安排开始使用 new 副本来代替旧副本。如果您是唯一拥有这些功能分支的人,或者如果您的所有协作者都准备好处理这些变基,那么您就可以开始了。否则,您可能会制造比他们所能承受的更多的痛苦。


1实际上,这意味着"if they have the same git patch-id"。