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

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

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

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


当前回答

我的做事方式如下

#Backup branch
git checkout -b master_backup
git push origin master_backup
git checkout master
#Hard Reset master branch to the last common commit
git reset --hard e8c8597
#Merge
git merge develop

其他回答

这里给出的解决方案(在“master”中重命名分支)并不坚持远程(GitHub)回购的后果:

如果在创建该分支之后没有推送任何内容,那么可以重命名它并推送它,而不会有任何问题。如果你在GitHub上有push master,你需要“git push-f”新分支:你不能再以快进模式进行push了。

    -f
    --force

通常,该命令拒绝更新远程引用,该远程引用不是用于覆盖它的本地引用的祖先。此标志禁用检查。这可能会导致远程存储库丢失提交;小心使用。

如果其他人已经删除了你的repo,那么如果不使用新的GitHub主分支替换自己的主分支(或者处理大量合并),他们就无法删除新的主历史记录。对于公共回购而言,除了git push,还有其他选择。Jefromi的答案(将正确的更改合并回原始主控形状)就是其中之一。

还可以将其他分支中的所有文件签出到master中:

git checkout master
git checkout better_branch -- .

然后提交所有更改。

我发现这个简单的方法效果最好。它不会重写历史,分支的所有先前签入都将附加到主节点。没有丢失任何内容,您可以在提交日志中清楚地看到发生了什么。

目标:使“分支”的当前状态成为“主”

在分支上工作,提交并推送更改,以确保本地和远程存储库是最新的:

git checkout master      # Set local repository to master
git reset --hard branch  # Force working tree and index to branch
git push origin master    # Update remote repository

在此之后,您的master将是分支的最后一次提交的确切状态,并且您的master提交日志将显示分支的所有签入。

编辑:你没说你已经推到了公开回购!这是天壤之别。

有两种方式,“脏”的方式和“干净”的方式。假设您的分支名为new master。这是一种干净的方式:

git checkout new-master
git branch -m master old-master
git branch -m new-master master
# And don't do this part.  Just don't.  But if you want to...
# git branch -d --force old-master

这将使配置文件更改以匹配重命名的分支。

你也可以用脏的方式来做,这不会更新配置文件。这是在上面的罩下发生的事情。。。

mv -i .git/refs/new-master .git/refs/master
git checkout master

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

git checkout main

用“better_branch”覆盖“main”:

git reset --hard better_branch

强制推送到远程存储库:

git push -f origin main