Как правильно принудительно нажать Git?

Я установил удаленное не- "основное" репо и клонировал его на свой компьютер. Я сделал некоторые локальные изменения, обновил свой локальный репозиторий и отбросил изменения обратно к моему удаленному репо. Все было хорошо до этого момента.

Теперь мне пришлось что-то изменить в удаленном репо. Затем я что-то изменил в своем локальном репо. Я понял, что переход на дистанционное репо не понадобился. Поэтому я попытался git push от моего локального репо до моего удаленного репо, но получил ошибку, например:

Чтобы вы не потеряли историю, обновления без пересылки были При повторном объединении удалите изменения. См. "Примечание о разделе быстрого перехода git push --help для деталей.

Я думал, что, возможно,

git push --force

заставит мою локальную копию нажимать изменения на удаленный и сделать то же самое. Это принудительно обновляет, но когда я возвращаюсь к удаленному репо и делаю фиксацию, я замечаю, что файлы содержат устаревшие изменения (те, которые ранее имели основное удаленное репо).

Как я уже упоминал в комментариях к одному из ответов:

[I] попытался заставить, но, возвращаясь на главный сервер, чтобы сохранить изменения, я получаю устаревшую постановку. Таким образом, когда я фиксирую репозитории, это не одно и то же. И когда я пытаюсь использовать git push снова, я получаю ту же ошибку.

Как я могу исправить эту проблему?

Ответы

Ответ 1

Просто выполните:

git push origin <your_branch_name> --force

или если у вас есть определенное репо:

git push https://git.... --force

Это приведет к удалению ваших предыдущих фиксаций и нажмите текущую.

Это может быть неправильно, но если кто-то наткнулся на эту страницу, подумал, что может потребоваться простое решение...

Короткий флаг

Также обратите внимание, что -f является коротким для --force, поэтому

git push origin <your_branch_name> -f

также будет работать.

Ответ 2

И если 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

По сути, оба начальные HEAD (из revert и из зла reset) будут содержать те же файлы.


изменить, чтобы добавить обновленную информацию и больше аргументов вокруг push --force

Подумайте о том, чтобы нажать на толкающую силу с арендой вместо толчка, но по-прежнему предпочитайте возвращать

Другая проблема push --force может привести к тому, что кто-то нажимает что-нибудь до вас, но после того, как вы уже выбрали. Если вы нажмете силу своей обновленной версии, теперь вы замените работу с другими.

git push --force-with-lease введен в git 1.8.5 (благодаря @VonC комментарий по этому вопросу) пытается решить эту конкретную проблему. В принципе, это приведет к ошибке, а не нажатию, если пульт был изменен с момента последней выборки.

Это хорошо, если вы действительно уверены, что требуется push --force, но все же хотите предотвратить больше проблем. Я бы сказал, что это должно быть поведение по умолчанию push --force. Но это еще далеко не оправдание, чтобы заставить push. Люди, которые добрались до вашего перебаза, по-прежнему будут иметь множество проблем, чего можно было бы легко избежать, если бы вы вернулись вместо этого.

И поскольку мы говорим о git --push экземплярах...

Почему кто-то хочет принудительно нажать?

@linquize показал хороший пример принудительной силы в комментариях: конфиденциальные данные. Вы ошибочно просочились в данные, которые не следует толковать. Если вы достаточно быстр, вы можете "исправить" * его, нажав на кнопку вверх.

* Данные будут по-прежнему находиться на удаленном компьютере, если вы также не сделаете сбор мусора или очистите его как-то. Существует также очевидный потенциал для того, чтобы его распространяли другие, которые его уже набрали, но вы поняли идею.

Ответ 3

Прежде всего, я не внес никаких изменений непосредственно в "основное" репо. Если вы действительно хотите иметь "основное" репо, тогда вам нужно только нажать на него, не изменять его напрямую.

Что касается ошибки, которую вы получаете, попробовали ли вы git pull из своего локального репо, а затем git push в основное репо? То, что вы сейчас делаете (если я это хорошо понимаю), заставляет толчок, а затем теряет ваши изменения в "основном" репо. Сначала необходимо слить изменения локально.

Ответ 4

Если я нахожусь в своей локальной ветки A и хочу принудительно направить локальную ветвь B в ветвь начала C, я могу использовать следующий синтаксис:

git push --force origin B:C

Ответ 5

Я бы порекомендовал:

  • нажмите только на основное репо

  • убедитесь, что основное репо является голым репо, чтобы никогда не возникало проблем с тем, что основное дерево репо не синхронизировалось с его .git база. См. "Как переместить локальный репозиторий git на другой компьютер?

  • Если вам нужно внести изменения в основное (голое) репо, клонировать его (на главном сервере), выполнить свою модификацию и вернуться к ней

Другими словами, сохраняйте открытое репо, доступное как с основного сервера, так и с локального компьютера, чтобы иметь одно восходящее репо с/на которое нужно тянуть/тянуть.

Ответ 6

Это было нашим решением для замены мастера в корпоративном хранилище gitHub при сохранении истории.

push -f для управления корпоративными хранилищами часто отключается для сохранения истории веток. Это решение сработало для нас.

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

Ответ 7

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

git push -f origin master