首页 > 解决方案 > 恢复远程分支上的提交

问题描述

我向我的主分支提交了两次提交,然后将它们推送到远程分支。

我现在决定在这两个提交之前回到我的原始代码,因此选择了我的原始提交,并使用 Reset Master 来提交(使用 SourceTree)。然后我做了一些改变并提交了这些。

问题是当我尝试推送到遥控器时,它告诉我需要先获取。我可以通过强制推送来解决这个问题,但我想保留我的提交历史。

如果不创建新分支,这可能吗?

标签: gitversion-controlatlassian-sourcetree

解决方案


TL;DR用于git revert撤消要删除的提交,以记录您正在撤消它们的事实,然后合并或变基。

细节

为了使您的历史记录在将来尽可能容易理解,我将首先在 master 分支上恢复您不想保留的两个提交。

由于您在master要保留的本地分支上有提交,因此我将暂时创建另一个分支origin/master以使事情变得更简单。

git checkout origin/master
git checkout -b dev.about-to-revert

现在,创建“还原”提交以撤消您不想保留的两个提交:

git revert <commit to revert>
git revert <commit to revert>

来自git revert 手册:“给定一个或多个现有提交,还原相关补丁引入的更改,并记录一些记录它们的新提交。”

因此,现在分支dev.about-to-revert的代码与两次提交之前的代码相同origin/master,您可以在新工作中变基或合并。

变基:

git checkout master
git rebase dev.about-to-revert

或合并

git checkout master
git merge dev.about-to-revert

如果您希望合并的父级在另一个方向上,或者以另一种方式合并:

git merge master
git checkout master
git merge dev.about-to-revert

现在你已经完成了,dev.about-to-revert所以你可以摆脱它:

git branch -d dev.about-to-revert

PS:您问“是否可以在不创建新分支的情况下这样做”。我假设您不想在远程推送一个新分支,但是在您的沙箱中临时创建一个仍然可以。有一些方法可以在没有新分支的情况下执行我在这里展示的相同操作,在分离的 HEAD 上执行还原,但它更简单,如下所示。


推荐阅读