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 中有一个跨越数十个提交的大重构。意外放弃重要更改的风险非常高。
有没有其他方法可以限制我必须在这里解决冲突的数量?
因为你知道 B
被 B'
替换了,正确的解决方案是从 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}
)分支出来的该分支的。
初始情况非常简单。有一个正在积极开发的 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 中有一个跨越数十个提交的大重构。意外放弃重要更改的风险非常高。
有没有其他方法可以限制我必须在这里解决冲突的数量?
因为你知道 B
被 B'
替换了,正确的解决方案是从 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}
)分支出来的该分支的。