Як видалити останні n комітетів у Github та локально?


127

Я намагаюся видалити останні 2 коміти з одного зі своїх сховищ GitHub. Я намагався , як запропонував тут : git push -f origin HEAD^^:master. Здається, це працює, оскільки два останні коміти видалені.

Потім я видалив їх із свого локального сховища за допомогою git rebase -i HEAD~2. Я видаляю рядки, пов’язані з цими комісіями, і перевіряю git log, чи правильно вони видалені.

Після цього я вношу деякі зміни у свій локальний сховище, роблю нову команду та натискаю на GitHub. Проблема полягає в тому, що в моєму обліковому записі GitHub у мене є два попередні коміти, які я намагався видалити.

Я думаю, що проблема полягає в моєму локальному сховищі, тому що якщо я клоную своє сховище Github до мого локального та вношу деякі зміни тут, коли я натискаю нову фіксацію, то старі комісії не надсилаються до GitHub.

Будь-яка ідея?

Відповіді:


199

Щоб видалити останні два комітети локально, я б запропонував використовувати:

git reset --hard HEAD^^

Rebase - це зовсім інша операція, яка вам тут не допоможе.


23
Якщо ви вже перенесли цю зміну у віддалений сховище. Видалити його можна за допомогою git push -f
Іван Фернандес

Чи можете ви узагальнити це для останньої n кількості комітетів?
user_19

6
@ user_19 ви можете робити такі речі, як git reset --hard HEAD^4або git reset --hard HEAD~4. Хоча все може ускладнитися, якщо ваша історія містить злиття. Ви можете ознайомитись з додатковою інформацією про внесення змін до відповідного розділу тут .
KL-7,

2
Якщо я хотів видалити останні 7 комітів, то ?? Чи потрібно мені ставити 7 разів ^ після ГЛАВИ ... будь ласка, очистіть мене
Гаган Гамі

4
@GaganGami, я думаю, ви б зробили це git reset --hard HEAD~7, але будь ласка, виправте мене, якщо я помиляюся.
Кон Антонакос

105

Якщо ви хочете видалити 2 (два) останні коміти, для цього є проста команда:

git reset --hard HEAD~2

Ви можете змінити 2будь-яку кількість останніх комісій, які ви хочете видалити.

І щоб натиснути цю зміну на віддалений, вам потрібно зробити git pushпараметр force ( -f):

git push -f

Тим НЕ менше, я не рекомендую робити якусь - або gitкоманду з -fабо --hardопцією , пов'язаної , якщо є нові коммітов на пульті дистанційного керування (Github) після цього фіксацій , які ви хочете видалити. У такому випадку завжди використовуйте git revert.


Чи залишаються зміни, які я внесла?
Зухайер Тахір

@SymfonyUser, ні. Коли ви зробили hardкоманду, ви втратите ці два коміти. Якщо ви хочете зберегти зміни, створіть diffфайл цих комісій, перш ніж застосувати скидання.
Дерік

3
@ZuhayerTahir якщо ви хочете просто скасувати вчинення за останні 5 коммітов то просто зробити git reset HEAD~5(не використовувати hard). Таким чином ви отримаєте зміни в поетапному стані (тобто не здійснені). Для мене я бачу цю відповідь .
Мед

@Honey Дякую за вашу відповідь Я прийшов до такого ж висновку.
Зухайер Тахір

29

Наступні роботи для мене

git reset HEAD~n

Він видаляє останні nкомісії з локального репо, оскільки HEAD^видаляє лише один. Якщо вам потрібно видалити ці зміни з віддаленого, можливо, вам доведеться змусити натиснути, оскільки ви опинитеся позаду.

git push -f origin <branch>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.