【问题标题】:Git rebase and children branchesGit rebase 和子分支
【发布时间】:2017-12-22 13:30:30
【问题描述】:

我的项目有以下情况

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

我正在Feature 开发,但在提交M5 时发布了一个非常重要的更新,我不想将FeatureB3 分离(Feature 取决于B1 和@ 987654328@) 和Beta 可以进行更改(Beta 没有区别)。

如果我在Beta 上创建git rebase Master,它只会移动Beta 分支,对吧(Feature 上没有应用任何更改)?或者最终会变成这样(以下 - 更改也适用于Feature)?

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

而且,要变成这样(Feature 上的更改),我该怎么办?那是我想要的状态……

【问题讨论】:

  • 1.对,Beta 上的操作不会影响Feature。 2.直接在Feature分支做rebase。

标签: git branch rebase


【解决方案1】:

你是对的:在Beta 上运行git rebase Master 不会影响Feature。 (旁白:为什么是大写字母?)

这里的根本问题是git rebase“意味着”复制一些提交。诀窍是查看哪些提交被复制,复制到哪里,以及之后分支名称会发生​​什么。如果复制的提交也可以从某个 other 分支访问,则原始文件(在复制之前)仍然可以从该其他分支访问。

请记住,所有分支名称都只是指针,指向分支上的最新提交。所有早期的父提交都在该分支上,即使这些早期的提交也在其他分支上。所以“所有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)的提示提交上使用red 荧光笔,并按照左侧的线条为所有提交red 着色。红色覆盖了绿色,因此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 &lt;name&gt;。添加--onto 告诉Git 将副本放在哪里:您希望它们在B4' 之后,因此您可以说--onto Beta 表示副本在Beta 之后,即B4'

这实际上并没有修复任何东西……还没有。但它释放了 other 论点,即 曾经 Beta 的论点,嗯,是别的东西。

你想要告诉 Git 从哪里开始将提交标记为红色。那是B3,或者如果更简单的话,B4。这会将B3 及其所有早期提交(包括M3 和更早)标记为红色:请勿复制。

如果您保存它,您可以使用B3 的原始 ID。或者,您可以使用 Beta@{1} 轻松让 Git 查找 Beta上一个提示:

git rebase --onto Beta Beta@{1}

这会使用 Beta 的引用日志找到提交 B4 的哈希 ID。

【讨论】:

    【解决方案2】:

    实际上它最终会是这样的:

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

    基本上,Beta 的 rebase 将在 master 的当前提示之上重新应用 Beta 上的提交。但是,原始提交仍将存在,如果其他任何内容(例如另一个分支)引用这些提交,它们仍将持续存在。

    您需要先变基 Beta,然后变基 feature 才能将所有内容“移动到正确的位置”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 2021-08-20
      • 2021-03-28
      • 2017-02-12
      • 1970-01-01
      • 2023-02-11
      • 2021-08-18
      相关资源
      最近更新 更多