如何将提交移动到另一个分支?

时间:2011-05-17 18:57:50

标签: git branch push commit

我想把我最后几次提交从master转移到他们自己的分支。

我电脑上的树看起来像那样:

   W (some branch)
  /       
X1--X2--X3--X4--Y--Z1--Z2 (master)

我希望它看起来像:

   W (some branch)
  /       
X1--X2--X3--X4 (master)
             \
              Y--Z1--Z2 (my new branch)

然而,GitHub上的树看起来像:

   W (some branch)
  /       
X1--X2--X3--X4--Y (master)

这就是我所看到的将最后提交移动到另一个分支的解决方案:

git checkout master
git branch my_new_branch
git reset <commit_id>

我的问题是:在将提交移动到新分支后,我是否能成功推送到GitHub?如果是这样,它还需要做除了这三个命令以外的其他操作吗?

3 个答案:

答案 0 :(得分:18)

(我假设<commit_id>X4的对象名称...)

这些命令确实会让你最终得到你想要的东西。 (您可能希望使用git reset --hard使工作树和索引与您要重置的提交保持一致,但是通常,在使用该命令之前要非常小心git status是干净的。 )

如果你之后尝试将master推送到GitHub,它会告诉你所有内容都已经是最新的,因为GitHub上的master是一个提交。您可以强制推送,以便在GitHub上重置主服务器,但这会重写公共历史记录,因此您应该只在以下情况下执行此操作:(a)您是唯一从GitHub获取master的人或(b)你可以让你的合作者知道是什么让他们不小心合并Y。如果没关系,你可以这样做:

 git push --force origin master

...然后GitHub上的master将与您的本地版本相同。

答案 1 :(得分:3)

应该可以,但你需要:

  • push -f origin master(强制推送,如果其他人已经克隆了您的回购邮件会造成麻烦)
  • 然后推送你的新分支(然后会找到X4 sha1,其上面将设置新的分支。)

答案 2 :(得分:0)

没有人提到你可以简单地将提交选择到另一个分支。这样你的提交信息仍然会在那里。

只需复制您要移动的提交的修订ID即可。 git log --oneline

在之前的提交之上创建一个新分支并更改为它: git checkout -b "$newBranchName" HEAD~$n (HEAD~ $ n代表第n次提交) 要么 git checkout -b "$newBranchName" $formerRevsion

现在你只需要选择想要的提交: git cherry-pick $revision

旧提交仍将在另一个分支中,但您可以使用rebase修复它。移回旧分支并使用rebase: git rebase -i HEAD~$n

只需删除樱桃挑选提交的提交行,您的分支就会被重新定位。您必须使用git push -f,因为所有重新提交的提交的修订都已更改。