Как я могу оправиться от ошибочного мастера git push-f origin?


Я просто совершил неправильный источник для моего проекта с помощью .

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

6 57

6 ответов:

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

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

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

прежде всего, никогда не используйте

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

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

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

git push origin :master

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

git checkout 5794458
git branch master
git push origin master

решение уже упомянутых здесь

# 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

Если вы не находитесь на том локальном РЕПО, откуда произошел принудительный толчок, на уровне origin/master нет способа восстановить. Но если вы повезло достаточно, чтобы использовать GitHub или GitHub для предприятия, вы можете посмотреть на остальное API и восстановить потерянную фиксацию в качестве патча, например:

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

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

  1. скачать потерянный фиксации и извлечения соответствующих исправлений в путь в JSON .файлы[]/патч

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

  1. применить локально и нажмите еще раз

git применить патч.заплатка && в Git коммит -м "восстановлена совершить" && git толчок происхождение мастер

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

все, что я сделал, было (после того, как яростно сделал еще несколько копий местного РЕПО):

git add .
git status

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

git remote set-url origin <GIT_SSH_URL>
git push

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

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

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

машина CI может даже хранить локальный клон РЕПО, из которого вы можете быть в состоянии выполнить это восстановление.

источник: наверное непрерывная поставка: надежные выпуски программного обеспечения через автоматизацию сборки, тестирования и развертывания (Addison-Wesley Signature Series (Fowler))