我的项目中有以下情况
Master M1----M2----M3----M4----M5
\
Beta B1----B2----B3---B4
\
Feature F1---F2---F3
我正在Feature
开发,但是在提交M5
上发布了一个非常重要的更新,我不想从Feature
B3
分离Feature
1}}取决于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
上应用的更改),我该怎么办?这是我想要的状态......
答案 0 :(得分:3)
您是对的:在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之后,即{{1} }。
实际上并没有修复任何东西......但它释放了其他参数,即 B4'
的那个参数,以及其他东西。
你想要的是告诉Git从哪里开始标记提交为红色。这是Beta
,或者如果更容易,B3
。这将标记B4
及其所有早期提交(包括B3
及更早版本)为红色:不要复制。
如果保存,您可以使用M3
的原始ID。或者您可以轻松让Git使用B3
查找Beta
的上一个提示:
Beta@{1}
使用git rebase --onto Beta Beta@{1}
的reflog查找提交B4
的哈希ID。
答案 1 :(得分:1)
实际上最终会出现类似这样的事情:
Master M1----M2----M3----M4----M5
\ \
\ Beta B1----B2----B3---B4
\
\--B1'---B2'---B3'----F1---F2---F3
^
feature
基本上,Beta
的rebase将在当前的master提示之上重新应用Beta上的提交。但是,原始提交仍然存在,如果还有其他任何内容,例如另一个分支,指的是这些提交,它们仍将存在。
您需要首先重新定位Beta
,然后重新定位feature
,以便将所有内容“移动到正确的位置”。