git:将分支变基到其变基的父级上

git: rebase branch onto its rebased parent

初始情况非常简单。有一个正在积极开发的 feature_1 分支,并且从 HEAD 分支出一个 feature_2 分支。

A-B: feature_1
   \ C: feature_2

让我们假设提交 A 添加了一个新文件,提交 B 向该文件附加了一行,而 C 附加了另一行。所以更改都在一个文件中并且彼此接近。

在 feature_2 上工作时,强制推送了新版本的 feature_1:A-B': feature 提交 B 已修改(例如修复拼写错误)。

我想在我并行处理的分支 feature_2 中修复此问题,因此我变基:git checkout feature_2 && git rebase -i feature_1。目标是:

A-B': feature_1
   \ C': feature_2

交互式(只是为了看看幕后发生了什么)变基菜单为我提供了两个要使用的提交:B(旧的)和 C。

第一个选项:我两个都选。在这种情况下,会出现选择 B 的冲突和另一个选择 C ​​的冲突。但基本上这是我必须解决两次的相同冲突。

第二个选项:在这个简单的例子中有背景知识,即 B 完全被已经在 feature_1 中的 B' 取代,我可以从 rebase 菜单中删除 B,只需要在变基 C.

第二个选项适用于如此小的修复和非常少量的提交,但想象一下 feature_1 中有一个跨越数十个提交的大重构。意外放弃重要更改的风险非常高。

有没有其他方法可以限制我必须在这里解决冲突的数量?

因为你知道 BB' 替换了,正确的解决方案是从 rebase 指令中删除 B sheet。然后你只需要解决当 C 被放置在 B' 之上(如果有的话)时出现的冲突。

请注意,当您以这种方式进行时,不存在“意外放弃重要更改的风险”:如果某些东西被放弃,那只是因为 B 被某人变成了 B'否则(一定有这样做的理由)。

如果您的上游 (feature_1) 跨越多个提交,那么假设您刚刚使用 git fetch 获取了新的上游。然后你可以用

做“正确的事”
git checkout feature_2
git rebase --onto origin/feature_1 origin/feature_1@{1}

也就是说,你说你想在origin/feature_1(新的)之上移植你的功能分支,但你知道它是从以前的版本(@{1})分支出来的该分支的。