Как отменить коммит git в удаленном репозитории
Перейти к содержимому

Как отменить коммит git в удаленном репозитории

Как удалить коммит в удаленном репозитории?

Сделал коммит. Не заметил как в него попала пара сотен МБт дерьмища. Потом запушил и тут я обнаружил свой косяк. Подскажите, как в удаленном и локальном репозитории удалить последний коммит с сохранением изменений в рабочей дирректории?

git reset —hard HEAD~1 неподходит, т.к. возвращает меня к комиту 3х месячной давности! Нужно удалить коммит, но чтобы все изменения в рабочей директории сохранились! Спасибо!

NkDev
09.06.18 12:05:29 MSK

Чем не устраивает —soft?

oldstable ★
( 09.06.18 12:08:21 MSK )

1. удаляешь коммит локально (например, через git rebase -i)

2. git push -f origin branchname

waker ★★★★★
( 09.06.18 12:08:24 MSK )

Это банальный и частый вопрос, ответ на который находится за пару минут в гугле.

Deleted
( 09.06.18 12:10:54 MSK )

reset без —hard. —soft/—mixed на выбор. Далее вычищаешь всё ненужно, commit, push -f

Deleted
( 09.06.18 12:11:04 MSK )

git revert HEAD git push 

. и нет проблем синхронизации.

KennyMinigun ★★★★★
( 09.06.18 12:31:29 MSK )
Последнее исправление: KennyMinigun 09.06.18 12:32:16 MSK (всего исправлений: 1)

Ответ на: комментарий от KennyMinigun 09.06.18 12:31:29 MSK

Смотри-ка, сколько в трэде любителей push —force!

Deleted
( 09.06.18 12:33:56 MSK )
Ответ на: комментарий от KennyMinigun 09.06.18 12:31:29 MSK

. и есть огромные проблемы с размером репозитория!

в него попала пара сотен МБт дерьмища

EXL ★★★★★
( 09.06.18 12:43:13 MSK )

EXL ★★★★★
( 09.06.18 12:46:15 MSK )
Ответ на: комментарий от oldstable 09.06.18 12:08:21 MSK

или git commit —amend

i-rinat ★★★★★
( 09.06.18 12:47:28 MSK )

Через git rm удалить всё ненужное.
Потом git commit —amend, чтобы ранее добавленное и свежеудалённое аннигилировались.
Потом push —force, чтобы перезаписать последний коммит.
Profit!

akk ★★★★★
( 09.06.18 12:53:35 MSK )
Ответ на: комментарий от Deleted 09.06.18 12:33:56 MSK

А как ещё ты предлагаешь удалять часть истории?

Miguel ★★★★★
( 09.06.18 12:54:48 MSK )
Ответ на: комментарий от Miguel 09.06.18 12:54:48 MSK

В сабжевом случае хорошо подходит это. В том и цимес же, что историю на remote удолять не надо )

Deleted
( 09.06.18 13:13:37 MSK )
Ответ на: комментарий от akk 09.06.18 12:53:35 MSK

+1, сам так делаю, когда накосячу 🙂

htower_ ★★
( 09.06.18 13:21:51 MSK )

Не заметил как в него попала пара сотен МБт дерьмища

Кстати, ТС, а как это случилось? Убогий gitignore?

Deleted
( 09.06.18 13:23:59 MSK )
Ответ на: комментарий от Deleted 09.06.18 13:13:37 MSK

Каким образом это подходит, если при этом подходе до скончания времен при любом git clone будет тянутся

EXL ★★★★★
( 09.06.18 13:33:15 MSK )
Последнее исправление: EXL 09.06.18 13:33:28 MSK (всего исправлений: 1)

Ответ на: комментарий от Deleted 09.06.18 13:13:37 MSK

Во-первых, вопрос именно о том, как её удалить.

Во-вторых, почему не надо-то? Мастер не стоит, но пока это моя бранча — что хочу, то и ворочу.

Miguel ★★★★★
( 09.06.18 13:33:31 MSK )
Ответ на: комментарий от Miguel 09.06.18 13:33:31 MSK

пока это моя бранча — что хочу, то и ворочу.

Даже если твой бранч уже смержили в мастер?

tailgunner ★★★★★
( 09.06.18 13:34:24 MSK )
Ответ на: комментарий от EXL 09.06.18 13:33:15 MSK

Не так уж и много + clone не каждый день/неделя/месяц.

А так да, на это внимания не обратил

Deleted
( 09.06.18 13:36:36 MSK )
Ответ на: комментарий от Miguel 09.06.18 13:33:31 MSK

Вот здесь не понял. С чего ты взял, что это не общая ветка?

Deleted
( 09.06.18 13:38:12 MSK )
Ответ на: комментарий от Deleted 09.06.18 13:36:36 MSK

Лучше перезапись последнего коммита с push —force в remote, чем мусор на несколько сотен мегабайт в репозитории, который поди

И за убожество вида revet ‘my shit commit’ в истории тоже надо линчевать.

EXL ★★★★★
( 09.06.18 13:42:22 MSK )
Ответ на: комментарий от EXL 09.06.18 13:42:22 MSK

И за убожество вида revet ‘my shit commit’ в истории тоже надо линчевать

Линчевать много за что можно, но иногда выбора нет. К тому же, смотря на сколько

В случае тонких ошибок полезно это в репе оставить, в назидание, так сказать. К сабжу это не относится, но там по-другому можно повернуть: какого хера gitignore не заюзали? А скорее всего — заюзали, но там шаблонов подходящих не было(на все случаи не напасёшься). Было бы неплохо иметь, скажем gitaccept, указывая какие файлы _отслеживать_, а не какие игнорировать. Через gitignore тоже можно, но там костыльно — сомневаюсь, что пригодно для продакшена. Сколько здесь кандидатур на линчевание?)

Deleted
( 09.06.18 13:51:34 MSK )
Ответ на: комментарий от Deleted 09.06.18 13:51:34 MSK

Из зол вида «сотни МБ хлама в БД до скончания веков» и «перезапись последнего запушенного коммита» — первая куда как больше.

Я очень сильно сомневаюсь, что у ТС огромный и оверпопулярный репозиторий, который форкают каждый день и каждый час отправляют в него PR’ы. А потому этот —force скорее всего никто кроме TC и не заметит.

Как удалить коммиты с удаленного компьютера в Git

Как удалить коммиты с удаленного компьютера в Git

Манипуляции с историей очень распространены среди разработчиков, регулярно работающих с Git. Действительно, разработчикам часто приходится удалять коммиты из истории Git. К счастью, Git предоставляет множество команд, позволяющих сделать эту операцию возможной.

Приступаем к делу ��.

Шаг 0 — Подготовка

Прежде чем манипулировать историей Git, убедитесь, что в вашем рабочем каталоге нет никаких изменений, используя команду git status.

Шаг 1. Локальное удаление коммитов

Чтобы удалить коммиты с удаленного сервера, сначала вам нужно будет удалить их из вашей локальной истории.

1.1 Для последовательных коммитов сверху

Если коммиты, которые вы хотите удалить, находятся вверху истории коммитов, используйте команду git reset —hard с объектом HEAD и количеством коммитов, которые вы хотите удалить.

git reset —hard HEAD~1

Эта команда удалит последнюю фиксацию.

git reset —hard HEAD~3

Эта команда удалит последние три коммита.

Вы также можете удалить до определенного коммита, используя хэш коммита, например:

1.2 Для непоследовательных коммитов

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

  • [ ] Найдите хэш последнего коммита, содержащий все коммиты, которые вы хотите удалить, с помощью команды git reflog .
  • [ ] Запустите интерактивную перебазировку с помощью git rebase -i .
  • [ ] На экране редактирования найдите строки фиксации, которые вы хотите удалить, и удалите их.
  • [ ] Сохранить и выйти (может потребоваться разрешить конфликты)
  • [ ] Завершите интерактивную перебазировку с помощью git rebase —continue или начните заново, прервав перебазирование.

Шаг 2 — Удалить коммиты с удаленного сервера

Чтобы удалить коммиты с удаленного сервера, вам нужно отправить свои локальные изменения на удаленный сервер с помощью команды git push.

git push origin HEAD —force

Поскольку ваша локальная история отличается от удаленной истории, вам нужно использовать опцию «force».

Последние мысли

Как видите, Git упрощает удаление коммитов с удаленного сервера.

Однако вам нужно быть осторожным при использовании команды git push с опцией force , потому что вы можете потерять прогресс, если не будете осторожны.

#3 — Отмена действий. Возвращение к старым версиям

#3 - Отмена действий. Возвращение к старым версиям

Git позволяет просматривать хронологию изменений в вашем проекте. В ходе урока вы познакомитесь с отменой действий (коммитов) в Git, а также научитесь удалять коммиты и возвращать проект «назад во времени».

Видеоурок

В Git есть замечательная возможность «возвращения во времени»:

  • вы можете просмотреть как выглядел ваш проект на стадии определенного коммита;
  • вы можете отменить определенный коммит;
  • вы можете выполнить удаление коммита и возвращение к проекту на стадии определенного коммита.

Просмотр проекта

Чтобы просмотреть проект на стадии какого-либо коммита вам необходимо прописать команду git checkout id , где id это идентификатор коммита, который хотите просмотреть.

Чтобы узнать id изначально пропишите команду git log —oneline . Тогда вы получите список всех коммитов что были сделаны в вашем проекте, а также их идентификаторы.

Чтобы просмотреть какой-либо коммит выполните комманду: git checkout 102e2f1 . Здесь вы просмотрите проект на стадии первого коммита.

Отмена коммита

Для отмены коммита используйте команду git revert id , где id это идентификатор коммита, который хотите просмотреть. После выполнения команды вы отмените определенный коммит.

Удаление коммита

Для удаления коммита используйте команду git reset id —hard , где id это идентификатор коммита, который хотите просмотреть. После выполнения команды вы удалите определенный коммит и все данные будут возвращены к проекту что был на стадии коммита.

Задание к уроку

Необходимо оформить подписку на проект, чтобы получить доступ ко всем домашним заданиям

Большое задание по курсу

Вам необходимо оформить подписку на сайте, чтобы иметь доступ ко всем большим заданиям. В задание входит методика решения, а также готовый проект с ответом к заданию.
PS: подобные задания доступны при подписке от 1 месяца

Как правильно откатиться до коммита и залить это на удаленный репозиторий?

Разработчик откатывается к предыдущем коммиту в локальном репозитории git reset —soft , потом делает коммит, потом пуш.

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

Подскажите, пожалуйста, как правильно откатиться до коммита и залить это на удаленный репозиторий?

Отслеживать
5,960 3 3 золотых знака 22 22 серебряных знака 44 44 бронзовых знака
задан 22 окт 2013 в 18:11
456 1 1 золотой знак 4 4 серебряных знака 14 14 бронзовых знаков
Воспользутейсь git revert и откатите все лишние коммиты.
22 окт 2013 в 18:24
Как вариант git push —force . Только не злоупотребляйте.
22 окт 2013 в 18:28
22 окт 2013 в 19:10

Кот, все хорошо, но вот ситуация, произошел мердж, после этого один коммит, пытаюсь откатить последнее изменение к состояние до мерджа, пишет, что нужно git revert -m Попробовал и так, и сяк, но что-то ничего толком не вышло. Может был опыт такой? Спасибо за ответы еще раз! =)

22 окт 2013 в 19:17

Стойте, вы сделали локальный merge, после этого какой-то коммит сверху и хотите отменить этот локальный коммит? Тогда используйте git reset —hard HEAD~1 . Рекомендую сразу разобраться, как работают остальные опции команды reset (то есть, —soft и дефолтная опция —mixed ).

22 окт 2013 в 19:35

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Для простоты предположим, что проблемный коммит только один.

Чтобы откатить опубликованный (push) коммит, есть два основных пути:

  1. git revert номер_проблемного_коммита . Создаёт второй, «противоположный» коммит, «со знаком минус». После его публикации получится состояние, как до проблемного коммита, но в истории останется пара ненужный-коммит + отмена-ненужного-коммита.
  2. git push —force . Перед этим нужен git reset , как советуют в комментариях. Эту опцию следует использовать с осторожностью. Рассмотрим следующие случаи:
    1. Никто ещё не увидел опубликовынные изменения (в том числе «роботы», которые могут что-то автоматически делать при push’е). Тогда —force наилучший вариант.
    2. Несколько человек уже обновились после неудачного коммита. Тогда перед использованием —force следует их уведомить, так как на их стороне —force может «взбаламутить» ситуацию и потребовать дополнительных действий. Если тут же вместо проблемного коммита не положить ещё какой-нибудь другой коммит, то проблемный коммит может снова попасть на сервер (даже без —force ‘а) от этих разработчиков.
    3. Кто-то уже опубликовал изменения поверх неудачного коммита. Тогда —force затрёт их новые коммиты. От этого можно защититься опцией —force-with-lease . В этом случае нужно обновиться и делать git rebase -i , а потом уже —force (причём во время этой операции могут набежать ещё новые коммиты). Тут git revert будет более уместен.
    4. Много человек уже обновилось, есть несколько опубликованных или неопубликованных изменений «поверх» плохого коммита: git revert .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *