将旧提交移动到新分支

11

我在处理一个功能时不慎开始了另一个功能的开发。我的代码仓库现在看起来是这样的:

A - B - C - D - E master

但是我希望它看起来像这样:

A - B - D - E     master
       \
        C         new-feature

这似乎是一个简单的问题,但我搜索过后还没有找到答案。看起来像是需要挑选某些提交记录,或者进行一些变基操作,但我对Git还不够熟悉,希望能得到一些帮助。

3个回答

9

首先,创建新分支:

git branch new-feature C

接下来,需要修复主分支。
git checkout master
git rebase -i B

当编辑器出现时,从列表中删除C。保存并退出。

非常感谢!一直在寻找这样的解释。 - bbill
在变基之后,由于与远程存在冲突,git push 将拒绝推送主分支。我已经使用了 git push origin +master 来完成推送,但我不确定这是否是正确的选择。 - Guss

3
我将使用一些相当危险的操作,请注意。
以下答案有几个假设:
1. 你最终的 `master` 分支应该如下所示: `A - B - D - E`。 2. 你最终的 `new-feature` 分支应该如下所示: `A - B - C`。 3. 缺少提交 `C` 不会影响在提交 `B` 的基础上应用提交 `D` 和 `E`。
如果不是这种情况,请在此处进行更新。
首先,在 `master` 分支上,我们创建一个名为“backup”的新分支作为备份。
git branch backup

这是为了方便我们在后续出现任何问题时轻松恢复主分支。当然,我们可以使用 git reflog ,但这样做比较麻烦。

接下来,在主分支上执行以下操作:

git rebase -i HEAD~3

这将启动一个文本编辑器进行git rebase(交互模式)的操作。找到提交C的行并删除它。
现在,您的主分支应该看起来像: A - B - D' - E' 不用担心我写的是A - B - D' - E'而不是A - B - D - EDD'在更改集方面基本上是等效的。对于EE'也是一样的。
我们正在接近目标。我假设new-feature分支上的提交C要从提交B分支上分离出来。找到提交B的SHA1值,然后执行以下操作(省略下面的尖括号): git checkout -b new-feature <提交B的SHA1值> 这将创建一个名为new-feature的分支,该分支以提交B为起点,并为您签出它。现在我们在new-feature分支上,并且它看起来像这样: A - B 最后一步是找到提交C的SHA1值。我们可以在backup分支中找到它。使用git log backup(或其他方法)查找备份分支上提交C的SHA1值。之后,在new-feature分支上执行以下操作: git cherry-pick <提交C的SHA1值> 当然,请省略尖括号。
现在,new-feature分支应该看起来像: A - B - C'

C的父级已经是B。如果您在变基之前只需创建该分支,则无需进行任何高超操作。 - Carl Norum
哇,非常感谢这个深入的代码。我觉得它对我的理解有所帮助,即使在实践中可能不太能用得上。 - bbill

1
假设您当前在分支master上。
  1. git branch new-feature master~2现在创建了一个名为new-feature的分支,它指向C提交。(完成后仍在master分支上工作)
  2. git rebase --onto master~3 master~2这将把从master~2master头部的所有提交移植到B提交上(即master~3)。

好了,你完成了!

始终使用git help <cmd>获取详细信息。


谢谢,弗兰克。我也有点想摆脱这个提交。 - bbill
1
当然,C已经从master分支中删除了(现在只能从new-feature分支访问C)。据我理解,git rebase --onto是解决您问题的最佳方法。 - Frank Wu

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