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

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

  • автор:

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

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

На своем локальном ПК я понял как удалить: git reset —hard HEAD~1. Но мне нужно теперь откатиться и в удаленном репозитории! Если я просто после этой команды сделаю push на удаленном тоже удалится этот коммит?

  • Вопрос задан более трёх лет назад
  • 50892 просмотра

Комментировать

Решения вопроса 1

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

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

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

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

Отслеживать
5,970 3 3 золотых знака 23 23 серебряных знака 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 .

    Отслеживать
    ответ дан 1 апр 2015 в 12:06
    558 6 6 серебряных знаков 13 13 бронзовых знаков
    Подробнее об откате коммитов: Как вернуться (откатиться) к более раннему коммиту?
    1 июл 2015 в 19:02

    git reflog — выдаст список HEAD c номерами и описанием, достаточно выбрать интересуещее вас состояние и сделать сброс до этого HEAD.

    git reset —hard HEAD @

    HEAD – это указатель на текущую ветку, которая, в свою очередь, является указателем на последний коммит, сделанный в этой ветке. Это значит, что HEAD будет родителем следующего созданного коммита. Как правило, самое простое считать HEAD снимком вашего последнего коммита.

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

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

    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 commit ошибочных файлов, но ещё не делал git push на удаленный репозиторий.
    Как я могу отменить этот коммит в своем локальном репозитории?

    Ответ:

    Отменить коммит и создать новый:

    git commit -m «Что-то неправильное» (1)
    git reset HEAD~ (2)
    >>Вносим необходимые изменения в файлы (3) git add для всех нужных файлов (4)
    git commit -c ORIG_HEAD (5)

    1. Коммит, который нужно отменить.
    2. Отменяет изменения, внесенные в последнем коммите, при этом не меняя дерево репозитория.
    3. Внесение необходимых изменений в нужный файлы
    4. git add на все нужные файлы
    5. Делаем git commit изменений, используя сообщение последнего отправленного коммита.

    Если ошибочный коммит был уже отправлен на удаленный сервер, и если у вас есть право на перезапись истории коммитов, то можно воспользоваться командой git push origin —force

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

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