Как мне восстановиться после ошибочного мастера git push -f origin? - PullRequest
71 голосов
/ 20 октября 2010

Я просто отправил неверный источник в мой проект, используя опцию --force.

Можно ли вернуться? Я понимаю, что все предыдущие ветки были перезаписаны с использованием опции -f, поэтому я, возможно, испортил свои предыдущие ревизии.

Ответы [ 7 ]

44 голосов
/ 20 октября 2010

Git, как правило, ничего не выбрасывает, но восстановление после этого может быть сложным.

Если у вас правильный источник, вы можете просто вставить его в пульт с помощью опции --force. Git не удалил ни одной ветки, если вы не сказали это. Если вы действительно потеряли коммиты, взгляните на это полезное руководство по восстановлению коммитов . Если вы знаете SHA-1 о коммитах, которые вам нужны, то вы, вероятно, в порядке.

Лучшее, что можно сделать: создайте резервную копию и посмотрите, что еще находится в вашем локальном хранилище. Сделайте то же самое на пульте, если это возможно. Используйте git fsck, чтобы узнать, можете ли вы восстановить вещи, и, прежде всего, НЕ запускайте git gc.

Прежде всего, никогда не используйте опцию --force, если вы действительно не имеете этого в виду.

43 голосов
/ 23 июня 2014

Если вы знаете хеш коммита, это просто, просто пересоздайте ветку.

5794458...b459f069 master -> master (forced update)

Удалить удаленную ветку:

git push origin :master

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

git checkout 5794458
git branch master
git push origin master
21 голосов
/ 16 февраля 2017

Решение уже упоминалось здесь

# work on local master
git checkout master

# reset to the previous state of origin/master, as recorded by reflog
git reset --hard origin/master@{1}

# at this point verify that this is indeed the desired commit.
# (if necessary, use git reflog to find the right one, and
# git reset --hard to that one)

# finally, push the master branch (and only the master branch) to the server
git push -f origin master
6 голосов
/ 05 января 2018

Если вы находитесь не в том локальном репо, откуда пришел принудительный пуш, на уровне источника / мастера восстановление невозможно. Но если вам везет достаточно, чтобы использовать GitHub или GitHub для Enterprise , вы можете взглянуть на API REST и получить потерянный зафиксировать как патч, пример:

  1. Список событий и поиск в длинном формате commit sha1

https://api.github.com/repos/apache/logging-log4j2/events

  1. Загрузите потерянный коммит и получите соответствующий патч по пути json .files [] / patch

https://api.github.com/repos/apache/logging-log4j2/commits/889232e28f3863d2a17392c06c1dd8cac68485de

  1. Подать заявку локально и нажать еще раз

git apply patch.patch && git commit -m "восстановленный коммит" && git push origin origin *

2 голосов
/ 16 августа 2018

Другой способ восстановить потерянный коммит или даже выяснить, какие коммиты были потеряны, если предыдущий пуш пришел не из вашего локального репо, - это посмотреть на ваш компьютер CI.

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

Машина CI может даже хранить локальный клон репо, из которого вы сможете выполнить это восстановление.

Источник: вероятно Непрерывная поставка: надежные выпуски программного обеспечения с помощью автоматизации сборки, тестирования и развертывания (Серия подписей Addison-Wesley (Fowler))

2 голосов
/ 27 июля 2012

Я сделал то же самое, отменив последнее нажатие только для одного файла. Закончилось возвращение в исходное состояние хранилища. Я использовал команды git от Линуса, так как у меня была локальная копия в Linux. К счастью, эта копия все еще не была повреждена.

Все, что я сделал, было (после лихорадочного создания нескольких копий локального репо):

git add .
git status

(там говорилось, что origin / master был впереди на 68 коммитов, хорошо ... это были все коммиты, которые я удалил)

git remote set-url origin <GIT_SSH_URL>
git push

И все восстановилось так, как было до того, как я сделал сильный толчок. Самая важная вещь, которую нужно помнить - никогда не делать git checkout. после того, как вы насильно толкнули. Но лучше всего отключить опцию push. Я никогда не использую это когда-либо снова. Выучил мой урок !!

0 голосов
/ 08 января 2019

Здесь вы можете прочитать решения https://evilmartians.com/chronicles/git-push---force-and-how-to-deal-with-it

Второй мне помог.Я сделал неправильно эти команды

1) (some-branch) git pull -> correct command was git pull origin some-branch

2) (some-branch) git push -f origin some-branch

После этих команд я потерял три коммита.Чтобы восстановить их, я посмотрел на терминал, где я сделал неправильно 'git pull' и увидел там вывод вроде

60223bf ... 0b258ebхеш 0b258eb был именно тем, что мне было нужно.Итак, я взял этот хеш и произвел команду

git push --force origin 0b258eb:some-branch
...