Git还原了几个提交

时间:2016-06-29 18:12:01

标签: git git-reset git-revert

我已经向我的本地分支estimation做了几次提交,并将它们推送到远程分支estimation

现在,我想完全删除最后3次提交。

我尝试了git reset HEAD^git reset HEAD --hard 3次但是当我试图推动更改时,它抱怨HEAD的尖端未对齐。

我该怎么办?

修改

历史如下:

commit e572aab4e18

commit e21e7310bc4

commit 4f372a513da

commit 31a4ac607ae

commit a1a6e3f02dd

我想删除前4并返回commit a1a6e3f02dd并在同一HEAD上创建本地和远程分支。

3 个答案:

答案 0 :(得分:5)

如果您已经推送了提交(并且不想在远程存储库中执行强制推送和覆盖数据,那么您可以执行以下操作):

您可以使用git revert代替git reset

$ git revert ~4..HEAD

或者您可以使用git checkout然后提交更改:

$ git checkout ~3 -- .
$ git commit

git revert将执行3次单独的还原提交。 git checkout方法允许您仅在一次提交中还原更改。

在您的情况下,您可以这样做:

$ git reset --hard $REMOTE/$BRANCH
$ git checkout a1a6e3f02dd -- .
$ git commit

答案 1 :(得分:3)

首先:您应该只针对您不共享的分支执行此操作;如果分支被其他人检出,则此过程将使其本地副本与远程同步,并且他们将无法再将提交推送到分支。这可以解决,但它可能是一团糟。

鉴于此,如果我理解正确,你就是这种情况:

xxxxxxx Bad commit #3
yyyyyyy Bad commit #2
zzzzzzz Bad commit #3
wwwwwww This and everything before it are fine

您希望在wwwwwwww之后删除提交并修复远程分支以匹配。

首先,备份你正在进行手术的分支,这样你就可以恢复它,如果你陷入困境,然后切换回你想要删除提交的分支。

git checkout -b broken-estimation
git checkout estimation

运行git log以查找要保留的第一个提交的SHA1。拥有该SHA1后,将分支重置为:

git reset --hard kkkkkkk

其中kkkkkk是您要保留在分支上的第一个提交的SHA1。

再次运行git log以确保您已获得所需的SHA1作为此分支的提示;它应该是您在git log输出中看到的第一个提交。如果您没有删除足够的提交,请使用正确的SHA1重做git reset --hard以删除更多提交。

如果您删除了太多提交,请从您所做的备份中恢复estimation分支:

git checkout -B estimation broken-estimation

并重做git log以查找提示所需提交的SHA1,然后git reset --hard kkkkkkkkkkkkkk是您实际想要的SHA1)删除不需要的提交在那次提交之后。

一旦你的分支处于所需的状态,你可以将固定分支推送到远程,取代旧版本:

git push -f the_proper_remote estimation

一旦确定您的维修是正确的,您可以删除分支的备份副本:

git branch -d broken-estimation

答案 2 :(得分:0)

您可以使用三个命令执行此操作:

首先,重写远程分支的历史记录:

git push origin +a1a6e3f02dd:estimation

注意,“+”使它成为“强制推动”。此命令说“强制a1a6e3f02dd为原点/估计分支的顶端。”

一旦完成,你只需要让你的本地“估计”分支与远程分支同步:

git checkout estimation
get reset --hard origin/estimation

你已经完成了!但是要预先警告:“git reset --hard”会爆炸你在该项目中所做的任何未提交的工作。

如果其他人也在使用'估计'分支,并且他们已经将你的4个“坏”提交到他们的分支中,那么将会出现一些协调混乱。但根据我的经验,所有关于“永远不会改写共享分支历史”的警告和警告都被夸大了。应该重申:永远不要重写长期共享分支的历史记录。