Как я могу показать все ветви в хранилище? - PullRequest
0 голосов
/ 12 января 2019

У меня есть хранилище Git. Как мне показать все его ветки?

Должны ли следующие две команды показывать все ветви? Если да, то почему они не показывают ветку master? У меня сложилось впечатление, что в репозитории нет ветки master, при запросе https://stackoverflow.com/questions/54160690/will-pushing-a-new-branch-to-another-repository-create-an-upstream-branch-and-re.

$ git branch -a
  mongodbutils

$ git show-branch
[mongodbutils] mongodbutils

$ ls .git/refs/heads/
mongodbutils

Почему в следующей команде упоминается ветвь master?

$ git show
fatal: your current branch 'master' does not have any commits yet

Как я могу показать все ветви (включая master в данном случае) в хранилище? Я думаю, что это важно, иначе у меня будет такое же ложное впечатление.

Примечание: хранилище было создано git init пустым каталогом, а затем я git push ветвь mongodbutils из другой ветки в эту ветвь.

Ответы [ 3 ]

0 голосов
/ 12 января 2019

Как объясняется в документации git branch, git branch --all (или -a) перечисляет все ветви из локального репозитория, как локальные, так и удаленные ветви отслеживания.

Ветвь Git - это просто указатель на коммит. Новый репозиторий (только что созданный с помощью git init) не содержит никаких коммитов. Текущая ветка в новом репо - master, но ветка master на самом деле не существует. Фактически, новый репозиторий не содержит никакой ветви.

Ветвь master создается при создании первого коммита. Или когда он извлекается из удаленного хранилища.

Поскольку вы не создали ни одного коммита, а также не потянули ветку master, она не существует в вашем репо. Обе команды, которые вы перечислили, показывают эту вещь.

git branch -a - это то, что вы хотите использовать для перечисления ветвей.

git show-branch предназначен для использования скриптами и инструментами с графическим интерфейсом.

0 голосов
/ 12 января 2019

Как Сэм Варшавчик ответил , вы находитесь в особом состоянии. Однако я бы не назвал это недействительным состоянием.

Вы можете достичь этого состояния в любое время, в любом другом хранилище 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 хочет сделать это внутренне.

0 голосов
/ 12 января 2019

В только что созданном git-репозитории, пока что-то не будет помещено в основную ветку, репозиторий фактически находится в слегка «недействительном» состоянии. Заголовок настроен так, чтобы указывать на главную ветвь, но основная ветвь не существует в самом хранилище.

Ветка git является синонимом коммита в HEAD ветви. Ветвь - это просто псевдоним для одного из коммитов в репозитории. Вот и все. Ни больше ни меньше. A git init инициализирует хранилище с HEAD, указывая, что это HEAD главной ветви, но в хранилище нет фактической главной ветви.

Как только первый коммит сделан, он помещается в репозиторий, а ветвь git перезаписывается на указанный коммит. Это происходит с каждым коммитом, не только с начальным коммитом, но теперь, после начального коммита, все в порядке.

С этим сообщением об ошибке вы видите конечный результат текущего, временного, запутанного состояния git. Если вы сделаете git checkout mongodbutils, все следы ветви master исчезнут. Конечно, git show покажет вам фиксацию HEAD этой ветки, и без сообщения об ошибке, и git branch не сообщит ни о каком подтверждении ветки master.

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