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

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

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

额外:在本例中,“旧”主控已被推送到另一个存储库,如GitHub。这是如何改变事情的?


当前回答

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

如果在创建该分支之后没有推送任何内容,那么可以重命名它并推送它,而不会有任何问题。如果你在GitHub上有push master,你需要“git push-f”新分支:你不能再以快进模式进行push了。

    -f
    --force

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

如果其他人已经删除了你的repo,那么如果不使用新的GitHub主分支替换自己的主分支(或者处理大量合并),他们就无法删除新的主历史记录。对于公共回购而言,除了git push,还有其他选择。Jefromi的答案(将正确的更改合并回原始主控形状)就是其中之一。

其他回答

我很惊讶这里没有答案。这就是我所做的。

在我的文件系统中的不同目录中制作了两个repo副本,一个是主副本,另一个是分支副本。将分支中的所有文件(手动)复制到主文件已将更改提交给master。

这样,就有了一个包含所有差异的提交,保存了提交历史,不需要强制推送。

我的做事方式如下

#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

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

如果在创建该分支之后没有推送任何内容,那么可以重命名它并推送它,而不会有任何问题。如果你在GitHub上有push master,你需要“git push-f”新分支:你不能再以快进模式进行push了。

    -f
    --force

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

如果其他人已经删除了你的repo,那么如果不使用新的GitHub主分支替换自己的主分支(或者处理大量合并),他们就无法删除新的主历史记录。对于公共回购而言,除了git push,还有其他选择。Jefromi的答案(将正确的更改合并回原始主控形状)就是其中之一。

如果您在Eclipse中使用eGit:

在项目节点上单击鼠标右键。选择团队→ 然后是高级→ 然后重命名分支然后展开远程跟踪文件夹。选择名称错误的分支,然后单击重命名按钮,将其重命名为任何新名称。选择新的主控形状,然后将其重命名为主控形状。

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

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