Как я могу оправиться от ошибочного GIT Push -f Origin Master?

StackOverflow https://stackoverflow.com/questions/3973994

  •  09-10-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

Если вы знаете HASH HASHH, легко воссоздать свою ветку.

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

Если вы не на этом местном репо, где пришел вынужденный толчок, на уровне происхождения / мастера нет возможности восстановить. Но если вы счастливый достаточно использовать Гадость или Github для предприятия, вы можете посмотреть на ОСТАЛЬНОЕ API и извлечение потерянных коммит как патч, пример:

  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 «Восстановленный Commit» && Git Push Origin Master

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

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

git add .
git status

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

git remote set-url origin <GIT_SSH_URL>
git push

И все было восстановлено так, как до того, как я сделал насильственный толчок. Самое важное, что нужно помнить, никогда не заниматься проверкой Git. После того, как вы принудительно толкнули. Но лучшая практика - отключить вариант Push. Я никогда не использую его снова. Узнал мой урок !!

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

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

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

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

Здесь вы можете прочитать решения 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

После этих команд я потерял три коммита. Чтобы восстановить их, я посмотрел на терминал, где я сделал ошибочно «потянуть» и увидел там, как вывод, как

60223BF ... 0B258EB Некоторые ветви -> Происхождение / некоторые ветви

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

git push --force origin 0b258eb:some-branch
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top