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


128

Я пытаюсь удалить последние 2 коммита из одного из моих репозиториев GitHub. Я пытался , как предложил здесь : git push -f origin HEAD^^:master. Вроде работает, так как последние два коммита удалены.

Затем я удалил их из своего локального репозитория с помощью git rebase -i HEAD~2. Я удаляю строки, связанные с этими коммитами, и проверяю git log, правильно ли они удалены.

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

Я думаю, что проблема в моем локальном репозитории, потому что, если я клонирую свой репозиторий Github в свой локальный и внесу здесь некоторые изменения, когда я нажимаю новый коммит, эти старые коммиты не отправляются в GitHub.

Любая идея?

Ответы:


201

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

git reset --hard HEAD^^

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


24
Если вы уже отправили это изменение в удаленный репозиторий. Вы можете удалить его с помощью git push -f
Иван Фернандес

Можете ли вы обобщить это для последних n коммитов?
user_19

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

2
Если бы я хотел удалить последние 7 коммитов, тогда ?? Нужно ли мне ставить 7 раз ^ после HEAD ... пожалуйста, очистите меня
Гаган Гами

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

105

Если вы хотите удалить 2 (два) последних коммита, для этого есть простая команда:

git reset --hard HEAD~2

Вы можете изменить 2любое количество последних коммитов, которое хотите удалить.

И чтобы перенести это изменение на удаленный, вам нужно сделать git pushс силой ( -f):

git push -f

Однако я не рекомендую выполнять какие-либо gitкоманды -fили --hardпараметры, если после этого на удаленном компьютере (Github) появились новые коммиты, которые вы хотите удалить. В этом случае всегда используйте .git revert


Сохраняются ли внесенные мной изменения?
Зухайер Тахир

@SymfonyUser, нет. Когда вы сделали hardкоманду, вы потеряете эти две фиксации. Если вы хотите сохранить изменения, diffперед применением сброса создайте файл этих коммитов.
Dherik

3
@ZuhayerTahir если вы хотите просто отменить совершение за последние 5 коммитов то просто сделать git reset HEAD~5(не использовать hard). Таким образом, вы получите свои изменения в поэтапном состоянии (т.е. не зафиксированы). Для меня этот ответ .
Дорогая,

@Honey Спасибо за ответ. Я пришел к такому же выводу.
Zuhayer Tahir

29

Следующие работы для меня

git reset HEAD~n

Он удаляет последние nкоммиты из локального репо, так как HEAD^удаляет только один. Если вам нужно удалить эти изменения с пульта дистанционного управления, вам может потребоваться принудительное нажатие, так как вы будете за удаленным.

git push -f origin <branch>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.