如何将develop分支重置为master分支

129

我有developmaster两个分支,现在我的develop分支比较乱,我想重置它并将其变成master的一个副本。我不确定将master合并到develop是否会使它们完全相同。尝试合并后,我遇到了许多冲突,我使用以下方法解决了这些冲突:

git checkout develop
git merge origin/master
//got many conflicts
git checkout . --theirs

这样对于将 develop 分支变为与 master 完全相同的副本,是否足够?

谢谢


听起来你想要删除分支 - AturSams
develop 设置为新的默认分支(通过 Github 的 Web 界面只需几个点击)是最可逆的解决方案。 - mirekphd
什么阻止您从主干检出一个新的分支? - Mehdi
6个回答

194

如果您希望这两个分支相同,则

// from Develop and assuming your master is up to date with origin/master
git reset --hard master

36
这是对我有效的方法...否则你会收到关于路径无法进行硬重置的警告。 - cgseller
23
如果 git push 失败,并且更新被拒绝,因为当前分支的最新提交在远程分支之后,则需要使用 git push -f。请注意,此命令会强制推送你的更改并覆盖远程分支,慎重使用。 - Abdull
1
如果你收到了这样的信息:Protected branch update failed for refs/heads/<your branch>,那么你需要在 Github 上更新或删除该分支的分支保护规则。具体操作为:进入 Github-->settings-->branches。 - ssoward
另外,您可以使用任何提交的SHA将分支重置为该状态: git reset --hard <SHA> - saza
重置是递归的吗?开发分支的子分支会发生什么?如果子分支不被重置,它的基础分支会变成主分支还是保持为开发分支? - undefined

150

如果你想让developmaster完全相同,最简单的方法就是重新创建指针:

git branch -f develop master

或者,如果你已经检出了develop分支:

git reset --hard master

请注意,这两个选项都将删除不在master中的develop历史记录。如果这是不可接受的,则可以通过创建一个镜像master最新状态的提交来保留它:

git checkout develop
git merge --no-commit master
git checkout --theirs master .
git commit

1
我的develop分支被其他开发人员使用,那么如果我执行reset --hard命令,如何将其推送给其他开发人员呢? - trrrrrrm
2
@ra_htial 他们也需要重置到它。如果你正在与他人共享分支,除非他们也知道如何重置并且没有任何未完成的工作,否则你可能不想使用前两个选项。 - Amber
是的,我们都同意重置它,然后我们应该一起重置它,然后像往常一样开始工作并推送代码。 - trrrrrrm
4
我发现自己陷入了这种不幸的境地。我使用了最后一个解决方案,但它不能删除那些不在主分支中的文件。为了做到这一点,我必须首先执行 git diff-tree -r --diff-filter=D develop master 找到这些文件,然后逐个删除它们,或者将它们的路径复制到一个文件中并运行 cat file | xargs rm 来批量删除。 - Chris
3
你应该按照下一个最佳答案去做,即在develop分支上执行以下操作:git reset --hard master否则你会收到一个错误信息。 - jerpint
显示剩余4条评论

3

例如,让staging分支与develop完全相同,只需重新创建指针:

首先确保您的本地开发分支与origin/develop同步,运行以下命令: git checkout develop && git pull origin develop

然后检出目标分支(在这种情况下为staginggit checkout staging

最后重置目标分支 git reset --hard develop

通过强制推送更改(因为本地指针具有不同的地址,git会发出警告) git push -f

就这样了!


3
如果其他方法都失败了,你可以删除当前分支,然后直接从master重新创建它。
git branch -D develop
git checkout master
git checkout -b develop

我在Web界面中尝试了这个操作,遇到了两个问题:
  1. 它并没有真正删除分支而是将其归档
  2. 当我在命令行界面中执行此操作时,提示我的阶段已经发散。现在每次我尝试构建阶段时,都需要克隆到不同的位置并检出阶段,这非常麻烦。
- WPFKK

2

撤销最后一次提交

git reset HEAD~ 

1
这假设开发是从主分支中分离出来的,并且比主分支领先1个提交。OP有一个一般性问题:“我想重置它并将其作为我的master的副本”。 - Gino Mempin

-3

我有点晚来参加这个聚会,但是在将我的dev分支合并到主分支并推送到服务器后,我会执行以下操作:

git fetch

git checkout development

git merge origin/master

git push

然后dev分支比master分支多一个提交,其他开发人员就不必担心在开发分支中的所有提交都被重置了。


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