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

Alb*_*ore 21 git branch push commit

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

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

   W (some branch)
  /       
X1--X2--X3--X4--Y--Z1--Z2 (master)
Run Code Online (Sandbox Code Playgroud)

我希望它看起来像:

   W (some branch)
  /       
X1--X2--X3--X4 (master)
             \
              Y--Z1--Z2 (my new branch)
Run Code Online (Sandbox Code Playgroud)

但是,GitHub上的树看起来像:

   W (some branch)
  /       
X1--X2--X3--X4--Y (master)
Run Code Online (Sandbox Code Playgroud)

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

git checkout master
git branch my_new_branch
git reset <commit_id>
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*air 19

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

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

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

 git push --force origin master
Run Code Online (Sandbox Code Playgroud)

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

  • 这不是*破坏*它,只是重写它:)这应该没问题,但是如果你想将他的工作合并到你的工作中,你会要小心 - 可能使用交互式rebase来重写另一个人的分支,这样它会跳过你的'Y`.或者,如果他还没有做任何事情,可能最容易说"你可能想要删除你的分叉并重新分叉我的存储库"...... (2认同)
  • @Albus邓布利多:没问题 - 能够用他们的版本控制策略来帮助菲尼克斯勋章是非常荣幸的;) (2认同)