2012-03-19 100 views
23

我有三个提交,我试图清理一些代码。无论如何,我设法彻底摧毁了我正在做的事情。我想删除过去三次提交并返回到特定的提交SHA1。Git重置为以前的提交

如何恢复到以前的提交并删除这3个提交的历史记录? (历史删除部分不是什么大问题)。这些提交已经被推送了,所以我有点失落。

谢谢!

+0

你有3个本地提交,你想回去并永远擦除它们?这些提交是远程推送的吗? – 2012-03-19 02:36:48

+0

是的,它们被远程推送。这就是为什么我很困惑。我希望他们永远消失。 – Steven 2012-03-19 02:37:13

+0

这是可能的,让我回答 – 2012-03-19 02:38:31

回答

25

由于您的提交是远程推送的,因此您需要将其删除。我会假设你的分支是master,它被推过origin

您首先需要删除masterorigin

git push origin :master(注意冒号)

然后,你需要得到master到你想要的状态,我会认为提交哈希ABCDE

git reset --hard ABCDE

最后,再次按下master

git push origin master

就是这样!请注意,如果有人已经从origin下载了您的更改,这将使他们几乎完全离开本地回购站。

+6

这看起来很有帮助,所以我只是试了一下,但是在'git clone [email protected]:dandv/reveal.js.git'后出现这个错误, 'git push origin:master':> remote:error:拒绝删除当前分支:refs/heads/master 要[email protected]:dandv/reveal.js.git ! [远程拒绝]主人(删除当前分支禁止) 错误:未能推动一些裁判'[email protected]:dandv/reveal.js.git' – 2012-11-13 09:20:58

+0

最有用的,谢谢: – almaruf 2016-08-24 15:37:40

14

在git中的一般想法是,你永远不会删除提交。你只是留下他们没有名字。既不命名也不被其他命名提交引用的提交最终会自行消失。

例如,假设你开始:

$ git checkout my_work_branch 
<do some editing> 
$ git commit -m "attempt #1, so far so good" 
<do more editing> 
$ git commit -m "attempt #2, getting a little hazier" 
<do more editing> 
$ git commit -m "attempt #3, looking bleak now" 

此时git log --graph --decorate --pretty=oneline --abbrev-commit可能会产生这样的:

* d97de0e (HEAD, my_work_branch) attempt #3, looking bleak now 
* 9a3efe3 attempt #2, getting a little hazier 
* 9e80936 attempt #1, so far so good 
* a1d6424 here's where you started 

你现在有什么是该分支命名为my_work_branch(你给的名字先前)“指向”提交d97de0e,后者又指向9a3efe3,指向9e80936,指向a1d6424。 (这也是特殊名称HEAD指向的地方。)

您可以将HEAD移动到其他任何位置的旧git checkout。但是,这里的东西:你可以移动名称my_work_branch指向a1d6424太:

$ git reset --hard a1d6424 

$ git reset --hard HEAD~3 # use at most one of these 

如果你这样做,你会发现这个名字my_work_branch也已经感动:

$ git rev-parse my_work_branch 
a1d6424e5afcda475910084720c9aa26e3528618 

的承诺您添加仍然存在:

$ git log d97de0e 

将他们展示给你看:

$ git log --graph --decorate --pretty=oneline --abbrev-commit d79de0e 
* d97de0e attempt #3, looking bleak now 
* 9a3efe3 attempt #2, getting a little hazier 
* 9e80936 attempt #1, so far so good 
* a1d6424 (HEAD, my_work_branch) here's where you started 

这只是他们不再有任何名字,如果你做了一些工作,并git addgit commit它,那将是一个名为新的分支my_work_branch。旧的,有三个额外的提交,现在是一个“垃圾”分支。 (如果你决定尽管你想让他们失望,你只需给他们一个名字,然后在大约3个月内过期,你必须在上面的例子中找到或记住这个号码,d97de0e)


Update :啊,你推他们,你想他们离开远程存储库。

您不必删除远程分支。完成上述倒带(git reset --hard)后,您可以使用git push -f。请记住,其他任何取得了推送更改的人都有他们,并且会继续拥有他们,并且很容易被他们的存在所迷惑。您必须提醒任何此类人员提防您的“已撤销”提交。

+0

很好的解释! – 2013-05-31 03:20:14

40

找到承诺要恢复到:一旦你的哈希

git log 

git reset --hard <hash> 

而推远程到:

git push -f <remote> <branch> 
+0

当你没有将不需要的提交推送到远程时,这一点是完美的。 – 2015-04-27 00:16:13

0

使用git复归

- 你可以恢复到一个,两个或范围的承诺

- 它会删除提交历史也

1)git的恢复175a25

2)git的状态/日志的git(以确认您已经回复)

3)git push