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

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

后来几十次提交,我意识到分支比主人要好得多,所以我要分支变成主人,不顾主人的变化。

我不能合并它,因为我不想保留在主人的变化。 我该怎么办?

额外 :在这种情况下,“旧”主已push送到另一个存储库,如GitHub。 这是如何改变的?

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

 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 master 

用“better_branch”覆盖“master”:

 git reset --hard better_branch 

强制推送到远程存储库:

 git push -f origin 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 

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

 git branch -M branch_name master 

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

  • 如果自从创建该分支以来没有推送任何内容,则可以重新命名并推送它,而不会造成任何问题。
  • 如果你在GitHub上推动主机,你需要'git push -f'新的分支: 你不能再推进快进模式 。
     -F
     - 力

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

如果其他人已经把你的回购,他们将无法拉动新的主历史,而不用新的GitHub主分支(或处理大量的合并)替换自己的主人。
对于公共回购,还有其他的git push –force 。
Jefromi的答案 (把正确的变化合并回原来的主人)就是其中之一。

据我所知,你可以将当前的分支分支到现有的分支。 从本质上讲,这将会覆盖当前分支中的任何东西:

 git branch -f master HEAD 

完成之后,通常可以推送本地master分支,可能还需要force参数:

 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 

也可以将另一个分支中的所有文件检出到master中:

 git checkout master git checkout better_branch -- . 

然后提交所有更改。

要增加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分支的历史记录中。

或者,如果您不想创建合并,则可以简单地获取source的内容并将其用于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> 

我发现这个简单的方法是最好的。 它不会重写历史记录,并且所有以前的分支签入都将被附加到主数据库中。 没有什么是丢失的,你可以清楚地看到在提交日志中发生了什么。

目标:使“分支”现状成为“主”

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

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

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

如果您在Eclipse中使用eGit

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

使用:

 get fetch && git checkout branch