使当前的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
没有合并,没有长的命令。 简单的branch
和push
– 但是,是的, 这将重写 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