我有三個提交,我試圖清理一些代碼。無論如何,我設法徹底摧毀了我正在做的事情。我想刪除過去三次提交併返回到特定的提交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