Вернуть локальный репозиторий GitHub полностью назад - PullRequest
0 голосов
/ 05 мая 2020

Я знаю, что вы можете go в порядке отмены коммитов, но есть ли способ полностью вернуть репо к тому моменту, когда он был впервые инициализирован?

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

Слишком много коммитов (сделано, потому что мне приходилось синхронизировать ветки c, чтобы вернуться, так как я продолжал получать ошибки). Мне жаль, что это глупо, но потерять все это было бы катастрофой. Я лучше начну сначала, прежде чем превратил этот каталог в репозиторий git (что было сегодня).

Ответы [ 4 ]

2 голосов
/ 05 мая 2020

SHA первой фиксации может быть получен с помощью git rev-list:

> git rev-list --max-parents=0 HEAD
<SHA>

Используя этот SHA, вы можете git reset:

> git reset --hard <SHA>

Примечание: это деструктивная команда , поэтому сделайте резервную копию папки для дополнительной безопасности.

1 голос
/ 05 мая 2020

Edit: Сначала я неправильно понял - я думал, вы хотите сохранить текущую копию рабочего дерева каждого файла. Если вам нужна копия, которая была в первой фиксации, используйте git log, чтобы найти первую фиксацию, затем используйте git reset --hard с идентификатором ha sh из этой фиксации, как в ответ joshnuss или ответ тувока . (Поскольку ответ joshnuss показывает, как найти идентификатор ha sh, который нужно использовать для этого.)

Тогда вам решать, следует ли удалить и воссоздать базовый репозиторий Git в каталоге .git или оставьте текущий: имя вашей ветки master теперь будет определять эту самую первую фиксацию, а не последнюю фиксацию, а git log покажет вам только одну фиксацию.


Чтобы расширить ответ Вадика и показать вам, почему он может быть правильным для того, что вы хотите сделать, помните о Git:

  • Git на самом деле означает фиксирует . Git имеет имена веток и другие имена, но их основная функция - помогать вам - и Git самим - находить коммиты.

  • Коммит - это полный снимок всех ваши файлы. Эти файлы, попав в такую ​​фиксацию, никогда не могут быть изменены . Они находятся в специальном формате Git только для чтения, который может использовать только Git.

  • Репозиторий лучше, чем «всего два базы данных », но по сути это большая база данных, в которой хранятся все ваши коммиты (вместе с другими поддерживающими Git объектами), а также меньшая база данных имен - имен ветвей, тегов и т. д. на.

  • Когда вы git clone, git fetch или git push, вы подключаете свой Git к другому Git. Два Git общаются друг с другом, и передача совершается. По большей части, хотя они могут смотреть на имена друг друга (имена веток и тегов), они не обязательно передают имена - это фиксирует , что иметь значение. Каким бы Git ни было получение коммитов, после получения будет обновлено какое-то имя, чтобы запомнить коммиты. Но это фиксирует , который они действительно копируют. Коммиты распространяются повсюду; имена нет, или, по крайней мере, не обязательно.

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

Эти обычные повседневные файлы go в том, что Git называет вашим рабочим деревом или рабочим деревом . Дерево работ в прямом смысле слова вообще не является частью репозитория. Это не фиксация и не имя ветки: его нет в двух первичных базах данных Git. (Фактически, вы можете запустить только хранилище Git, в котором вообще нет рабочего дерева: так работают серверы, подобные GitHub.)

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

К счастью, это очень просто , потому что дерево работ - это то место, где вы работаете, и собственно репозиторий находится в скрытом каталоге / папке наверху вашего рабочего дерева с именем .git. Уберите этот .git с пути или удалите его, и репозиторий окажется где-то в другом месте или полностью исчез. Затем запустите git init без дополнительных параметров или аргументов (или git init ., но . является избыточным), и Git создаст новый полностью пустой репозиторий, создав новую папку / каталог .git и поместив в это вспомогательные файлы, включая пустые имена и базы данных объектов.

(Если вы переместите каталог .git в сторону - например, в какую-нибудь другую папку проекта - это даст вам возможность go в него позже и снова найти коммиты, на случай в конце концов, вы решили, что начинать заново было плохой идеей.)

1 голос
/ 05 мая 2020

Попробуйте выполнить следующую команду

git reset --hard <commit_sha>

например,

git reset --hard a012809fa
1 голос
/ 05 мая 2020

Если вы хотите удалить свой репозиторий со всеми вашими коммитами, удалите каталог .git в каталоге вашего проекта, а затем начните снова с инициализации git репозитория git init .

...