Подтвердить что ты не робот

Git reset к предыдущему фиксации

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

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

Спасибо!

4b9b3361

Ответ 1

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

Сначала вам нужно удалить master из origin:

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

Затем вам нужно получить master к статусу, который вы хотите, я предполагаю, что хеш фиксации ABCDE:

git reset --hard ABCDE

Наконец, нажмите master еще раз:

git push origin master

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

Ответ 2

Найдите фиксацию, которую хотите reset, чтобы:

git log

Как только у вас есть хэш:

git reset --hard <hash>

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

git push -f <remote> <branch>

Ответ 3

Общая идея в 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 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 where you started

Просто у них больше нет имен, а если вы выполните некоторую работу и git add и git commit, то это будет в новой ветки с именем my_work_branch. Старый, который имеет три дополнительных фиксации, теперь является ветвью "мусор". (Если вы решите, что, несмотря на мрачность, которую вы хотите вернуть, вам нужно только дать им имя до истечения примерно 3 месяцев. > Обновление: ах, вы нажали их, и вы хотите, чтобы они ушли из удаленного репозитория.

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

Ответ 4

использовать git revert

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

- он также удалит историю фиксации

1) git вернуть 175a25

2) git статус / git журнал (чтобы подтвердить, что вы вернулись)

3) git нажмите

Ответ 5

Хорошо, вот два решения.

Для любого решения git log и найдите хэш коммита, к которому вы хотите вернуться.

1) Отменить изменения, автоматически создав патч для их отмены.

Какие? Автоматически создайте обратный патч, чтобы отменить ваши изменения. Передайте и нажмите патч. Ваши оригинальные изменения все еще находятся в журнале git, но они "отменены" с помощью этого обратного патча.

Как? git revert [hash] && git push

Зачем? Потому что вы хороший разработчик, работающий с другими хорошими разработчиками и не хотите разрушать их локальные репозитории.

Почему бы и нет? Потому что потом сложнее "слить" ваши изменения. Патч возврата "новее", чем ваши изменения, поэтому сложнее, чем "git merge", повторно применить ваши изменения.

2) Принудительное нажатие на предыдущий коммит

Какие? Ветвь - это указатель на коммит. Переустановите указатель на предыдущий коммит, затем принудительно передайте этот указатель на сервер. Ваши изменения (и все остальные) удаляются из истории git.

Как? git reset --hard [hash] && git push -f

Зачем? Поскольку вы дикий ковбой/пастушка, и ваши изменения находятся в той ветке функций, над которой вы хотели бы продолжить работу, чтобы потом легко слиться.

Почему бы и нет? Ваш сброс и нажатие испортят все локальные репо для товарищей по команде, которые уже потянули ваши изменения (например, потеря их коммитов, необходимость возобновить работу). Если вы не нажали (или они не потянули), не проблема.

Ответ 6

Например, если вы хотите избавиться от двух последних коммитов, вы можете сделать это:

git log -3
commit 7e83c9fa5dc1a1914847bfccfe9d2da14f845070
Author: Jaime Montoya <[email protected]>
Date:   Fri Sep 28 05:58:58 2018 -0600

    Add new background image to the header of the website.

commit b84b0c38df2f876d1c1f5657e6e452b5689c2d80
Author: Shannon Hall <[email protected]>
Date:   Thu Sep 27 21:35:48 2018 -0400

    Include code for Google Maps.

commit 40e82f46c1d523cb07abb6abe9f8c64f2b4fe0f7
Author: Jaime Montoya <[email protected]>
Date:   Thu Sep 27 18:57:45 2018 -0600

    Update links to copyright messages.

В этом случае мы пытаемся избавиться от этих двух 7e83c9fa5dc1a1914847bfccfe9d2da13f845070: 7e83c9fa5dc1a1914847bfccfe9d2da13f845070 и b84b0c38df2f876d1c1f5657e6e255b5689c2d80. Мы хотим, чтобы это было нашим последним коммитом: 40e82f46c1d523cb07abb6abe9f8c64f2b4fe0f7. Нам нужно сделать это:

git reset --hard 40e82f46c1d523cb07abb6abe9f8c64f2b4fe0f7

Это один из способов отменить коммиты из вашего локального репозитория.

После вышесказанного вы отправляете в удаленный репозиторий с помощью git push <remote> <branch>.