Git ветка с именем origin / HEAD -> origin / master - PullRequest
42 голосов
/ 05 декабря 2010

Я довольно новичок в Git, и все еще изучаю его.Я только недавно начал работать с ветками и у меня возникли некоторые вопросы.

У меня есть две системы разработки, рабочий стол Ubuntu и MacBookPro.Я проделал кучу работы в новой ветке organizations в системе Ubuntu, выполнил коммиты и отправил в мое удаленное репо.На данный момент у меня были следующие ветви:

tauren@ubuntu:/projects$ git branch
  accounting
  master
* organizations

tauren@ubuntu:/projects$ git branch -r
  origin/accounting
  origin/master
  origin/organizations
  origin/superstar

Затем я переключился на MBP, чтобы вытащить новую ветку:

tauren@osx:/projects$ git branch
  accounting
* master

tauren@osx:/projects$ git branch -r
  origin/HEAD -> origin/master
  origin/accounting
  origin/master
  origin/superstar

tauren@osx:/projects$ git pull
   2e20a14..ef35730  accounting -> origin/accounting
   271a1a5..7e947ab  master     -> origin/master
 * [new branch]      organizations -> origin/organizations

tauren@osx:/projects$ git branch
* accounting
  master

tauren@osx:/projects$ git branch -r
  origin/HEAD -> origin/master
  origin/accounting
  origin/master
  origin/organizations
  origin/superstar

Итак, мои вопросы:

  1. Почему у MBP есть ветвь origin/HEAD -> origin/master, а у системы Ubuntu нет?Что это за ветка?
  2. git pull автоматически вытягивает все новые удаленные ветви?Я думал, что я должен сказать это название новых ветвей, чтобы тянуть.Как видите, он вытянул удаленную ветку organizations на комманду git pull.

Ответы [ 3 ]

40 голосов
/ 05 декабря 2010

HEAD обычно указывает на текущую проверенную ветку.В размещенных (пустых) репозиториях он обозначает ветвь по умолчанию, то есть ветвь, которая извлекается при клонировании репозитория.Итак, origin / HEAD сообщает вам ветку происхождения по умолчанию.

Я не знаю, почему ее нет в вашем хранилище в системе Ubuntu.Возможно, вы изначально вытолкнули свой код из этого репозитория (когда источник был пуст и, следовательно, еще не имел HEAD) и никогда не обновлял его.

Наличие чего-то вроде origin / HEAD на практике не очень важно.Если вы хотите, вы можете использовать git remote set-head origin -a для создания / обновления origin/HEAD

Чтобы ответить на ваш другой вопрос: если вы запускаете git pull без аргументов, он на самом деле получает все с удаленного компьютера (git fetchзапускается без аргументов, так что он просто получает все).Однако все не сливается.Обновляются только ветки удаленного отслеживания (материал в git branch -r).

9 голосов
/ 05 декабря 2010

Насколько я знаю, HEAD - это не ветвь, а указатель на узел дерева истории (т. Е. Коммит). Файлы, которые находятся в вашей конкретной рабочей копии, имеют состояние, описанное HEAD.

Обычно HEAD указывает на самый последний коммит в ветке, поэтому у вас есть самые последние файлы в рабочей копии. Используя git reset HEAD^, вы можете переместить указатель на предыдущий коммит (т.е. отменить последний коммит в вашей локальной копии).

Теперь у каждого git-репо есть HEAD, проверьте это с помощью git show HEAD. Соответственно, origin/HEAD - это HEAD вашего origin пульта.

Теперь я нашел хороший вопрос, описывающий HEAD: Что такое HEAD в Git?

4 голосов
/ 30 июля 2014

Это просто указатель на мастер, символическая ссылка, если хотите. Вы можете безопасно удалить его, выполнив в терминале следующее (или git bash / cygwin для пользователей Windows):

  1. перейдите в ваш репозиторий
  2. Выполнить: git remote set-head origin -d

теперь его не должно быть:

$ git branch -r
origin/master
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...