Чому “git status” показує, що я перебуваю у головній гілці, а “git branch” - у новоствореному сховищі?


83

Я намагаюся автоматизувати процес і видаю git branchкоманду, щоб з'ясувати, в якій гілці я перебуваю. Все працює нормально, крім нещодавно ініціалізованого репо, де git branchнічого не повертається. Враховуючи, що я нічого не зробив з репо, навіть початковий коміт, я можу прийняти відповідь. Однак, якщо я запускаю a, 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 робить.

Відповіді:


94

Я підтримав дві інші відповіді, але я думаю, що спосіб думати про це простий: ти можеш бути на гілці, якої не існує. Це нормально і в новому порожньому сховищі, оскільки для існування імені гілки це ім’я гілки має ідентифікувати хеш-ідентифікатор існуючого дійсного коміту. У новому порожньому сховищі немає комітів, тому поки не дозволяється існувати імена гілок.

Тим не менше, ви спочатку знаходитесь у якійсь галузі. Ви знаходитесь у тій гілці, назва якої зберігається в спеціальній назві HEAD. У новому, порожньому сховищі Git зберігає ім'я master(точніше refs/heads/master- повне ім'я гілки) у HEAD, таким чином, ви працюєте master, поки masterне існує.

Ви можете змінити, яку неіснуючу гілку використовуєте git checkout -b:

$ git init
Initialized empty Git repository in [path]
$ git checkout -b asdf
Switched to a new branch 'asdf'
$ git checkout -b hello
Switched to a new branch 'hello'

Всякий раз, коли ви знаходитесь у гілці, яка не існує, наступне комітування, яке ви робите, створює гілку. Це також git checkout --orphanпрацює.


6
Дякую. Хоча я не згоден з тим, що відображає git. Принаймні я розумію, чому. Ваш приклад оформлення замовлення цікавий. Відповідно до документації для "git checkout" -b означає: Створити нову гілку з назвою <new_branch>, що не є суто істинним. У вашому прикладі насправді не створено жодної гілки asdf або hello. Але вони будуть, якщо виконується коміт. Моя особиста думка полягає в тому, що повідомлення "Про головний гілку" слід змінити на "Наступне комітування до головного гілки", оскільки доки не буде здійснено фіксацію, головна гілка не існує.
GOVarney

2
Я не впевнений, чи це стосується вашої справи чи ні, але я хочу зазначити, що для Git можна взагалі не бути на жодній гілці.
sklott

Git внутрішньо використовує, cat .git/HEADщоб побачити, на якій гілці він знаходиться, вважаючи, що гілка існує, споживатиме більше процесора та дискового часу, тому, мабуть, тому вони цього не зробили
Ferrybig

Що слід зазначити, це те, що ви не повинні використовувати git branchв автоматизованому процесі взагалі, оскільки він не призначений для цього випадку використання. Було б цікаво подивитися, що тут показують не-фарфорові команди, чи git symbolic-ref --short HEADмає таку ж поведінку?
Voo

@Voo: git symbolic-refпоказує ім'я, що міститься в HEAD(отже, посилання на сироту / ненароджену гілку) за умови, що HEADвоно не відокремлене. У новому порожньому сховищі HEAD не можна від'єднати, оскільки від'єднана HEAD повинна містити ідентифікатор хешу існуючого дійсного коміту. (В непорожньої сховище, з окремими ГОЛОВАМИ, git symbolic-refвидає помилку.)
Торека

23

git branchнічого не показує, оскільки немає гілки. Але, як ви можете прочитати в man git init:

Ця команда створює порожнє сховище Git - в основному каталог .git з підкаталогами для об'єктів, посилань / головок, посилань / тегів та файлів шаблонів. Також створюється початковий файл HEAD, який посилається на HEAD головного гілки.

Я полужирная частина я думаю , актуальний - схоже , хоча немає ніякого майстер гілки ще, посилання вже існує , і саме тому він показаний в git status. Відповідна гілка буде створена після комітування.


3
Отже, схоже, що "git status" просто відображає "ім'я гілки", як показано в .git / HEAD (ref: refs / heads / master), але не перевіряє узгодженість, заглядаючи в .git / refs / heads, щоб перевірити, чи це насправді існує.
GOVarney

Я не можу точно сказати, оскільки я не перевіряв код git, але те, що ви написали, для мене має сенс. Але все-таки я віддаю перевагу відповіді Торека перед моєю :).
Stanowczo,

17

Існуючі відповіді стосуються буквального запитання, чому результат є таким, який він є, але я думаю, що вони начебто зачепили справжню проблему ...

Ви сказали , що ви що - то автоматизувати, тому я припустив би , що ні git statusні git branchє найкращим інструментом в контексті сценаріїв.

Деякі альтернативи можна знайти в цій дискусії: Як програмно визначити поточну перевірену гілку Git

Не знаючи своїх потреб (або того, як ви хотіли б поводитись ще ненародженою гілкою), я не можу неодмінно робити рекомендації, але суть, до якої я доходжу, полягає в тому, що деякі команди призначені для взаємодії з людьми (порцеляна), а інші - для сценаріїв ( сантехніка)


15

Гілка ще не народжена. Тому git branchне показує його ( git symbolic-ref HEADвказує на те, що ваш HEAD вказує на головного гілки за замовчуванням і що він ще git branchне народжений, оскільки цього не показує, тобто ви можете бути на гілці, яка ще не існує). Однак, щось здійснивши, створить гілку.

Це також має місце, якщо ви оформляєте orphanфілію.

Я вважаю, що git statusпоказано назву гілки, оскільки це гілка, яка буде створена.

Для сценаріїв див. Як програмно визначити поточну перевірену гілку Git


2

У git гілкою за замовчуванням є master. Коли ви зафіксуєте git, він буде "використовувати" поточну гілку, яку ви використовуєте зараз. Оскільки ви ініціалізували нове сховище, ви перебуваєте у гілці "за замовчуванням", і саме тому ви не бачите його у своєму списку гілок, воно з'явиться після того, як ви внесете зміни.

введіть тут опис зображення

введіть тут опис зображення


2
Я розумію розгалуження, не розумію, чому "git status" говорить, що я на гілці, якої не існує.
GOVarney
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.