Git orphan удалить историю - PullRequest
       3

Git orphan удалить историю

1 голос
/ 08 ноября 2019

Если я создаю потерянную ветвь для своего репозитория git.

Я выполнил git rm -rf.

В ней все еще есть моя история и файлы в других ветвях, найденных в. git? Я все еще могу оформить основную ветку.

Должен ли я просто создать другое хранилище и очистить .git?

Проверка журнала git на моей несвязанной ветви показывает только мой первоначальный коммит.

Ответы [ 3 ]

2 голосов
/ 08 ноября 2019

Предполагая, что вы имеете в виду git checkout --orphan <em>name</em>: это означает, что следующий коммит будет корневым. Вы находитесь на ветке, которая не существует. По сути, это то же самое состояние, которое вы имели бы в новом, полностью пустом хранилище.

Когда у вас нет хранилища, а затем создаете его с git init, у этого нового хранилища нет коммитов. Это создает проблему, потому что в Git, имя ветки содержит хэш-идентификатор одного фактического существующего коммита. Следовательно, этот пустой репозиторий не может иметь ветку. У него нет коммитов. Ветви должны идентифицировать коммиты, а их нет. Так что у него нет веток. Тем не менее, вы находитесь на ветке master.

Способ, которым Git обрабатывает это, заключается в том, чтобы позволить вам находиться на ветке, которая не существует. Это то, что * и фактически все - делает git checkout --orphan: оно ставит вас в несуществующую ветвь.

Когда вы находитесь в этом состоянии, следующий сделанный вами коммит создаст коммит. Создание этого коммита позволяет ветви существовать. Git записывает идентификатор хеша коммита в имя ветви, создавая имя ветви в процессе. Ветвь теперь существует и имеет один коммит. Поскольку ветвь, в которой вы работали, на самом деле не существует, у нового коммита нет родителя: это корневой коммит.

Вы отредактировали свой вопрос, добавив:

Я сделал git rm -rf .

Это просто влияет на Git index . Индекс - это объект, который Git использует для хранения всех файлов, которые будут добавлены в следующий коммит. Таким образом, индекс теперь фактически пуст. За исключением нового, абсолютно пустого репозитория, это состояние довольно необычное: обычно в индексе содержатся все файлы, скопированные из коммита, который вы извлекли. Вы захотите поместить некоторые файлы в индекс, используя git add, перед созданием нового корневого коммита.

Вы также отредактировали свой вопрос, чтобы вычеркнуть вопрос:

У меня все еще есть моя история и файлы в других ветках ...

Да. История, в Git, - это коммитов;коммиты это история. Добавление нового имени ветки, указывающего на новую корневую фиксацию, не влияет на любые существующие имена ветвей и коммиты, на которые они указывают. Создание нового коммита не повредит ни одному существующему коммиту.

Все коммиты, которые есть в вашем хранилище, продолжают оставаться в вашем хранилище. Ваш новый корневой коммит теперь находится в вашем репозитории, а имя вашей ветви теперь существует, указывая на новый корневой коммит.

2 голосов
/ 08 ноября 2019

Я не уверен на 100%, что вы пытаетесь сделать, но если вы только что сделали

git rm -rf .

и ничего больше, вы могли бы просто сделать

git reset --hard

и вернитесь туда, где вы были до git rm -rf. Это та «история», которую вы ищете?

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

1 голос
/ 08 ноября 2019

В общем, когда вы создаете новую ветку вне ветки «master», вы наследуете ее историю коммитов. Исключением является бесхозная (или отключенная) ветка. Ветвь-сирота не имеет отношения родитель-потомок к коммитам в главных ветвях.

Большинство коммитов имеют один родительский коммит, за исключением очевидных коммитов root, которые не имеют родительских коммитов. Создание ветви-сироты сохранит рабочее дерево ветви, на которой она основана, но без фиксации предка.

Когда вы создаете ветку-сироту, запустите команду checkout с флагом 'orphan' и введитеветка имя. Выполнить git log --oneline fatal: your current branch 'myorphanbranch' does not have any commits yet

Это связано с тем, что дочерние ветви не наследуют коммиты от родительской ветви. Теперь запустите команду статуса. git status

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

Мы можем удалить все файлы в рабочем дереве с помощью git rm -rf. команда.

Теперь у нас есть ветка без коммитов и без файлов. Запустите команду Git ls-files, чтобы просмотреть файлы в сиротской ветви. Вы заметите, что в ветви нет файлов.

Несмотря на то, что сиротские ветви обычно не используются, они иногда удобны для написания документации и создания статических страниц GitHub. Они также иногда используются для объединения двух несвязанных репозиториев с разными историями.

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