创建多次提交后的git分支

46

我在GitHub上有一个仓库,只有一个名为 master 的分支,我一直在我的本地仓库中工作。但由于担心它们会破坏东西,我停止将提交推送回 GitHub 上的 master 分支了。现在我有很多提交在我的本地仓库中,我想将它们推送回 GitHub。

然而,与其将提交推送回 master 分支,我更愿意在 GitHub 上创建一个新分支 (development) 并将所有本地提交推送到该分支上(只有在进行更好的测试后,我才会将其合并回 master 分支)。

这样做的简单方法是什么?


2
可能是重复的问题:如何使用Git将最近的提交移动到新分支? - tripleee
1个回答

67

在主分支上:

git checkout -b newbranch 或者像下面建议的那样,只需执行 git branch newbranch 来创建新分支而不切换到它。

这将创建一个分支,其当前提交记录为主分支的最新提交记录。创建完成后:

git checkout master

然后执行:

git reset --hard <commit_hash>

其中的 <commit_hash> 应替换为您想要还原主分支的提交 ID。

现在,您可以切换到新分支并将其推送到远程。

git checkout newbranch
git push origin newbranch

2
也许可以使用 git branch --set-upstream newbranch origin/newbranch 命令来设置追踪分支 :) - hobbs
1
如果你只是执行'git branch newbranch',而不是'git checkout -b newbranch; git checkout master',那么分支会被创建,并指向正确的提交,但实际上不会改变当前分支。 - bobDevil
1
另外,如果你想将主分支恢复到最后一次GitHub推送的状态,你应该在git reset --hard <commit_hash>中将<commit_hash>值设为HEAD:git reset --hard HEAD可以实现此目的。 - Emmanuel Valle
@Grant -- 非常感谢,确实解决了问题!现在我明白了,但如果让我自己去做的话可能需要一段时间才能搞定。有一个问题:如果我只想让我的本地Master分支与github的Master分支相同,我是否可以使用git checkout origin/master(或者是上面评论中Emmanuel的建议)来代替使用commit-hash进行硬重置?如果可以,那么我是否需要先删除我的本地Master分支(并且我是否可以通过切换到我的新开发分支并使用git branch -d master来删除它)?再次感谢。 - Herbert Sitz
4
@Herbert:首先,你可能想在Grant的命令中使用origin/master(或者等价的对象名称)作为<commit_hash>。其次,如果你想将本地的master移动到origin/master所指向的位置,那么最好直接执行(因为删除并重新创建它也会重启它的引用日志)。如果master已经被检出,那么可以使用git reset --hard origin/master。如果没有被检出,则可以使用git branch -f master origin/master。使用git checkout origin/master会将提交检出为一个分离的HEAD,这可能不是你想要的。 - Chris Johnsen
@Chris -- 谢谢,那很有帮助,我会理解这些东西的。 - Herbert Sitz

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