Страницы

Поиск по вопросам

понедельник, 13 апреля 2020 г.

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

#git #git_commit #git_remote #git_push

                    
Есть два репозитория:


голый (bare) репозиторий, из него все берут копию, в нем есть  мастер ветка, которая
всегда соответствует production состоянию
есть локальный репозиторий


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

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

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


Ответы

Ответ 1



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

Ответ 2



как вариант git reflog - выдаст список HEAD c номерами и описанием, достаточно выбрать интересуещее вас состояние и сделать сброс до этого HEAD. git reset --hard HEAD @{номер} HEAD – это указатель на текущую ветку, которая, в свою очередь, является указателем на последний коммит, сделанный в этой ветке. Это значит, что HEAD будет родителем следующего созданного коммита. Как правило, самое простое считать HEAD снимком вашего последнего коммита.

Ответ 3



В зависимости от платформы, Вы можете написать так: GitHub откат на 1 коммит локально: git reset --hard HEAD~1 Примечание: это потенциально опасная команда, так как она сбрасывает все ваши незафиксированные изменения. Потом удаляете в репозитории удаленно командой: git push origin -f По аналогии на BitBucket откат на 1 коммит локально: git reset --hard HEAD~1 и удаленно командой удаляете: git push -f origin HEAD^:master Примечание: вместо ветки master Вы можете использовать любую другую ветку. Этой командой Вы только удаляете с Bitbucket. HEAD~1 и HEAD^ могут быть взаимозаменяемыми.

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

Отправить комментарий