我有三个提交,我试图清理一些代码。无论如何,我设法彻底摧毁了我正在做的事情。我想删除过去三次提交并返回到特定的提交SHA1。Git重置为以前的提交
如何恢复到以前的提交并删除这3个提交的历史记录? (历史删除部分不是什么大问题)。这些提交已经被推送了,所以我有点失落。
谢谢!
我有三个提交,我试图清理一些代码。无论如何,我设法彻底摧毁了我正在做的事情。我想删除过去三次提交并返回到特定的提交SHA1。Git重置为以前的提交
如何恢复到以前的提交并删除这3个提交的历史记录? (历史删除部分不是什么大问题)。这些提交已经被推送了,所以我有点失落。
谢谢!
由于您的提交是远程推送的,因此您需要将其删除。我会假设你的分支是master
,它被推过origin
。
您首先需要删除master
从origin
:
git push origin :master
(注意冒号)
然后,你需要得到master
到你想要的状态,我会认为提交哈希ABCDE
:
git reset --hard ABCDE
最后,再次按下master
:
git push origin master
就是这样!请注意,如果有人已经从origin
下载了您的更改,这将使他们几乎完全离开本地回购站。
这看起来很有帮助,所以我只是试了一下,但是在'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
最有用的,谢谢: – almaruf 2016-08-24 15:37:40
在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 add
和git commit
它,那将是一个名为新的分支my_work_branch
。旧的,有三个额外的提交,现在是一个“垃圾”分支。 (如果你决定尽管你想让他们失望,你只需给他们一个名字,然后在大约3个月内过期,你必须在上面的例子中找到或记住这个号码,d97de0e)
您不必删除远程分支。完成上述倒带(git reset --hard
)后,您可以使用git push -f
。请记住,其他任何取得了推送更改的人都有他们,并且会继续拥有他们,并且很容易被他们的存在所迷惑。您必须提醒任何此类人员提防您的“已撤销”提交。
很好的解释! – 2013-05-31 03:20:14
找到承诺要恢复到:一旦你的哈希
git log
:
git reset --hard <hash>
而推远程到:
git push -f <remote> <branch>
当你没有将不需要的提交推送到远程时,这一点是完美的。 – 2015-04-27 00:16:13
使用git复归
- 你可以恢复到一个,两个或范围的承诺
- 它会删除提交历史也
1)git的恢复175a25
2)git的状态/日志的git(以确认您已经回复)
3)git push
你有3个本地提交,你想回去并永远擦除它们?这些提交是远程推送的吗? – 2012-03-19 02:36:48
是的,它们被远程推送。这就是为什么我很困惑。我希望他们永远消失。 – Steven 2012-03-19 02:37:13
这是可能的,让我回答 – 2012-03-19 02:38:31