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
:其中一个的父链为 D
、C
、B
, ...还有一个 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
"。
我使用 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
:其中一个的父链为 D
、C
、B
, ...还有一个 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
"。