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

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

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

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


当前回答

根据我的理解,您可以将当前分支分支到现有分支。本质上,这将用当前分支中的所有内容覆盖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

其他回答

根据我的理解,您可以将当前分支分支到现有分支。本质上,这将用当前分支中的所有内容覆盖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

我知道这不是OP想要的,但如果你知道你将来会遇到与OP类似的问题,你可以这样做。

这是你的情况,

您需要一个分支,它具有新的优秀的新中断功能,但目前还没有推出。你有计划在未来推动它。您当前的prod分支(master)运行良好,但很无聊。你可以对它做一些小改动。如果以后需要,您希望保持当前主(prod)分支的安全。

如果这让人感到困惑,请参见下图中的糟糕情况。

*bad situation*
initial master   --->           added boring changes       ----merge---> you loose boring
            \                                                /
             ---> (awesome branch) added awesome changes ---

要解决此问题(即停止钻孔损失),请执行以下操作大体上

通过执行git branch boring创建当前主控形状的副本将boring替换为要保留的任何名称现在,您可以向主分支添加新的很棒的功能,并向无聊分支添加无聊的功能。您仍然可以继续更新枯燥的分支,并可能使用它来永远不会将其合并到master。你不会失去乏味的功能。你的主分支将有很棒的功能。

So,

*good situation*
 initial master   --->     added awesome changes     --->    Final master(awesome) branch
                \
                 --->   (boring branch) added boring changes  ---> Dont merge to master  --X-->

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

有两种方式,“脏”的方式和“干净”的方式。假设您的分支名为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

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

git branch -M branch_name master

对我来说,我希望我的开发分支在领先之后回到主分支。

在开发过程中:

git checkout master
git pull

git checkout develop
git pull

git reset --hard origin/master
git push -f