git:将分支重设为其重设基础的父级

git:将分支重设为其重设基础的父级,git,rebase,Git,Rebase,最初的情况非常简单。具有活跃发展的特征_1分支,以及从头部分支的特征_2分支 A-B: feature_1 \ C: feature_2 让我们想象一下,提交A添加了一个新文件,提交B在该文件上追加了一行,而C追加了另一行。因此,所有更改都在一个文件中,并且彼此接近 在处理功能_2时,强制推送功能_1的新版本:a-B':功能其中修改了提交B(例如,修复打字错误) 我想在我正在并行处理的分支特性_2中安装此修复程序,因此我重新设置基址:git checkout feature_2&&git

最初的情况非常简单。具有活跃发展的
特征_1
分支,以及从头部分支的
特征_2
分支

A-B: feature_1
   \ C: feature_2
让我们想象一下,提交A添加了一个新文件,提交B在该文件上追加了一行,而C追加了另一行。因此,所有更改都在一个文件中,并且彼此接近

在处理功能_2时,强制推送功能_1的新版本:
a-B':功能
其中修改了提交B(例如,修复打字错误)

我想在我正在并行处理的分支特性_2中安装此修复程序,因此我重新设置基址:
git checkout feature_2&&git-rebase-I feature_1
。目标是:

A-B': feature_1
   \ C': feature_2
交互式(只是为了看看幕后发生了什么)rebase菜单给了我两个要使用的承诺:B(旧的)和C

第一种选择:我只选择两者。在这种情况下,将有一个冲突选择B和另一个冲突选择C。但基本上,这是相同的冲突,我必须解决两次

第二种选择:在这个简单的例子中,有背景知识B完全被功能_1中已经存在的B'取代,我可以从“重基”菜单中删除B,只需在重基C时解决冲突

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

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

既然您知道
B
已被
B'
取代,正确的解决方法是从rebase说明表中删除
B
。然后,您只需解决将
C
置于
B'
之上(如果有)时产生的冲突

请注意,以这种方式进行操作时,不存在“意外放弃重要更改的风险”:如果某个内容被删除,那么这只是因为其他人将
B
变形为
B'
(必须有这样做的原因)

如果您的上游(
feature_1
)跨越多个提交,那么我们假设您刚刚使用
git fetch
获取了新的上游。然后你就可以用它做“正确的事情”


也就是说,您说您想将您的功能分支移植到
origin/feature_1
(新的)之上,但您知道它是从以前的版本(
@{1}
)分支出来的你尝试过git合并吗?我的印象是,简单地将
feature\u 2
重定基址到
feature\u 1
上就行了,即
git fetch
然后
git-rebase-I origin/feature\u 1
。你能在备份
feature_2
分支上试试看它是否有效吗?@你完全正确。现在这个问题已经超过6个月了,我不记得当时我是否遇到过具体的问题。我刚刚重新创建了一个简单的示例,并尝试了rebase方法:Works,但我必须解决一个可能多次的小更改所导致的冲突。这是我不高兴的事。我相应地修改了我的问题-希望它有意义。感谢使用修订语法的解决方案。学习git的新知识总是很有趣的。
git checkout feature_2
git rebase --onto origin/feature_1 origin/feature_1@{1}