Как правильно заставить 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


используйте следующую команду:

git push -f origin master