Git rebase和子分支

Git rebase和子分支,git,branch,rebase,Git,Branch,Rebase,关于我的项目,我有以下情况 Master M1----M2----M3----M4----M5 \ Beta B1----B2----B3---B4 \ Feature F1---F2---F3 我正在开发Feature,但是在提交M5时发布了一个非常重要的更新,我不想将Feature从B3中分

关于我的项目,我有以下情况

Master M1----M2----M3----M4----M5
                     \
                 Beta B1----B2----B3---B4
                                   \
                          Feature   F1---F2---F3
我正在开发
Feature
,但是在提交
M5
时发布了一个非常重要的更新,我不想将
Feature
B3
中分离出来(
Feature
取决于
B1
B2
),并且
Beta
可以进行更改(与
Beta
没有区别)

如果我在
Beta
上创建一个
git-rebase-Master
,它只会移动
Beta
分支,对不对(在
功能上未应用任何更改)?或者它最终会变成这样(下面-更改也应用于
功能


而且,要做到这一点(应用于
功能的更改
),我应该怎么做?这是我想要的状态…

实际上,它会以如下方式结束:

Master M1----M2----M3----M4----M5
                    \            \
                     \       Beta B1----B2----B3---B4
                      \
                       \--B1'---B2'---B3'----F1---F2---F3
                                                       ^
                                                    feature
基本上,
Beta
的重基将在当前主提示的基础上重新应用Beta上的提交。但是,原始提交仍将存在,如果其他任何东西(如另一个分支)引用这些提交,它们将仍然存在


您需要先重新设置
Beta
的基础,然后重新设置
feature
的基础,以便将所有内容“移动到正确的位置”。

您是正确的:在
Beta
上运行
git-rebase-Master
不会影响
功能。(旁白:为什么是大写字母?)

这里的基本问题是,
git-rebase
“意味着“复制一些提交”。诀窍在于查看哪些提交被复制,复制到哪里,以及之后分支名称会发生什么变化。如果复制的提交也可以从其他分支访问,则复制前的原始提交仍然可以从该其他分支访问

请记住,所有分支名称都只是指针,指向分支上最近的提交。所有早期父级提交都在该分支上,即使这些早期提交也在其他分支上。因此,“所有
Beta
提交”最初包括
M1
M3

那么,第一个
git-rebase
如何知道只复制
B1
B2
B3
B4
?我认为一个关键的问题是绘制一个稍微不同的图表:

M1----M2----M3----M4----M5   <-- Master
              \
               B1----B2----B3---B4   <-- Beta
                            \
                             F1---F2---F3   <-- Feature
所以对于
Beta版
,这一切都很好,但现在您希望复制
功能
的提交。如果你:

git checkout Feature
git rebase Beta
Git将把
F3
涂成绿色,然后将
F2
F1
。。。但是,接着将
B3
标记回
B1
绿色。只有副本和五个
M
committes会被红色覆盖。所以Git将复制太多的提交

解决方案是使用
git-rebase--on
。将
--to
添加到
告诉Git将副本放在何处:您希望它们放在
B4'
之后,因此您可以说
--to Beta
表示副本放在Beta之后,即
B4'

这实际上并不能解决任何问题。。。然而但它释放了另一个论点,一个是
Beta
,是,嗯,另一个论点

您想要的是告诉Git从哪里开始标记红色。这是
B3
,或者如果更容易的话,
B4
。将
B3
及其所有早期提交(包括
M3
和早期提交)标记为红色:不复制

如果保存,可以使用原始ID
B3
。或者,您可以让Git使用
Beta@{1}
轻松查找前面的
Beta
提示:

git rebase --onto Beta Beta@{1}

这将使用reflog for
Beta
查找commit
B4
的哈希ID。对,
Beta
上的操作不会影响
功能。2.直接在
功能
分支中重新设置基础。
git checkout Feature
git rebase Beta
git rebase --onto Beta Beta@{1}