Git用另一个分支代替master分支 - git merge -s ours?

时间:2017-01-25 11:04:13

标签: git version-control merge

我对Git相当陌生,因为他过去几个月才开始使用它,因为我开始使用新客户端(这是他们在开始为他们工作之前用来管理软件版本控制的原因)。

我最近将development分支与我的本地master分支合并,并将master推送到服务器。在将其推送到服务器之前,我已经在我的本地开发机器上测试了该站点(用Django / Python编写的网站),这一切似乎都正常工作(包括已在development上实现的错误修复分支)。

但是,在测试推送到服务器后所做的更改后,我发现某些内容已经破坏了网站的一部分。所以我在服务器上检查了一个旧的commit,现在版本正在使用那个旧的commit,这意味着它处于'Detached HEAD'状态,但是正常运行。

所以,我的本地master分支目前是我已经推送到服务器的bug修复版本(它在本地工作,但在服务器上没有),但是因为我需要继续工作该网站的另一个方面,我想恢复到master的备份,这是我在将development分支与错误修复合并到master之前所做的,所以我从代码的“最近工作”状态。

我机器上的分支机构是:

masterdevelopment合并到其中,打破了其他内容)

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分支?

2 个答案:

答案 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