2012-03-19 47 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