Как Сэм Варшавчик ответил , вы находитесь в особом состоянии. Однако я бы не назвал это недействительным состоянием.
Вы можете достичь этого состояния в любое время, в любом другом хранилище Git, используя git checkout --orphan
:
$ git status
On branch master
Your branch is behind 'origin/master' by 98 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)
nothing to commit, working tree clean
$ git checkout --orphan asdf
Switched to a new branch 'asdf'
$ git status | head -3
On branch asdf
No commits yet
$ git branch | grep asdf
$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 98 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)
Здесь происходит то, что вы можете находиться на ветке, которая не существует.
В новом пустом репозитории, только что созданном git init
, это всегда так. Ветвь существует , потому что ссылка, имя которой начинается с refs/heads/
, содержит хэш-идентификатор действительного коммита.
В новом пустом репозитории нет действительных коммитов. Следовательно, ветвь master
не может существовать . Тем не менее, вы все еще на ветке master
.
Этот парадокс возникает из-за того, что символьная ссылка может назвать ветвь, которая не существует. HEAD
обычно является символьной ссылкой (кроме, конечно, когда она «отсоединена»). То есть HEAD
содержит название ветви . Эта ветвь не должна существовать! Если это не так, Git говорит, что вы находитесь на неродившейся ветке , или иногда у вас есть сиротская ветвь, или просто ветка с "пока нет коммитов".
Команда git branch
перечисляет ветви, которые существуют , поэтому она пропускает эту нерожденную ветвь, если вы находитесь в этом особом состоянии. ( Должен ли git branch
перечислить эту дополнительную несуществующую ветвь? Это разумный вопрос, который нужно задать. В настоящее время Git говорит «нет», но, возможно, когда-нибудь авторы Git передумают.)
Чтобы увидеть, к какому имени ветви HEAD
присоединено, используйте git symbolic-ref HEAD
. Если вы находитесь в отключенном состоянии HEAD, команда не будет выполнена (с сообщением об ошибке), поэтому вы знаете, что HEAD
не присоединено к любому имени ветви. В противном случае вы получите название филиала:
$ git symbolic-ref HEAD
refs/heads/asdf
, даже если название ветви не существует.
Когда пользователь потерял статус, следующий коммит будет корневым коммитом
Когда вы находитесь в этом особом состоянии нахождения на несуществующей ветке, это оказывает важное влияние на следующий git commit
, который вы запускаете.
Как всегда, git commit
будет создавать содержимое своего нового коммита из того, что находится в индексе во время запуска git commit
. Использование git checkout --orphan
оставляет индекс без изменений, поэтому я запустил git status | head -3
выше: индекс все еще полон всех файлов из подсказки master
, в моем случае:
$ git status --short --branch | head -5
## No commits yet on asdf
A .clang-format
A .editorconfig
A .gitattributes
A .github/CONTRIBUTING.md
На самом деле я не буду запускать git commit
здесь, но если бы я это сделал, Git сделал бы новый коммит сейчас, используя содержимое индекса в качестве снимка, получая от меня сообщение журнала, используя мое имя как автора и коммиттера, и так далее. родителей нового коммита, однако, будет нет вообще . Таким образом, новый коммит будет новым корневым коммитом.
В новом, абсолютно пустом репозитории это то, что вам нужно для master
: первый коммит - ну, - корневой коммит, который создает master
, так что теперь у вас есть master
ветка. Это также то, что означает для использования git checkout --orphan
: что вы хотите, чтобы ваш следующий коммит был еще одним корневым коммитом.
Это не особенно полезно, за исключением особых обстоятельств, например, при выполнении git rebase -i --root
, когда Git хочет сделать это внутренне.