我在Git中有一个存储库。我做了一个分支,然后对主分支和分支都做了一些更改。

然后,几十次提交之后,我意识到分支的状态比主分支好得多,所以我希望分支“成为”主分支,并忽略对主分支的更改。

我无法合并它,因为我不想将更改保留在master上。我该怎么办?

额外:在本例中,“旧”主控已被推送到另一个存储库,如GitHub。这是如何改变事情的?


当前回答

确保将所有内容推送到远程存储库(GitHub):

git checkout main

用“better_branch”覆盖“main”:

git reset --hard better_branch

强制推送到远程存储库:

git push -f origin main

其他回答

其他两个答案的问题是,新主人没有老主人作为祖先,所以当你推它时,其他人都会被搞砸。这是您想要做的:

git checkout better_branch
git merge --strategy=ours master    # keep the content of this branch, but record a merge
git checkout master
git merge better_branch             # fast-forward master up to the merge

如果你想让你的历史更清楚一点,我建议你在合并提交消息中添加一些信息,让你清楚你做了什么。将第二行更改为:

git merge --strategy=ours --no-commit master
git commit          # add information to the template merge message

确保将所有内容推送到远程存储库(GitHub):

git checkout main

用“better_branch”覆盖“main”:

git reset --hard better_branch

强制推送到远程存储库:

git push -f origin main

我在博客文章中找到了我想要的答案。用git中的另一个分支替换主分支:

git checkout feature_branch
git merge -s ours --no-commit master
git commit      # Add a message regarding the replacement that you just did
git checkout master
git merge feature_branch

这与卡斯卡贝尔的答案基本相同。除了他们的解决方案下面的“选项”已经嵌入到上面的代码块中。

这样更容易找到。

我将此添加为新答案,因为如果以后需要此解决方案,我希望在一个代码块中包含所有需要使用的代码。

否则,我可能会复制并粘贴,然后阅读下面的详细信息,以查看我应该更改的行-在我已经执行它之后。

根据我的理解,您可以将当前分支分支到现有分支。本质上,这将用当前分支中的所有内容覆盖master:

git branch -f master HEAD

完成后,通常可以推送本地主分支,可能还需要此处的force参数:

git push -f origin master

没有合并,没有长命令。简单地分支和推送——但,是的,这将改写主分支的历史,所以若你们在一个团队中工作,你们必须知道你们在做什么。




或者,我发现您可以将任何分支推送到任何远程分支,因此:

# This will force push the current branch to the remote master
git push -f origin HEAD:master

# Switch current branch to master
git checkout master

# Reset the local master branch to what's on the remote
git reset --hard origin/master

通过以下方式将分支重命名为主分支:

git branch -M branch_name master