我对Git相当陌生,因为他过去几个月才开始使用它,因为我开始使用新客户端(这是他们在开始为他们工作之前用来管理软件版本控制的原因)。
我最近将development
分支与我的本地master
分支合并,并将master
推送到服务器。在将其推送到服务器之前,我已经在我的本地开发机器上测试了该站点(用Django / Python编写的网站),这一切似乎都正常工作(包括已在development
上实现的错误修复分支)。
但是,在测试推送到服务器后所做的更改后,我发现某些内容已经破坏了网站的一部分。所以我在服务器上检查了一个旧的commit
,现在版本正在使用那个旧的commit
,这意味着它处于'Detached HEAD'状态,但是正常运行。
所以,我的本地master
分支目前是我已经推送到服务器的bug修复版本(它在本地工作,但在服务器上没有),但是因为我需要继续工作该网站的另一个方面,我想恢复到master
的备份,这是我在将development
分支与错误修复合并到master
之前所做的,所以我从代码的“最近工作”状态。
我机器上的分支机构是:
master
(development
合并到其中,打破了其他内容)
masterBackup
(即合并master
之前的development
分支)
development
(这是原始错误修复的分支,但现在其他东西已被破坏)
如此有效,masterBackup
目前实际上是我工作的'主'分支,因为将development
合并到master
已经打破master
。我想再次masterBackup
我的'master'分支,并且可以丢弃/删除当前状态中的master
。我仍然拥有development
分支,因此可以查看为什么/如何破坏网站并将其修复,然后再将其合并到master
。
我在How to replace master branch in git, entirely, from another branch?找到了一个问题,其中接受的答案表明我应该执行以下步骤:
git checkout masterBackup
git merge -s ours master
git checkout master
git merge masterBackup
但是我找不到任何明确解释命令git merge -s ours
的功能......这肯定是如何让我的masterBackup
分支再次成为master
分支?
答案 0 :(得分:4)
该帖子中的命令不适合您。命令的结果是使masterBackup分支包含master分支中的所有更改。原因这不是你想要的。
如果您只想将masterBackup分支作为主分支,则可以通过
重命名git branch -m master master1
git branch -m masterBackup master
现在masterBackup正在替换master分支。但是,如果要将本地主分支推送到远程主分支,则应使用git push -f origin master
。
答案 1 :(得分:1)
最安全的选择是在分离提交后恢复对master
分支发生的提交,其中一切正常工作:
git revert <SHA-1>^..HEAD # SHA-1 is the earliest commit you want gone
此选项将在master
之上进行提交,撤消范围中的每个提交。在此之后,您的分支应该在功能上与您想要的相同。你可以像往常一样继续工作,像往常一样推动。
但如果您愿意,也可以重写master
的历史记录。
警告:此选项会重写已发布的master
分支的历史记录,因此只有在您能够处理此附带的警告时才应考虑此事项。
如果要将master
分支永久还原为较早的提交,可以执行以下步骤:
git checkout master
git reset --hard <SHA-1 of earlier commit you want to keep>
这将覆盖您的本地master
分支,使其HEAD现在是较早运行的提交。
请注意,这将更改远程发布的master
分支的历史记录,因此为了更新远程,您必须通过以下方式强制执行:
git push --force origin master