Есть какие-нибудь идеи, как я могу вернуть мои сценарии, которые были удалены?
Основной способ: найти резервную копию / клон исходного хранилища (или попросить администраторов 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
опасно!