我在Git中有一个存储库。我做了一个分支,然后对主分支和分支都做了一些更改。
然后,几十次提交之后,我意识到分支的状态比主分支好得多,所以我希望分支“成为”主分支,并忽略对主分支的更改。
我无法合并它,因为我不想将更改保留在master上。我该怎么办?
额外:在本例中,“旧”主控已被推送到另一个存储库,如GitHub。这是如何改变事情的?
我在Git中有一个存储库。我做了一个分支,然后对主分支和分支都做了一些更改。
然后,几十次提交之后,我意识到分支的状态比主分支好得多,所以我希望分支“成为”主分支,并忽略对主分支的更改。
我无法合并它,因为我不想将更改保留在master上。我该怎么办?
额外:在本例中,“旧”主控已被推送到另一个存储库,如GitHub。这是如何改变事情的?
当前回答
如果您在Eclipse中使用eGit:
在项目节点上单击鼠标右键。选择团队→ 然后是高级→ 然后重命名分支然后展开远程跟踪文件夹。选择名称错误的分支,然后单击重命名按钮,将其重命名为任何新名称。选择新的主控形状,然后将其重命名为主控形状。
其他回答
编辑:你没说你已经推到了公开回购!这是天壤之别。
有两种方式,“脏”的方式和“干净”的方式。假设您的分支名为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
这里给出的解决方案(在“master”中重命名分支)并不坚持远程(GitHub)回购的后果:
如果在创建该分支之后没有推送任何内容,那么可以重命名它并推送它,而不会有任何问题。如果你在GitHub上有push master,你需要“git push-f”新分支:你不能再以快进模式进行push了。
-f --force
通常,该命令拒绝更新远程引用,该远程引用不是用于覆盖它的本地引用的祖先。此标志禁用检查。这可能会导致远程存储库丢失提交;小心使用。
如果其他人已经删除了你的repo,那么如果不使用新的GitHub主分支替换自己的主分支(或者处理大量合并),他们就无法删除新的主历史记录。对于公共回购而言,除了git push,还有其他选择。Jefromi的答案(将正确的更改合并回原始主控形状)就是其中之一。
对我来说,我希望我的开发分支在领先之后回到主分支。
在开发过程中:
git checkout master
git pull
git checkout develop
git pull
git reset --hard origin/master
git push -f
为了补充Cascabel的答案,如果你不想在源分支的历史中放置一个无意义的合并,你可以为我们的合并创建一个临时分支,然后扔掉它:
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
这样,合并提交将只存在于目标分支的历史记录中。
或者,如果您根本不想创建合并,您可以简单地获取源的内容,并将其用于目标上的新提交:
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>