Файлы, удаленные после pu sh в удаленном хранилище GitHub - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть мой первый Git репозиторий, который я создал онлайн, с именем myName/python-algorithms.

. Он содержал множество Python скриптов. Я попытался добавить файл test.py из моего локального терминала Ubuntu с помощью команд:

git init
git config user.name "myName"
git config user.e-mail "myEmail@myEmail.se"
git add test.py
git commit -m "some init msg"
git remote add origin https://github.com/myname/Python_Algorithms.git
git remote -v
git push -f origin master

, который удалил все мои Python сценарии и заменил их файлом test.py на GitHub.

Есть идеи, как я могу вернуть свои сценарии, которые были удалены?

Ответы [ 3 ]

1 голос
/ 15 февраля 2020

Есть какие-нибудь идеи, как я могу вернуть мои сценарии, которые были удалены?

Основной способ: найти резервную копию / клон исходного хранилища (или попросить администраторов GitHub найти один) ).

Временный способ: если у вас есть идентификатор ha sh, отображаемый где-то в окне или записанный где-то на бумаге или доске, и вы можете перемещаться с на URL GitHub для этот коммит (например, https://github.com/git/git/commit/b9e62f60115c75c5be5de593862925c8b8d7e683 - это URL для одного конкретного коммита на GitHub в этом конкретном репозитории Git для Git), используйте его для доступа к объекту tree нажав на «Обзор файлов», и используйте его, чтобы получить доступ к вашим файлам. Существует ограниченное временное окно, в течение которого вы можете сделать это; после этого служебные скребки GitHub будут удалять коммиты, и их нельзя будет восстановить, кроме как через резервные копии или другие клоны.


Помните, что Git хранилища коммитов . Каждый коммит содержит полный и полный снимок всех ваших файлов, а также некоторые метаданные : информацию о коммите, например, кто его сделал и когда. Каждый коммит имеет уникальный идентификатор ha sh, поэтому любой репозиторий Git может сразу определить, есть ли у него этот коммит, просто проверив идентификатор ha sh. Если репозиторий имеет коммит с , который га sh ID, он имеет , который фиксирует .

Между тем, конечно, каждый репозиторий содержит некоторый набор коммитов. Ваш GitHub-репозиторий имел некоторый набор коммитов с вашими файлами в них.

Когда вы создаете новый пустой репозиторий:

git init
git config user.name "myName"
git config user.e-mail "myEmail@myEmail.se"

этот новый пустой репозиторий имеет вообще никаких коммитов . Это не так уж важно, так как вы можете делать новые коммиты:

git add test.py
git commit -m "some init msg"

Этот новый репозиторий теперь имеет один коммит. Давайте нарисуем это. У него большой некрасивый идентификатор ha sh, но назовем его H для "ha sh":

H   <-- master

Между тем, репозиторий GitHub в https://github.com/myname/Python_Algorithms.git имеет другие коммиты , Давайте предположим, что он имеет четыре коммита, и назовем их A, B, C и D. Его master содержит га sh ID коммита D, который указывает на коммит C, который указывает на B, что указывает на A, который является первым коммитом в это хранилище и, следовательно, никуда не указывает:

A <-B <-C <-D   <-- master   (in the Git on GitHub)

Когда вы запускаете git push без -f:

git remote add origin https://github.com/myname/Python_Algorithms.git
git remote -v

[и то, что вы не сделали:]

git push origin master

ваш Git вызовет этот другой Git и предложит вам ваш единственный коммит, который вы есть, а они нет. Пока все хорошо: они берут этот коммит и помещают его в зону карантина. Затем ваш Git говорит своим Git: Пожалуйста, если все в порядке, используйте га sh ID этого коммита для установки имени вашей ветви master.

Их Git смотрит в свой репозиторий, цепочка коммитов которого заканчивается на D. Он пытается выполнить коммит H в обратном направлении, чтобы увидеть, получит ли это коммит D. Но коммит H имеет нет родителя: это новый root коммит, как A. Так что H не приводит к D, и GitHub отвечает на ваш Git: Нет! Если я перезапишу свое имя master с коммитом ha sh H, я потеряю коммит D и тем самым все более ранние коммиты тоже!

Увы, вы сказали своему Git к git push -f origin master, добавив флаг force . Флаг принудительного изменения изменяет ваш Git вежливый Пожалуйста, если все в порядке запрос в команду: Установите master!

Git на GitHub повиновался. Он установил для master значение H:

A--B--C--D   [abandoned]

H   <-- master

Старые коммиты в репозитории GitHub на данный момент недоступны обычным механизмам Git. В конце концов, их обработка Git обслуживания / уборщика сойдет на нет и сметет первоначальную цепочку коммитов навсегда. До тех пор доступ по прямому URL через .../commit/<hash> URL обходит обычные механизмы Git, поэтому он все еще может работать. Но все обычные операции Git срываются из-за того, что их master теперь указывает на фиксацию H, и их Git * найти commit D.

невозможно.

Возможно, существует какой-то другой клон, созданный вами или кем-то еще, который содержит коммит D (и, если это так, вероятно, он также имеет A - C, или, возможно, он имеет только A - * C как никогда не обновлялось после добавления D или чего-то еще). Если вы можете найти такой репозиторий и получить доступ к его коммитам - по номеру sh или по именам, таким как master - вы можете получить свои файлы таким образом из этих коммитов. Если нет ... ну, вот почему git push --force опасно!

1 голос
/ 15 февраля 2020

Так что есть несколько способов исправить нежелательный коммит. Похоже, что в вашем локальном репо git не было всей информации в вашем удаленном репо, из-за чего ваш pu sh перезаписал ее. В вашем терминале используйте git log, чтобы посмотреть историю коммитов для вашего локального git. Если в нем только указан ваш тестовый коммит, нам нужно будет найти последний хороший коммит (где все файлы еще существовали) другим способом.

Go к вашему github и перейдите к вашей истории коммитов. Вы должны увидеть коммит до последнего pu sh "some init msg", который перезаписал другие ваши файлы. Он будет иметь шестнадцатеричный идентификатор (синим цветом) справа. Скопируйте его!

С вашего терминала git вы хотите использовать команду: git checkout copiedhex #

Это скопирует в ваше локальное хранилище версию со всеми файлами. Тем не менее, вы будете в отключенном состоянии HEAD и должны получить сообщение об этом. Вы захотите превратить это в новую ветку, используя: git checkout -b some_new_branch_name Тогда вы можете продолжить как обычно (объединить его с мастером или продолжать работать отдельно, pu sh et c)

Более полезная информация здесь: https://www.atlassian.com/git/tutorials/undoing-changes

Надеюсь, что поможет!

0 голосов
/ 16 февраля 2020

ИСПРАВЛЕНО: Благодаря комментарию torek я исправил это следующим образом. From:

https://api.github.com/repos/myName/Python_Algorithms/events

Я нашел старый HASH_ID до того, как произошла сила pu sh. Затем я перешел по ссылке:

https://github.com/myNAme/Python_Algorithms/commit/HASH_ID

, справился с просмотром файлов и вернулся к своим файлам.

Спасибо toreks

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