2010-12-05 13 views
38

Soy bastante nuevo en Git, y todavía estoy aprendiendo a manejarlo. Recientemente comencé a trabajar con sucursales y tengo algunas preguntas.Git branch named origin/HEAD -> origin/master

Tengo dos sistemas de desarrollo, un escritorio Ubuntu y un MacBookPro. Hice un montón de trabajo en una nueva rama organizations en el sistema Ubuntu y realicé confirmaciones y las envié a mi repositorio remoto. En este punto, tuve estas ramas:

[email protected]:/projects$ git branch 
    accounting 
    master 
* organizations 

[email protected]:/projects$ git branch -r 
    origin/accounting 
    origin/master 
    origin/organizations 
    origin/superstar 

Luego me cambié a la MBP para tirar de la nueva rama:

[email protected]:/projects$ git branch 
    accounting 
* master 

[email protected]:/projects$ git branch -r 
    origin/HEAD -> origin/master 
    origin/accounting 
    origin/master 
    origin/superstar 

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

[email protected]:/projects$ git branch 
* accounting 
    master 

[email protected]:/projects$ git branch -r 
    origin/HEAD -> origin/master 
    origin/accounting 
    origin/master 
    origin/organizations 
    origin/superstar 

Así que mis preguntas son las siguientes:

  1. ¿Por qué la MBP tiene una rama origin/HEAD -> origin/master, pero el sistema Ubuntu no? ¿Qué es esa rama?
  2. ¿git pull tira automáticamente de todas las ramas remotas nuevas? Pensé que tenía que decirle el nombre de nuevas ramas para tirar. Como puede ver, sacó la rama remota organizations en la línea git pull.

Respuesta

35

HEAD por lo general apunta a la rama actualmente desprotegido. En los repositorios alojados (desnudos), designa la rama predeterminada, es decir, la rama que está desprotegida al clonar el repositorio. Entonces, origen/HEAD te dice la rama de origen por defecto.

No sé por qué no está presente en su repositorio en el sistema Ubuntu. Tal vez originalmente presionó su código desde ese repositorio (cuando el origen estaba vacío y, por lo tanto, aún no tenía HEAD) y nunca lo actualizó.

Tener algo como origen/HEAD no es terriblemente importante en la práctica, de todos modos.

Para responder a su otra pregunta: si ejecuta git pull sin argumentos, en realidad recupera todo desde el control remoto (git fetch se ejecuta sin argumentos, también, por lo que simplemente obtiene todo). Sin embargo, no todo se fusiona. Solo se actualizan las ramas de seguimiento remoto (lo que está en git branch -r).

+5

Oh, olvidé mencionar: se puede usar 'git remote set-head origin -a' para tener origin/HEAD creado/actualizado. –

+2

La [documentación] (http://www.kernel.org/pub/software/scm/git/docs/git-remote.html) para 'git remote set-head' es útil para comprender el propósito de, p. 'origen/HEAD'. – millerdev

9

Por lo que yo sé, HEAD no es una rama, sino más bien un puntero a un nodo del árbol de historial (es decir, una confirmación). Los archivos que residen en su copia de trabajo particular tienen el estado descrito por HEAD.

Generalmente HEAD apunta a la confirmación más reciente en una rama, por lo que tiene los archivos más recientes en la copia de trabajo. Usando git reset HEAD^ puede cambiar el puntero a la confirmación previa (es decir, deshacer la última confirmación en su copia local).

Ahora, cada git repo tiene un HEAD, verifique esto con git show HEAD. Por consiguiente, origin/HEAD es HEAD de su control remoto origin.

Ahora, he encontrado una buena pregunta que describe HEAD: What is HEAD in Git?

3

Es solo un puntero al maestro, un enlace simbólico si lo desea.Puede eliminar con seguridad haciendo lo siguiente en un terminal (o git bash/cygwin para los usuarios de Windows):

  1. navegar a su repositorio
  2. ejecutar: git remote set-head origin -d

ahora debe desaparecer :

$ git branch -r 
origin/master