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

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

  • автор:

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

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

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

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

Отслеживать
5,970 4 4 золотых знака 23 23 серебряных знака 44 44 бронзовых знака
задан 22 окт 2013 в 18:11
466 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 снимком вашего последнего коммита.

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

    В удаленном репозитории в ветке master есть такой набор коммитов
    A — B — C — D
    Необходимо откатиться для всех клиентов до коммита A, а изменения вошедшие в коммит B необходимо сбросить в отдельную ветку. Коммитами C и D можно пожертвовать.
    Какая правильная последовательность действий должна быть в этом случае?

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

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

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

    На одном клиенте:

    git branch feature_branch B -- создать ветку на основе B git checkout master git reset --hard A -- сброс мастера на A git push -f -- принудительное обновление удалённой ветки

    Затем на остальных клиентах:

    git fetch --all -- получить свежие данные с сервера git checkout master git reset --hard origin/master -- сбросить локальную ветку на удалённую. Имя репозитория (origin) у клиента может быть другим

    Ответ написан более трёх лет назад

    Нравится 1 1 комментарий

    Как отменить последний коммит git

    Тут нужно понять, что именно необходимо сделать. Потому что под отменой часто понимают удаление последнего коммита. Удалить последний коммит можно очень просто с помощью команды git reset . Причём можно как сохранить изменения в рабочей директории, так и полностью удалить все изменения сделанные в последнем коммите.

    # удаляем только коммит git reset --hard HEAD~ # удаляем коммит и изменения 

    А вот отменить изменения сделанные в последнем коммите можно с помощью команды git revert . Она делает еще один коммит, но с противоположными изменениями.

    # нужно передать ей хеш коммита, который мы отменяем 

    28 декабря 2022

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

    git revert

    Можно сказать, что команда git revert представляет собой типичную команду отмены. Однако принцип ее действия отличается от привычной отмены изменений. Вместо удаления коммита из истории проекта эта команда отменяет внесенные в нем изменения и добавляет новый коммит с полученным содержимым. В результате история в Git не теряется, что важно для обеспечения целостной истории версий и надежной совместной работы.

    Отмена с помощью команды revert необходима, когда нужно обратить изменения, внесенные в некоем коммите из истории проекта. Это может быть полезно, если баг появился в проекте из-за конкретного коммита. Вам не потребуется вручную переходить к этому коммиту, исправлять его и выполнять коммит нового снимка состояния — команда git revert сделает это автоматически.

    Порядок действий

    Команда git revert используется для отката изменений в истории коммитов репозитория. Другие команды отмены, такие как git checkout и git reset, перемещают указатель HEAD и указатели ветки на определенный коммит. Команда git revert также работает с определенным коммитом, однако использование git revert не перемещает указатели. При операции revert совершается переход к указанному коммиту, обращаются его изменения и создается новый, «обратный» коммит. Затем позиция указателей обновляется — они перемещаются к этому коммиту в конце ветки.

    Для наглядности создадим тестовый репозиторий и напишем в командной строке следующее:

    $ mkdir git_revert_test
    $ cd git_revert_test/
    $ git init .
    Initialized empty Git repository in /git_revert_test/.git/
    $ touch demo_file
    $ git add demo_file
    $ git commit -am"initial commit"
    [main (root-commit) 299b15f] initial commit
    1 file changed, 0 insertions(+), 0 deletions(-)
    create mode 100644 demo_file
    $ echo "initial content" >> demo_file
    $ git commit -am"add new content to demo file"
    [main 3602d88] add new content to demo file
    n 1 file changed, 1 insertion(+)
    $ echo "prepended line content" >> demo_file
    $ git commit -am"prepend content to demo file"
    [main 86bb32e] prepend content to demo file
    1 file changed, 1 insertion(+)
    $ git log --oneline
    86bb32e prepend content to demo file
    3602d88 add new content to demo file
    299b15f initial commit

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

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