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

Branch off a branch, How to rebase on another branch?

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

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

我想了解开发分支的最新信息。并且更愿意在其最新提交 d253 上将我的 branchB 重新设置为 develop。此外,所有来自 branchA 的提交都应 忽略 。这将避免我解决合并冲突的巨大努力(有很多)。因为我不是那个branchA的维护者。我可以在我的 branchB 中重新创建我需要的依赖项 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 仍然是一个好方法吗?

Q1 - 好吧,是的,这是执行图片中显示的命令的命令。如果分支 b 与分支 a 正交,我想那没问题。我会犹豫这样做;您是否有理由不想将两个分支都变基到当前的 d 提交?

Q2 - 我没有注意到 rebasemerge 在解决冲突方面有很大差异。最大的区别在于,对于您指定的特定变基,您不会包括 a 更改;这意味着如果 a 更改与 d 更改冲突,您不必处理它。 (如果 b 更改与 a 更改重叠,我认为这本身不会被视为冲突,但很可能导致代码处于损坏状态。)

真正的问题是,b 提交是否已与其他开发人员共享?如果是这样,那么通常不建议将它们变基,因为这会给其他开发人员带来问题。

为了仅使用来自 B 的提交在 develop 上对 branchB 进行变基。必须使用带有 3 个参数的 rebase --onto

git checkout branchB
git rebase --onto develop branchA branchB

感谢 Git Tip of the Week: Rebasing Revisited 部分 "Rebasing onto" 给出了一个与此问题中描述的场景相似的示例。

也在git-rebase documentation。为方便转载于此:

首先假设你的话题是基于branch next。例如,主题中开发的功能依赖于下一个中找到的某些功能。

o---o---o---o---o                  master
     \
      o---o---o---o---o            next
                       \
                        o---o---o  topic

我们想从branch master分叉话题;例如,因为 topic 所依赖的功能被合并到更稳定的 master 分支中。我们希望我们的树看起来像这样:

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

我们可以使用以下命令获取它:

git rebase --onto master next topic