我想把我最后几次提交从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?如果是这样,它还需要做除了这三个命令以外的其他操作吗?
答案 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
,因为所有重新提交的提交的修订都已更改。