Страницы

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

пятница, 29 ноября 2019 г.

Откатить уже опубликованный коммит и опубликовать новый, не вызывая мержа у других

#git #git_commit #git_remote


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

Далее я обычно откатываю коммит через  git reset --hard HEAD~1, делаю изменения и
пушу через git push -f origin master, что полностью удаляет прошлый коммит. Однако,
если все снова запулят, то у них будет мерж удаленного коммита с новым.

Как этого избежать?
    


Ответы

Ответ 1



Если коммит попал в общую/стабильную ветку (т.е. ту, которой пользуется хоть кто-то ещё, обычно это master, develop и прочие), то его нельзя удалять. Можно только создать «отменяющий» коммит с помощью git revert (подробнее тут, пункт 5). Возможно, в вашем коммите оказались какие-то критические данные, например пароли или ключи. В этом случае бесполезно пытаться спасти их с помощью удаления коммита, который их содержит. Данные уже скомпрометированы, все пароли и ключи придётся менять. # отменяем последний коммит, доступный по указателю HEAD git revert HEAD # фиксируем отмену в новом коммите git commit -m'reverted the last commit' Если вы абсолютно уверены, что вы запушили «лишний» коммит в собственную ветку, что её никто не замержил в стабильную ветку и просто так не начал разработку от последнего вашего коммита, можно откатить локальную ветку к предыдущему коммиту, а потом переписать изменения в удалённой (подробнее тут, пункт 4.2) Внимание! Никогда не делайте так с общими ветками (master, develop и прочие). Если это категорически необходимо, обязательно и сразу же предупредите всех, кто работает с этим репозиторием. После переписывания последнего коммита в стабильной ветке им придётся вручную обновлять эту ветку на своей машине. Если у них есть какие-то новые коммиты, предком которых является удаляемый коммит, им придётся делать rebase на коммит. git reset HEAD^ git push -f Вот вам моя любимая схема, иллюстрирующая разные варианты решения.

Ответ 2



У них скорее всего будет не просто слияние с удалённым коммитом, но будут какие-то проблемы. Ведь у них в репозиториях лежат коммиты с родителем A, а в удалённом репозитории лежит другой коммит, но тоже с родителем A. Я, откровенно говоря, не знаю как поведёт себя git, но единтсвенным правильным решением в данной ситуации является откат всех локальных репозиториев точно так же, как Вы откатитились: git reset --hard HEAD~1, только потом git pull Вообще говоря за git push -f origin master, в репозиторий, который используется более чем одним человеком, бьют по лицу. Так делать можно только в ЭКСТРЕННЫХ случаях и только если вся команда в курсе происходящего и принимает соответсвующие меры на своих локальных копиях.

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

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