如何在Git中的分支之间移动提交?

Chr*_*ins 37 git git-branch git-cherry-pick

我确信这是一个很简单的问题并得到了回答,但我不知道要搜索的条款.我有这个:

    /--master--X--Y
A--B
    \--C--D--E
Run Code Online (Sandbox Code Playgroud)

我在一个分支上提交C,D和E(仅限本地),但后来我意识到D和E实际上是独立于C.我想将C移动到它自己的分支,并保留D和E以供日后使用.也就是说,我想要这个:

                   /--C
    /--master--X--Y
A--B
    \--D--E
Run Code Online (Sandbox Code Playgroud)

我怎样从D和E下面抽出C?

mip*_*adi 51

您可以使用git cherry-pick抓取C,并将其放在Y.假设Y作为提示存在一个分支称为branch-Y:

$ git checkout branch-Y
$ git cherry-pick C
Run Code Online (Sandbox Code Playgroud)

所以现在C在Y之上.但是D和E也仍然包含C(樱桃挑选不会移动提交,它只是复制它).你必须在B之上修改D和E.假设E是branch-EB 的尖端branch-B,你可以:

$ git checkout branch-E
$ git rebase --interactive branch-B
Run Code Online (Sandbox Code Playgroud)

这将打开一个交互式rebase会话.只需完全删除提交C,并保持D和E不变.然后,您将在没有C的情况下将D和E重新置于B之上.

  • 请注意,从v1.7.1开始,`cherry-pick`可以挑选多个提交,因此您可以使用它来"抽取"多个提交.你也可以通过在E上创建一个临时分支并以交互方式将其重新定位到Y上,只保留你想要的提交,然后将它(它将是一个快进的)合并到Y的分支中来做到这一点.(这总是有效的,而且可能更容易,因此您不必粘贴尽可能多的SHA1.) (6认同)