Я установил удаленное непонятное «основное» репо и клонировал его на свой компьютер. Я сделал некоторые локальные изменения, обновил свой локальный репозиторий и перенес изменения в мое удаленное хранилище. Все было хорошо до этого момента.
Теперь мне пришлось что-то менять в удаленном репо. Затем я изменил что-то в своем локальном репо. Я понял, что смена удаленного репо не нужна. Поэтому я попытался перейти git push
от локального репо к удаленному репо, но я получил ошибку вроде:
Чтобы предотвратить потерю истории, обновления без ускоренной пересылки были отклонены. Объедините удаленные изменения перед повторным нажатием. См. Раздел «Примечание о быстрой перемотке»
git push --help
.
Я думал, что, вероятно,
git push --force
вынудит мою локальную копию отправить изменения в удаленную и сделать то же самое. Это действительно вызывает обновление , но когда я возвращаюсь к удаленному репо и выполняю коммит, я замечаю, что файлы содержат устаревшие изменения (те, которые ранее были у основного удаленного репо).
Как я уже упоминал в комментариях к одному из ответов :
[Я] попытался форсировать, но когда возвращаюсь на главный сервер, чтобы сохранить изменения, я получаю устаревшую постановку. Таким образом, когда я фиксирую репозитории, они не совпадают. И когда я пытаюсь использовать git push снова, я получаю ту же ошибку.
Как я могу исправить эту проблему?
git push -force
более осторожно .git push --force
это действительно еще один действительный способ принудительного нажатия, и он будет выдвигать ветви так же, как и вgit push origin master --force
Git по умолчаниюpush.default config settings
, хотя, какие ветви специально выдвигаются, отличается между версиями Git до 2.0 и после 2.0.git push --force
отлично работает в наши дни, FWIW ...git push --force-with-lease
работает даже лучше :), он откажется обновлять ветку, если это не то состояние, которое вы ожидаете. (см. developer.atlassian.com/blog/2015/04/force-with-lease )Ответы:
Просто делать:
или если у вас есть определенный репо:
Это удалит ваш предыдущий коммит (ы) и подтолкнет ваш текущий.
Это может быть не совсем правильно, но если кто-то наткнется на эту страницу, подумав, что, возможно, они захотят простое решение ...
Короткий флаг
Также обратите внимание, что
-f
сокращение--force
, тактоже будет работать.
источник
git push origin +master
вместо этого, что позволит вам выдвинуть несколько refspecs, не заставляя их всех.git push --force
, вы можете испортить свою основную ветку (в зависимости от поведения по умолчанию в push-режиме) .. Что может отстойно .. немного ..: Dgit push --force
основном состоит в том, чтобы принудительно выдвигать текущую извлеченную ветвь к ее части удаленного счетчика, так что если у вас есть ветвь master, то она идентичнаgit push origin master --force
. Это будет отличаться, если вы используетеmatching
параметр дляpush.default
, который используется по умолчанию для версий Git до 2.0.matching
толкает все локальные ветви к удаленным, которые имеют одинаковые имена, поэтому принудительное нажатие может определенно не соответствовать вашимgit push origin master --force
есть.merge -s ours
работал для меняИ если
push --force
не работает, вы можете сделатьpush --delete
. Посмотрите на 2- ую строку в этом случае:Но будьте осторожны ...
Никогда не возвращайся к публичной истории!
Другими словами:
force
выдвигайте публичный репозиторий.pull
.reset
илиrewrite
истории в репо кто-то, возможно, уже потянул.Конечно, есть исключительно редкие исключения даже из этого правила, но в большинстве случаев это не нужно, и это создаст проблемы для всех остальных.
Сделайте возврат вместо этого.
И всегда будьте осторожны с тем, что вы подталкиваете к публичному репо . Откат:
По сути, оба заголовка источника (от возврата и сброса зла ) будут содержать одинаковые файлы.
изменить, чтобы добавить обновленную информацию и больше аргументов вокруг
push --force
Подумайте о толчковой силе с арендой, а не о толчке, но все же предпочитайте возврат
Другая проблема
push --force
может возникнуть, когда кто-то что-то нажимает, прежде чем вы, но после того, как вы уже получили. Если вы нажмете на вашу перебазированную версию сейчас, вы замените работу у других .git push --force-with-lease
представленный в git 1.8.5 ( благодаря комментарию @VonC к этому вопросу) пытается решить эту конкретную проблему. По сути, это приведет к ошибке и не будет выдвигаться, если пульт был изменен с момента последней загрузки.Это хорошо, если вы действительно уверены, что это
push --force
необходимо, но все же хотите предотвратить больше проблем. Я бы пошел так далеко, чтобы сказать, что это должно бытьpush --force
поведение по умолчанию . Но это еще далеко не оправдание, чтобы заставитьpush
. У людей, которые загрузились до вашей перебазировки, все равно будет много неприятностей, которых можно было бы легко избежать, если бы вы вернулись .И так как мы говорим о
git --push
случаях ...Почему кто-то хочет заставить толкать?
@linquize привел хороший пример толчка для комментариев: конфиденциальные данные . Вы ошибочно просочились данные, которые не должны быть отправлены. Если вы достаточно быстры, вы можете «починить»
*
его, нажав сверху.*
Данные будут по- прежнему находиться на пульте дистанционного управления , если вы не делаете мусор собирать , или очистить его каким - то образом . Существует также очевидный потенциал для его распространения другими, кто уже получил его, но вы поняли идею.источник
git push origin master --delete # do a very very bad bad thing git push origin master # regular push
это фактически решило мою проблему отлично (на репо только со мной и моим другом). может быть, это неправильно для публичных репозиториев, но для частного репозитория это спасение жизни.Прежде всего, я бы не стал вносить никаких изменений непосредственно в «основной» репо. Если вы действительно хотите иметь «основное» репо, то вам следует только подтолкнуть его, а не менять его напрямую.
Что касается ошибки, которую вы получаете, пробовали ли вы
git pull
из локального репо, а затемgit push
в основной репо? То, что вы сейчас делаете (если я хорошо это понял) - это форсирование, а затем потеря ваших изменений в «основном» репо. Сначала вы должны объединить изменения локально.источник
git push -f
, но затем, если вы снова измените свой основной репо, вам придется вернуться к своему локальному репо иgit pull
, чтобы он синхронизировался с последними изменениями. Тогда вы можете сделать свою работу и нажать еще раз. Если вы будете следовать этому «двухтактному» рабочему процессу, вы не получите ошибку, на которую жаловались.Если я нахожусь в моей локальной ветви A, и я хочу принудительно отправить локальную ветвь B в исходную ветвь CI, можно использовать следующий синтаксис:
источник
git push --force origin B:C
. В моем случае, кажется, чтоgit push --force origin C
будет только подтолкнуть от локального мастера к удаленной ветви C, независимо от того, на какой ветви я сейчас работаю.git version 2.3.8 (Apple Git-58)
используйте следующую команду:
источник
-f
флага ...Я действительно рекомендую:
толкать только в основной репо
убедитесь, что основное репо является чистым репо , чтобы никогда не возникало проблем с рабочим деревом основного репо, которое не синхронизировано с его
.git
базой. Смотрите " Как перенести локальный репозиторий git на другой компьютер? "Если вам нужно внести изменения в основной репозиторий (клон), клонируйте его (на главном сервере), внесите изменения и вернитесь к нему.
Другими словами, сохраняйте доступное чистое репо как с основного сервера, так и с локального компьютера, чтобы иметь единственное репозиторий в восходящем направлении из / на который можно тянуть / тянуть.
источник
Это было наше решение для замены master в корпоративном хранилище gitHub при сохранении истории.
push -f
мастер на корпоративных репозиториях часто отключается, чтобы поддерживать историю ветки. Это решение сработало для нас.подтолкнуть свою ветку
desiredOrigin
и создать пиаристочник
У меня был тот же вопрос, но я наконец понял его. Скорее всего, вам нужно выполнить следующие две команды git (заменив хэш номером редакции git commit):
источник