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

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

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

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


当前回答

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

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

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

其他回答

对我来说,我希望我的开发分支在领先之后回到主分支。

在开发过程中:

git checkout master
git pull

git checkout develop
git pull

git reset --hard origin/master
git push -f

只需访问gitlab或github网站,查找设置即可。

然后在设置下查找存储库。

在那里找到默认分支,展开它,您可以获得重命名它或将其更改为其他分支的选项。

我在gitlab尝试过,结果成功了。

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

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

为了补充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>

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

目标:使“分支”的当前状态成为“主”

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

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

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