Git: 如何在同一分支上将一个分支变基到另一个提交之上?

4

参考这个优秀的回答,我已经阅读并(我想)理解了,但是就我所看到的,它并没有回答我的具体问题(因为它解释了如何在不同分支上重新设置基础,但我想在同一分支上进行重新设置基础)。

情况

  • 有两个分支,masterfeaturefeature在某个时间点上重新设置到master之上
  • 后来,由于某种原因*,我们希望featuremaster的先前某个提交中“分支出”

( * 编辑:原因,例如:本地feature分支更改后,在将其重新设置到master之后发生了故障,因此尝试找出在相似的方式下破坏了feature分支的哪个提交在master上使用git-bisect)

问题:如何实现这一点?

示意图

如何从以下状态转换:

                 G--H--I--J    <-- feature
                /
A--B--C--D--E--F               <-- master

你希望将什么改为这个?

        G--H--I--J             <-- feature
       /
A--B--C--D--E--F               <-- master

迄今为止的尝试

尝试1:

git checkout feature
git rebase C

结果:当前分支 bug/8985-miniredis 已经是最新的。 没有任何变化。

我认为这个结果很合理,因为对于Git来说,C也是"当前分支"的一部分。(尽管从我的角度来看,"当前分支"只有G..J)

尝试 #2:

git checkout feature
git rebase --onto C feature

结果:首先,将头倒回到其顶部以重播您的工作...。然后feature简单地指向C,其他提交都“丢失”了。我真的不明白这里正在发生什么,但是再次强调,从我的角度来看,git不能知道featureF“开始”。

第三次尝试:

git checkout feature
git rebase --onto C master..feature

结果:致命错误:无效的上游'master..feature'

如在该答案的评论中所述,这是不可能的,因为git会自己插入..HEAD部分。但肯定有一些方法可以实现这一点吧?

用其他话来表达这个问题:

如果git rebase --onto C master..feature有效,如何实现它?


@downvoter:能否解释一下你的问题是什么? - Attilio
1
哦,现在我明白你想做什么了……但是这毫无意义啊……那个“任何”原因是什么?我的意思是你可以创建一个新的分支,从C分支中分离出来,然后将所有提交推到那里,然后删除旧的功能分支……但你肯定要处理合并冲突。但是只是将分支拉回到以前的提交状态是行不通的。也许这些解决方案之一可以帮助你:https://dev59.com/ZW865IYBdhLWcg3wceNU或https://dev59.com/Jm445IYBdhLWcg3wNXk_ - YesThatIsMyName
你能详细解释一下为什么“完全没有意义”吗?我这样做的原因(将编辑问题):例如,我有一堆本地提交,在将它们变基到主分支后停止工作;现在我想找出哪个来自主分支的提交破坏了它们(类似于git-bisect)。关于“您可以创建一个分支...并删除旧分支”:好吧,这也是正常变基操作的手动替代方法,不是吗?实际上,此答案1.a似乎正是我需要的;我会尝试一下,如果是这种情况,那么这个问题就可以关闭了。 - Attilio
@phd:是的,可以看下面我的回答,基于那个问题的第一个答案 :) - Attilio
现在您可以删除您的问题,因为它是一个重复的问题。 - phd
1个回答

2

首先,感谢@YesThatIsMyName指导我正确的方向。

这个答案的1.a点有我需要的内容。

使用上面的符号表示,正确的命令如下:

git rebase --onto C master feature


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