我的项目有以下情况

Master M1----M2----M3----M4----M5
                     \
                 Beta B1----B2----B3---B4
                                   \
                          Feature   F1---F2---F3

我正在Feature中进行开发,但是在提交M5时发布了一个非常重要的更新,并且我不想将FeatureB3分开(Feature取决于B1B2),并且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提交”最初都包括M1M3
那么,第一个git rebase如何知道仅复制B1B2B3B4?我认为一个关键项目是绘制图形有些不同:

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涂成绿色,然后将F2F1涂成颜色……但是接着继续通过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/

10-13 06:19