А если push --force
не работает, вы можете сделать push --delete
. Посмотрите на строку 2 nd в этом случае:
git reset --hard HEAD~3 # reset current branch to 3 commits ago
git push origin master --delete # do a very very bad bad thing
git push origin master # regular push
Но будьте осторожны ...
Никогда не возвращайся в публичную историю!
Другими словами:
- Никогда
force
не открывать публичный репозиторий.
- Не делайте этого или чего-либо, что может сломать кому-то
pull
.
- Никогда
reset
или rewrite
истории в репо кто-то, возможно, уже вытащил.
Конечно, есть исключительно редкие исключения даже из этого правила, но в большинстве случаев в этом нет необходимости, и это создаст проблемы для всех остальных.
Вместо этого сделайте возврат.
И всегда будьте осторожны с тем, что вы подталкиваете к публичному репо . Откат:
git revert -n HEAD~3..HEAD # prepare a new commit reverting last 3 commits
git commit -m "sorry - revert last 3 commits because I was not careful"
git push origin master # regular push
Фактически, оба исходных ГОЛОВКИ (из revert и из reset ) содержат одинаковые файлы.
изменить, чтобы добавить обновленную информацию и больше аргументов вокруг push --force
Подумайте о толкающем усилии с арендой, а не о толчке, но все же предпочитайте возвращение
Другая проблема push --force
может возникнуть, когда кто-то что-то нажимает до вас, но после того, как вы уже получили. Если вы нажмете на вашу перебазированную версию, теперь вы замените работу у других .
git push --force-with-lease
, представленный в git 1.8.5 ( благодаря @ VonC комментарию к вопросу) пытается решить эту конкретную проблему. По сути, это приведет к ошибке и не будет выдвигаться, если пульт был изменен с момента последней загрузки.
Это хорошо, если вы действительно уверены, что push --force
нужен, но все же хотите предотвратить больше проблем. Я бы пошел так далеко, чтобы сказать, что это должно быть поведение по умолчанию push --force
. Но это еще далеко не оправдание, чтобы заставить push
. У людей, которые получили до вашей перебазировки , все равно будет много проблем, которых можно легко избежать, если вместо этого вы вернете .
И так как мы говорим о git --push
случаях ...
Зачем кому-то принудительно толкать?
@ linquize привел хороший пример толкающей силы в комментариях: конфиденциальные данные . Вы ошибочно просочились данные, которые не должны быть отправлены. Если вы достаточно быстры, вы можете «исправить» *
, принудительно нажимая сверху.
*
Данные будут по-прежнему находиться на удаленном , если вы не выполните сборщик мусора или очистите его как-нибудь . Существует также очевидный потенциал для его распространения другими, которые уже принесли , но вы поняли.