分支再分支,如何在另一个分支上进行变基?

5

我开始在branchB工作。该分支是从branchA分支中分支出来的。几周后,主线分支develop已经合并了许多提交。分支A和B都落后了很多。

--d1--d2--d3  ...2 weeks later...  --d253  develop
       \
        a1--a2--a3                         branchA
                   \
                    b1--b2--b3             branchB (current)

我希望跟进develop分支的最新进展,并且选择以其最新提交d253为基础重建我的分支B。同时,分支A中的所有提交都应该忽略。这样可以避免我在解决合并冲突时花费大量精力(冲突很多),因为我不是分支A的维护者。我可以在我的分支B中重新创建我需要从A中获取的依赖项。不确定是否应该在rebase之前还是之后进行。

--d1--d2--d3  .....  --d253  develop
       \                  \
        a1--a2--a3         \
                            \
                             b1'--b2'--b3'

Q1. 是否正确执行

git checkout develop
git pull
git checkout branchB
git rebase --onto develop branchA

Q2. 假设冲突数量很重要,大约有30个文件。与git merge develop相比,rebase仍然是一个好的方法吗?

2个回答

3

Q1 - 好的,这个命令可以实现你在图片中展示的操作。如果分支b与分支a相互垂直,我想是可以的。但我会犹豫是否这样做;您不想将两个分支都变基到当前d提交吗?

Q2 - 在解决冲突方面,我没有注意到rebase与merge之间有太大的区别。重要的区别在于,使用您指定的特定rebase命令时,您将不会包括a更改;这意味着如果a更改与d更改发生冲突,您就不必处理它。(如果b更改与a更改重叠,我认为这不会被视为冲突,但这可能导致代码处于错误状态。)

真正的问题是,b提交已经与其他开发人员共享了吗?如果是的话,通常不建议对其进行变基,因为这会给其他开发人员带来问题。


branchB还没有与其他开发人员共享。您能否解释一下“如果分支b与分支a正交”的含义?至于“我不想将两个分支都rebase到当前的d提交的原因是什么?”这是因为我不维护branchA。而且事实证明,它是一个进展缓慢的分支,它将被合并到主线的那一天还很遥远。我的branchB更活跃,我需要从A中提取的少量依赖项可以从A中挑选出来,或者我甚至可以重新创建一些存根来让我的代码工作,同时等待将来branchA的合并。希望这是rebase的一个好理由。 - Polymerase
rebasemerge。当rebase在追溯长时间提交的链时,我确实注意到了一些区别。当重新播放该文件到目标分支的历史记录上时,一个文件可能会有5个冲突。需要解决5次冲突。而使用合并,则有一个最终的合并冲突步骤,所有文件都显示在一个屏幕上(我使用IntelliJ)。每个有冲突的文件只需要解决一次。话虽如此,并不意味着merge更好。我非常喜欢rebase将我的更改放在目标之上,而不是合并提交。只是想更好地了解良好的实践。 - Polymerase
“正交”是指如果您的更改可以独立于a基本开发线进行更改,反之亦然。根据您所说的情况,这并不适用。如果您决定继续(例如从a中挑选所需内容),那么很可能会导致更多的合并冲突;因此,您必须决定是否值得这样做。 - Mark Adelsberger

3

为了将branchB仅以B的提交记录为基础重新定位到develop分支上,必须使用带有3个参数的rebase --onto命令:

git checkout branchB
git rebase --onto develop branchA branchB

感谢Git每周提示:再次介绍变基栏目中的“变基到”给出了一个类似于本问题描述场景的示例。
同时在git-rebase文档中也有相同内容,这里为方便起见再次复制一遍:
首先假设您的主题是基于next分支的。例如,topic中开发的一个功能依赖于在next中找到的某些功能。
o---o---o---o---o                  master
     \
      o---o---o---o---o            next
                       \
                        o---o---o  topic

我们希望从主分支(master)创建一个话题分支(topic fork),例如,因为话题所依赖的功能已经合并到更稳定的主分支中。我们希望我们的代码树(tree)看起来像这样:

o---o---o---o---o             master
    |            \
    |             o'--o'--o'  topic
     \
      o---o---o---o---o       next

我们可以使用以下命令获得这个:
git rebase --onto master next topic

你建议的 rebase 命令中的最后一个参数是不必要的;它只是表示“在开始之前检出 branchB”,而你已经在命令中显式地使用了 checkout 命令切换到了 branchB - Mark Adelsberger
@MarkAdelsberger 谢谢,第三个参数的默认值很令人困惑。什么时候第三个参数表示“检出第三个参数中的分支”,什么时候它表示“在当前分支上到这个提交”?正如Enrico Campidoglio的答案中所示I can't understand the behaviour of git rebase --onto,“外科医生:使用3个参数的git rebase --onto”。 - Polymerase
1
嗯?好吧,我猜这是一种解释方式,但需要理解的是第三个参数是提交标识符(不一定是分支),并且它始终表示“检出第三个参数”。如果第三个参数是HEAD^^(或指向该分支上的提交但不在分支末端的其他引用),那么这相当于说“直到这个提交”,但仍然通过检出该提交来开始变基操作(如果您先手动检出提交,则此操作是不必要的;它只是语法糖)。 - Mark Adelsberger
@MarkAdelsberger 重新运行模拟并确认您是正确的。如果已经检出,可以省略第三个参数(要重新基于的分支)。 - Polymerase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接