繁体   English   中英

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

[英]How to move commits to another branch?

我想将我最后几次提交从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?如果是这样,它还需要做除了这三个命令之外的其他操作吗?

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

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

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

 git push --force origin master

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

它应该工作,但你需要:

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

没有人提到你可以简单地将提交选择到另一个分支。 这样您的提交消息仍然适合您。

只需复制您要移动的提交的修订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因为所有重新提交的提交的修订都已更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM