Как правильно заставить Git push?
Я настроил удаленное не-голое "основное" РЕПО и клонировал его на свой компьютер. Я внес некоторые локальные изменения, обновил локальный репозиторий и вернул изменения в удаленное РЕПО. До этого момента все было хорошо.
Теперь мне нужно было что-то изменить в удаленном РЕПО. Затем я что-то изменил в своем местном РЕПО. Я понял, что переход к удаленному РЕПО не нужен. Поэтому я попытался git push
из моего локального РЕПО в мое удаленное РЕПО, Но я получил ошибку например:
чтобы предотвратить потерю истории, обновления без быстрой перемотки были отклонено слияние удаленных изменений перед повторным нажатием. См. Примечание о разделе fast-forwards
git push --help
для сведения.
Я думал, что, вероятно,
git push --force
заставит мою локальную копию нажать изменения на удаленный и сделать его таким же. это заставляет обновление, но когда я возвращаюсь к удаленному РЕПО и делаю фиксацию, я обратите внимание, что файлы содержат устаревшие изменения (те, которые ранее были у основного удаленного РЕПО).
как я уже упоминал в комментарии к одному из ответов:
[I] пробовал форсировать, но при возвращении на главный сервер для сохранения изменений я получаю устаревшую постановку. Таким образом, когда я фиксирую репозитории, они не совпадают. И когда я снова пытаюсь использовать git push, я получаю ту же ошибку.
как я могу исправить эту проблему?
7 ответов
так же:
git push origin <your_branch_name> --force
или если у вас есть конкретный РЕПО:
git push https://git.... --force
это удалит ваши предыдущие фиксации и нажмите текущую.
это может быть неправильно, но если кто-то наткнется на эту страницу, подумал, что им может понадобиться простое решение...
короткие флаг
также обратите внимание, что -f
сокращенно --force
, так что
git push origin <your_branch_name> -f
также будет работать.
и если 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
но будьте осторожны...
никогда не возвращайтесь к публичной истории git!
другими словами:
- никогда не
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
по сути, и головки начала (от вернуться и зло сброс) будет содержать те же файлы.
изменить, чтобы добавить обновленную информацию и больше аргументов вокруг push --force
рассмотрите возможность толкать силу с арендой вместо толчка, но все же предпочитайте revert
еще одна проблема push --force
может принести, когда кто-то нажимает что-либо, прежде чем вы это сделаете, но после того, как вы уже получили. Если вы нажмете force ваш rebased версия теперь вы будете заменить работу от других.
git push --force-with-lease
представил в git 1.8.5 ( благодаря @VonC комментарий к вопросу) пытается решить эту конкретную проблему. В принципе, это приведет к ошибке, а не толчок, если пульт был изменен с момента последней выборки.
это хорошо, если вы действительно уверены в push --force
необходимо, но все еще хотите предотвратить больше проблем. Я бы зашел так далеко, чтобы сказать, что это должно быть по умолчанию push --force
поведение. Но это все еще далеко не повод, чтобы заставить push
. Люди, которые принес перед rebase по-прежнему будет много неприятностей, которых можно было бы легко избежать, если бы у вас было вернулся.
и так как мы говорим о git --push
экземпляров...
почему кто-то хочет заставить толкать?
@linquize привел хороший пример силы толчка в комментариях:чувствительный данные. Вы неправильно слили данные, которые не следует толкать. Если вы достаточно быстры, вы можете "исправить"*
это, заставляя толкать сверху.
*
на данные по-прежнему будут на пульте если вы также делаете мусор собирать или очистите его как-нибудь. Существует также очевидный потенциал для его распространения другими, кто принес это уже, но вы поняли идею.
прежде всего, я бы не делал никаких изменений непосредственно в "основном" РЕПО. Если вы действительно хотите иметь" основное " РЕПО, тогда вы должны только нажать на него, никогда не меняйте его напрямую.
Что касается ошибки, которую вы получаете, вы пробовали git pull
из вашего локального РЕПО, а затем git push
к основному РЕПО? То, что вы сейчас делаете (если я это хорошо понял), это форсирование толчка, а затем потеря изменений в "основном" РЕПО. Сначала необходимо объединить изменения локально.
Если я нахожусь на своей локальной ветви A, и я хочу принудительно нажать локальную ветвь B на исходную ветвь C, я могу использовать следующий синтаксис:
git push --force origin B:C
Я бы очень рекомендую:
push только для основного РЕПО
убедитесь, что основным РЕПО является голые РЕПО, чтобы никогда не возникало проблем с основным рабочим деревом РЕПО, не синхронизированным с его
.git
базы. См."как переместить локальный репозиторий git на другой компьютер?"Если вам нужно внести изменения в основное (голое) РЕПО, клонируйте его (на основном сервер), сделайте свою модификацию и нажмите на нее
другими словами, держите голое РЕПО доступным как с главного сервера, так и с локального компьютера, чтобы иметь одно восходящее РЕПО от/к которому тянуть/тянуть.
Это было наше решение для замены master в корпоративном репозитории gitHub при сохранении истории.
push -f
to master в корпоративных репозиториях часто отключается для ведения истории филиалов. Это решение сработало для нас.
git fetch desiredOrigin
git checkout -b master desiredOrigin/master // get origin master
git checkout currentBranch // move to target branch
git merge -s ours master // merge using ours over master
// vim will open for the commit message
git checkout master // move to master
git merge currentBranch // merge resolved changes into master
нажмите свою ветку на desiredOrigin
и создать PR