Я пытаюсь автоматизировать процесс и выдаю git branch
команду, чтобы узнать, в какой я ветке. Все работает нормально, за исключением недавно инициализированного репо, которое git branch
ничего не возвращает. Учитывая, что я ничего не сделал с репо, даже начальную фиксацию, я могу принять ответ. Однако, если я запускаю, git status
он сообщает мне, что я нахожусь в master
ветке, как показано здесь:
$ mkdir todelete
$ cd todelete
$ git init
Initialized empty Git repository in /u/u70021a/todelete/.git
$ git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
$ git branch
$
Я делаю что-то неправильно? Есть ли какие-то настройки, которые я неправильно установил?
У меня также есть несколько новых людей в Git, и я не могу объяснить им, почему команда, показывающая, в какой ветке они находятся, ничего не показывает, а команда status показывает.
cat .git/HEAD
чтобы узнать, в какой ветке он находится, выяснение того, что ветка существует, потребует больше времени на ЦП и диск, так что, вероятно, поэтому они этого не сделалиgit branch
автоматизированный процесс, потому что он не предназначен для этого варианта использования. Было бы интересно посмотреть, что показывают здесь не-фарфоровые команды, имеетgit symbolic-ref --short HEAD
ли такое же поведение?git symbolic-ref
показывает имя, содержащееся вHEAD
(отсюда ссылка на сиротскую / нерожденную ветку), при условии, чтоHEAD
оно не отсоединено. В новом пустом репозиторииHEAD
его нельзя отсоединить, поскольку отсоединенный HEAD должен содержать хэш-ID существующей действительной фиксации. (В непустом хранилище, с отдельными ГОЛОВАМИ,git symbolic-ref
выдает ошибку.)git branch
ничего не показывает, потому что ветки нет. Но, как вы можете прочитатьman git init
:Я выделил жирным шрифтом ту часть, которую считаю актуальной - похоже, хотя основной ветки еще нет, ссылка на нее уже существует, и поэтому она показана в
git status
. При фиксации будет создана соответствующая ветка.источник
Существующие ответы обращаются к буквальному вопросу о том, почему результат такой, какой он есть, но я думаю, что они как бы замалчивают реальную проблему ...
Вы сказали , что вы что - то автоматизировать, поэтому я предположил бы , что ни
git status
ниgit branch
является лучшим инструментом в контексте сценариев.Некоторые альтернативы можно найти в этом обсуждении: Как программно определить текущую извлеченную ветку Git
Не зная ваших потребностей (или того, как вы хотите, чтобы будущая ветка вела себя), я не могу дать рекомендации, но я понимаю, что некоторые команды предназначены для взаимодействия с человеком (фарфор), а другие - для сценариев ( сантехника)
источник
Ветка еще не родилась. Поэтому
git branch
не показывает его (git symbolic-ref HEAD
указывает, что ваша HEAD указывает на ведущую ветвь по умолчанию и что она ещеgit branch
не родилась, поскольку не показывает ее, т.е. вы можете находиться в ветке, которая еще не существует). Однако фиксация чего-либо создаст ветку.Это также верно, если вы проверяете
orphan
ветку.Я предполагаю, что
git status
показывает имя ветки, поскольку это ветка, которая будет создана.Для создания сценариев см. Как программно определить текущую извлеченную ветку Git.
источник
В git ветка по умолчанию
master
. Когда вы делаете коммит, git будет "использовать" текущую ветку, в которой вы сейчас находитесь. Поскольку вы инициализировали новый репозиторий, вы находитесь в ветке «по умолчанию», и поэтому вы не видите его в списке веток, он появится, как только вы зафиксируете свои изменения.источник