2012-03-19 4 views
23

У меня есть три коммиты, которые я сделал, и попытался очистить код. В любом случае мне удалось полностью уничтожить то, над чем я работал. И я хочу удалить последние три коммита и вернуться к определенному commit SHA1.Git reset to previous commit

Как восстановить предыдущую фиксацию и удалить историю этих трех коммитов? (Часть, удаляющая историю, не имеет большого значения). Эти коммиты уже выдвинуты, поэтому я немного потерялся.

Спасибо!

+0

у вас есть 3 локальных коммита, и вы хотите вернуться и стереть их навсегда? эти коммиты толкаются удаленно? –

+0

Да, они удалены дистанционно. Вот почему я смущен. И я хочу, чтобы они ушли навсегда. – Steven

+0

это возможно, позвольте мне ответить –

ответ

25

Поскольку ваши фиксации удаляются удаленно, их необходимо удалить. Я предполагаю, что ваш филиал master, и он переместился на origin.

Сначала необходимо удалить master из origin:

git push origin :master (обратите внимание на двоеточие)

Тогда вам нужно получить master к статусу вы хотите, я буду считать, коммит хэш ABCDE:

git reset --hard ABCDE

Наконец, нажмите master снова:

git push origin master

Это все! Обратите внимание, что если кто-то уже скачал ваши изменения с origin, это сильно их ввернет, оставив их местные репозитории неустойчивыми.

+6

Это выглядело полезным, поэтому я просто попробовал, но я получил эту ошибку после 'git clone [email protected]: dandv/discovery.js.git' и 'git push origin: master':> remote: ошибка: отказ удалить текущую ветку: refs/heads/master To [email protected]: dandv/discovery.js.git ! [удаленный отклоненный] мастер (удаление запрещенной ветки запрещено) Ошибка: не удалось нажать некоторые ссылки на «[email protected]: dandv/discovery.js.git» –

+0

наиболее полезно, спасибо: – almaruf

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 (имя, которое вы дали ранее) «указывает на» commit 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 месяцев. : ах, вы подтолкнули их, и вы хотите, чтобы они ушли из удаленного репозитория.

Вам не нужно удалять удаленную ветку. Вы можете использовать git push -f после выполнения перемотки (git reset --hard) выше. Просто помните, что у кого-то, кто воспользовался вашими изменениями, есть их, и они будут продолжать их использовать и могут легко запутаться в их присутствии. Вы должны будете предупредить всех таких людей, чтобы остерегаться ваших «отозванных» коммитов.

+0

Отличное объяснение! –

40

Найти фиксации вы хотите восстановить:

git log 

После того, как у вас есть хэш:

git reset --hard <hash> 

И толкать на пульте дистанционного управления:

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

Это просто отлично, когда вы не нажимали нежелательные фиксации на пульт. –

0

использование мерзавец REVERT

- вы можете вернуться к одному, два или диапазону фиксации

- это удалит историю совершить также

1) мерзавца вернуться 175a25

2) Статус мерзавца/Журнал мерзавца (чтобы подтвердить, что вы вернулись)

3) git push