使当前的Git分支成为主分支

时间:2010-05-04 05:30:53

标签: git

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

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

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

Extra :在这种情况下,'old'主服务器已经push - 编辑到另一个存储库,例如GitHub。这怎么改变了呢?

15 个答案:

答案 0 :(得分:1912)

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

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

答案 1 :(得分:262)

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

git checkout master

覆盖"掌握"与" better_branch":

git reset --hard better_branch

强制推送到您的远程存储库:

git push -f origin master

答案 2 :(得分:68)

编辑:您没有说您已经推送到公共回购!这使得世界变得不同。

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

答案 3 :(得分:41)

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

git branch -M branch_name master

答案 4 :(得分:19)

据我了解,您可以将当前分支分支到现有分支。从本质上讲,这将覆盖当前分支中的任何内容master

git branch -f master HEAD

完成后,您通常可以推送本地master分支,也可能需要强制参数:

git push -f origin master

没有合并,没有长命令。只需branchpush - 但是,是的,这将重写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

答案 5 :(得分:13)

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

  • 如果你在制作那个分支后没有推动任何东西,你可以重命名并推送它没有任何问题。
  • 如果您在GitHub上有推送大师,则需要'git push -f'新分支:you can no longer push in a fast forward mode
    -f
    --force
  

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

如果其他人已经撤回了您的仓库,他们将无法在没有用新的GitHub主分支替换他们自己的主仓(或处理大量合并)的情况下拉出新的主历史记录。
alternatives to a git push --force for public repos Jefromi's answer(将正确的更改合并回原始主人)就是其中之一。

答案 6 :(得分:10)

我发现这种简单的方法可以发挥最佳效果。它不会重写历史记录,并且分支的所有先前签入都将附加到主服务器。没有任何东西丢失,你可以清楚地看到提交日志中发生了什么。

目标:建立"分支"的当前状态。 "主人"

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

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

在此之后,您的主服务器将是您上次提交分支的确切状态,您的主提交日志将显示该分支的所有签到。

答案 7 :(得分:9)

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

git checkout master
git checkout better_branch -- .

然后提交所有更改。

答案 8 :(得分:6)

我在博客文章 Replace the master branch with another branch in 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

它与Cascabel's answer基本相同。除了"选项"他在下面添加了,他的解决方案已嵌入我的主代码块中。

这种方式更容易找到。

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

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

答案 9 :(得分:4)

要添加Jefromi的答案,如果您不想在source分支的历史记录中放置无意义的合并,则可以为{{1}创建临时分支合并,然后扔掉它:

ours

这样,合并提交将仅存在于git checkout <source> git checkout -b temp # temporary branch for merge git merge -s ours <target> # create merge commit with contents of <source> git checkout <target> # fast forward <target> to merge commit git merge temp # ... git branch -d temp # throw temporary branch away 分支的历史记录中。

或者,如果您根本不想创建合并,只需抓取target的内容并将其用于source上的新提交:

target

答案 10 :(得分:1)

如果您在 Eclipse 中使用 eGit

  • 右键单击项目节点。
  • 选择团队→然后高级→然后重命名分支
  • 然后展开远程跟踪文件夹。
  • 选择名称错误的分支,然后单击重命名按钮,将其重命名为新名称。
  • 选择新的主人,然后将其重命名为主人。

答案 11 :(得分:1)

我的处事方式如下

#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

答案 12 :(得分:1)

对我来说,我希望我的开发者在领先之后能回到大师那里。

开发中:

git checkout master
git pull

git checkout develop
git pull

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

答案 13 :(得分:0)

我没有足够的业力来评论。

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

这是你的情况,

  1. 您需要一个具有新的出色的新突破性功能但目前不是 prod 的分支。你有计划在未来推动它。
  2. 您当前的 prod 分支 (master) 运行良好但很无聊。您可以对其进行一些细微的更改。
  3. 如果以后需要,您希望保持当前主 (prod) 分支的安全。

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

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

要解决这个问题(即停止无聊的损失),请执行以下操作 基本上,

  1. 通过执行 git branch boring 将无聊替换为您想要保留的任何名称来创建当前母版的副本
  2. 现在,您可以向主分支添加新的很棒的功能,并将无聊的功能添加到无聊的分支。
  3. 您仍然可以继续更新无聊的分支,并可能使用它永远不会将其合并到 master。您不会失去无聊的功能。
  4. 您的主分支将具有很棒的功能。

所以,

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

答案 14 :(得分:-1)

以下步骤在由Atlassian(Bitbucket服务器)驱动的Git浏览器中执行

将{current-branch}设为master

  1. master中创建一个分支,并将其命名为“ master-duplicate”。
  2. 从{current-branch}中创建一个分支,并将其命名为“ {current-branch} -copy”。
  3. 在存储库设置(Bitbucket)中,将“默认分支”更改为指向“母版重复”(没有此步骤,您将无法删除母版-“在下一步”)。
  4. 删除“ master”分支-我从源代码树中执行了此步骤(您可以在CLI或Git浏览器中完成此操作)
  5. 将“ {current-branch}”重命名为“ master”并推送到存储库(这将创建一个新的“ master”分支,仍然存在“ {current-branch}”)。
  6. 在存储库设置中,将“默认分支”更改为指向“主”。