代码之家  ›  专栏  ›  技术社区  ›  Karel Bílek

使当前Git分支成为主分支

git
  •  1435
  • Karel Bílek  · 技术社区  · 16 年前

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

    然后,几十次的承诺之后,我意识到分支比主分支处于更好的状态,所以我希望分支“成为”主分支,而忽略主分支的变化。

    我不能合并它,因为我不想保留主控形状上的更改。我该怎么办?

    额外的 :在这种情况下,“旧”主控形状已经 push -到另一个存储库,如Github。这是如何改变事情的?

    13 回复  |  直到 8 年前
        1
  •  1866
  •   Cascabel    16 年前

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

    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
    
        2
  •  235
  •   Peter Mortensen Pieter Jan Bonestroo    9 年前

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

    git checkout master
    

    用“更好的分支”覆盖“master”:

    git reset --hard better_branch
    

    强制推送到远程存储库:

    git push -f origin master
    
        3
  •  68
  •   Dietrich Epp    16 年前

    编辑: 你没有说你推动了一个公开回购!这就是一个与众不同的世界。

    有两种方式,“肮脏”和“干净”方式。假设你的分支是命名的 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
    
        4
  •  41
  •   Alan Haggai Alavi    16 年前

    将分支重命名为 master 通过:

    git branch -M branch_name master
    
        5
  •  18
  •   Peter Mortensen Pieter Jan Bonestroo    8 年前

    根据我的理解,您可以将当前分支分支分支到现有分支。本质上,这将覆盖 master 无论您在当前分支中拥有什么:

    git branch -f master HEAD
    

    一旦你做到了这一点,你通常可以把你的本地 主人 分支,可能需要 力 这里的参数也是:

    git push -f origin master
    

    没有合并,没有长命令。简单地 branch 和 push 但是,是的, 这将改写历史 的 主人 分支,所以如果你在一个团队工作,你必须知道你在做什么。




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

    # 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
    
        6
  •  13
  •   Community Mohan Dere    9 年前

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

        -f
        --force
    

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

    如果其他人已经撤回了你的回购协议,他们将无法在没有用新的Github主分支替换他们自己的主分支(或处理大量合并)的情况下完成新的主历史记录。
    有 alternatives to a git push --force for public repos .
    Jefromi's answer (将右侧更改合并回原始主控形状)就是其中之一。

        7
  •  9
  •   Mo.    10 年前

    您还可以将另一个分支的所有文件签入master:

    git checkout master
    git checkout better_branch -- .
    

    然后提交所有更改。

        8
  •  9
  •   Peeter Joot    8 年前

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

    目标:使“支部”的现状成为“主人”

    处理分支、提交和推送更改以确保本地和远程存储库是最新的:

    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
    

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

        9
  •  5
  •   Peter Mortensen Pieter Jan Bonestroo    8 年前

    我在博客上找到了我想要的答案 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 . 除了他添加的“选项” 在下面 他的解决方案已经嵌入到我的主代码块中。

    这样更容易找到。

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

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

        10
  •  4
  •   staafl    9 年前

    再加上Jefromi的回答,如果你不想把一个无意义的合并放在 source 分支,可以为 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 分支。

    或者,如果您根本不想创建合并,只需获取 来源 并使用它们进行新的提交 目标 :

    git checkout <source>                          # fill index with contents of <source>
    git symbolic-ref HEAD <target>                 # tell git we're committing on <target>
    git commit -m "Setting contents to <source>"   # make an ordinary commit with the contents of <source>
    
        11
  •  1
  •   ar-g    8 年前

    我做事的方式如下

    #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
  •   Peter Mortensen Pieter Jan Bonestroo    8 年前

    如果您正在使用 埃吉特 在里面 日食 :

    • 右键单击项目节点。
    • 选择 团队 然后 高级 然后 重命名分支
    • 然后展开 远程跟踪 文件夹。
    • 选择名称错误的分支,然后单击“重命名”按钮,将其重命名为任何新名称。
    • 选择新的主控形状,然后将其重命名为主控形状。
        13
  •  -1
  •   Peter Mortensen Pieter Jan Bonestroo    8 年前

    以下步骤在Atlassian(BitBucket服务器)支持的Git浏览器中执行。

    将当前分支设为 master

    1. 用…做一个分支 主人 并将其命名为“主副本”。
    2. 从当前分支中创建分支,并将其命名为当前分支-副本。
    3. 在存储库设置(bitback)中,将默认分支更改为指向主副本(如果不执行此步骤,将无法删除主副本-在下一步中)。
    4. 删除__master__branch-我从源代码树执行了此步骤(您可以从CLI或Git浏览器执行此步骤)
    5. 将当前分支重命名为主分支并推送到存储库(这将创建一个新的主分支当前分支仍将存在)。
    6. 在存储库设置中,将默认分支更改为指向master。