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

23

我想将我在主分支上的最后几个提交移动到一个独立的分支中。

我的电脑上的树形结构看起来像这样:

   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,如果可以的话,除了这三个命令以外还需要做些什么吗?

2
你是不想在主分支中有Y,还是只是想让你的分支从X4开始?我的意思是,Y在主分支中是一个错误吗? - CharlesB
3个回答

20

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

这些命令确实会在本地得到你想要的内容。(你可能需要使用 git reset --hard来保持工作树和索引与你要重置的提交相同,但像往常一样,在使用该命令之前务必非常小心地检查 git status是否干净。)

如果之后你尝试将主分支推送到GitHub,它会告诉你一切都已经是最新的了,因为GitHub上的master是领先于一个提交的。你可以强制推送,以便在GitHub上重置主分支,但这会改写公共历史记录,所以你只应该在以下情况下这样做: (a) 你是唯一从GitHub上获取master的人或者 (b) 你可以让你的合作者知道如何处理,以免他们意外地将 Y 合并回来。如果可以接受,你可以执行以下操作:

 git push --force origin master

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


谢谢Mark。目前只有我在为这个项目做贡献。有一个人已经fork了这个项目,但他是在自己的分支上工作。所以,在这种情况下,对于我来说,没有理论上的危险会破坏我的项目历史记录,对于他来说,也不会出现与他的分支相关的问题,对吧?抱歉我的问题可能有点愚蠢。 :-) - Albus Dumbledore
2
这并不是“破坏”,只是重写而已 :) 这应该没问题,但如果你想将他的工作合并回你的工作中,你需要小心 - 可能要使用交互式变基来重写另一个人的分支,以便跳过你的 Y。或者如果他还没有做任何事情,最简单的方法可能是说“你可能需要删除你的 fork 并重新 fork 我的存储库”... - Mark Longair
太好了。非常感谢你。马克,你真是太有帮助了! - Albus Dumbledore
2
@阿不思·邓布利多:没问题 - 能够帮助凤凰社制定版本控制策略是一种荣幸 ;) - Mark Longair
我发誓每两周就会回到这个该死的问题。 - merwok
显示剩余2条评论

3

它应该可以工作,但你需要:

  • 使用push -f origin master(强制推送,如果其他人已经克隆了你的仓库,则会出现问题)
  • 然后推送你的新分支(这将找到X4 sha1,然后在其顶部设置新分支)。

0

没有人提到过,你可以简单地将提交挑选到另一个分支中。这样,您的提交消息仍将存在。

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

然后在前一个提交的基础上创建一个新分支并切换到它: git checkout -b "$newBranchName" HEAD~$n (HEAD~$n 代表第 n 次提交) 或者 git checkout -b "$newBranchName" $formerRevsion

现在,您只需要挑选所需的提交: git cherry-pick $revision

旧的提交仍将在其他分支中,但您可以通过变基来解决这个问题。返回旧分支并使用变基: git rebase -i HEAD~$n

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接