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
和早期提交)标记为红色:不复制
如果保存,可以使用原始IDB3
。或者,您可以让Git使用Beta@{1}
轻松查找前面的Beta
提示:
git rebase --onto Beta Beta@{1}
这将使用reflog forBeta
查找commitB4
的哈希ID。对,Beta
上的操作不会影响功能。2.直接在功能
分支中重新设置基础。
git checkout Feature
git rebase Beta
git rebase --onto Beta Beta@{1}