Git rebase和儿童分支

时间:2017-07-17 21:26:42

标签: git branch rebase

我的项目中有以下情况

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

我正在Feature开发,但是在提交M5上发布了一个非常重要的更新,我不想从Feature B3分离Feature 1}}取决于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上应用的更改),我该怎么办?这是我想要的状态......

2 个答案:

答案 0 :(得分:3)

您是对的:在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之后,即{{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,以便将所有内容“移动到正确的位置”。