将旧提交移动到新分支

时间:2013-06-18 00:02:58

标签: git branch

我不小心开始在另一个中间开发新功能。我的存储库看起来像这样:

A - B - C - D - E master

但我希望看起来像这样:

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

这似乎是一个简单的问题,但我还没有通过搜索找到答案。樱桃采摘似乎接近我想要的东西,也可能是一些变相,但我是Git的新手并且会得到一些帮助。

3 个答案:

答案 0 :(得分:6)

首先,制作新分支:

git branch new-feature C

接下来,修复主人

git checkout master
git rebase -i B

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

答案 1 :(得分:3)

我将在这里使用一些非常危险的操作,所以请注意。

这个答案有几个假设:

  1. 您的最终master分支应如下所示: A - B - D - E

  2. 您的最终new-feature分支应如下所示: A - B - C

  3. 缺少提交C不会影响在提交D之上应用提交EB

  4. 如果情况并非如此,请在此处更新。

    首先,在分支上,我们创建一个新分支作为备份。我们称之为“备份”。

    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'相同。

    我们到了那里。我假设C分支上的提交new-feature将从提交B分支出来。找到提交{1}}的提交SHA1,然后(省略下面的尖括号):

    B

    这将创建一个名为git checkout -b new-feature <SHA1 of commit B>的分支,它从提交new-feature开始,并为您检查。现在我们在B分支上,它看起来像这样:

    new-feature

    最后一步是找出commit A - B的提交SHA1。我们在C分支中有它。 使用backup(或其他一些方法),在备份分支上找到commit git log backup的提交SHA1。之后,在C分支上,执行:

    new-feature

    当然,请省略尖括号。

    现在,git cherry-pick <SHA1 of commit C>分支应如下所示:

    new-feature

答案 2 :(得分:1)

假设您当前在分行master

  1. git branch new-feature master~2现在创建分支new-feature并指向C提交。 (完成后,您仍在处理分支master
  2. git rebase --onto master~3 master~2这会将master~2的所有提交移至提交B的头部master(即master~3)。
  3. 好的,你已经完成了!

    始终使用git help <cmd>了解详情。