我的项目有以下情况
Master M1----M2----M3----M4----M5
\
Beta B1----B2----B3---B4
\
Feature F1---F2---F3
我正在
Feature
中进行开发,但是在提交M5
时发布了一个非常重要的更新,并且我不想将Feature
与B3
分开(Feature
取决于B1
和B2
),并且Beta
可以进行更改(Beta
没有区别)。如果我在
git rebase Master
上创建一个Beta
,它只会移动Beta
分支,对(对Feature
没有应用任何更改)吗?还是最终会变成这样(下面-更改也应用于Feature
)?Master M1----M2----M3----M4----M5
\
Beta B1----B2----B3---B4
\
Feature F1---F2---F3
而且,要这样(对
Feature
进行更改),我该怎么办?那是我想要的状态... 最佳答案
您是正确的:在git rebase Master
上运行Beta
不会影响Feature
。 (除了:为什么要大写字母?)
这里的根本问题是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
要查看将要复制的内容,请在分支的最前面提交处使用绿色荧光笔突出显示,即B4
所指向的Beta
,并在您沿着左侧的行将所有提交变为绿色。这包括提交M3
和更早的版本。然后,在Master
(即M5)的尖端提交处使用红色荧光笔,并按照左侧的行将所有提交都着色为红色。红色覆盖绿色,因此不考虑将M3
及更早版本进行复制。这样就完全保留了要复制的正确提交集。在论点的最短提交之后,副本本身就着陆了。那是
Master
,因此副本位于M5
之后。在Git复制之后,Git将名称
Beta
指向B4
的副本,我们将其称为B4'
。剩下的原始Bn
提交悬而未决...除了B3
可从F1
到达: B1'---B2'---B3'--B4' <-- Beta
/
M1----M2----M3----M4----M5 <-- Master
\
B1----B2----B3---B4 [no name]
\
F1---F2---F3 <-- Feature
因此,对于Beta
来说一切都很好,但是现在您想复制Feature
的提交。如果你:git checkout Feature
git rebase Beta
Git会将F3
涂成绿色,然后将F2
和F1
涂成颜色……但是接着继续通过B3
将绿色标记成B1
。只有副本和五个M
提交被红色覆盖。因此,Git将复制过多的提交。解决方案是使用
git rebase --onto <name>
。添加--onto
会告诉Git将副本放置在何处:您希望它们位于B4'
之后,因此您可以说--onto Beta
表示副本位于Beta之后,即B4'
。这实际上并没有解决任何问题……。但是,它释放了另一个参数
Beta
,可以说是其他东西。您想要的是告诉Git从哪里开始标记会提交红色。那是
B3
,或者如果更简单,那就是B4
。这会将B3
及其所有较早的提交(包括M3
和更早的提交)标记为红色:请勿复制。如果保存,则可以使用
B3
的原始ID。或者,您可以使用Beta
轻松让Git查找Beta@{1}
的上一个技巧:git rebase --onto Beta Beta@{1}
这将使用B4
的引用日志来查找commit Beta
的哈希ID。关于git rebase和子分支,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45153926/