Общая идея в 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
) выше. Просто помните, что у кого-то, кто воспользовался вашими изменениями, есть их, и они будут продолжать их использовать и могут легко запутаться в их присутствии. Вы должны будете предупредить всех таких людей, чтобы остерегаться ваших «отозванных» коммитов.
у вас есть 3 локальных коммита, и вы хотите вернуться и стереть их навсегда? эти коммиты толкаются удаленно? –
Да, они удалены дистанционно. Вот почему я смущен. И я хочу, чтобы они ушли навсегда. – Steven
это возможно, позвольте мне ответить –