¿Por qué se muestra "origin / HEAD" cuando se ejecuta "git branch -r"?

160

Cuando corres, git branch -r¿por qué las llamas enumera origin/HEAD? Por ejemplo, hay un repositorio remoto en GitHub, por ejemplo, con dos ramas: maestra e impresionante función. Si lo hago git clonepara agarrarlo y luego ir a mi nuevo directorio y enumerar las ramas, veo esto:

$ git branch -r
origin/HEAD
origin/master
origin/awesome-feature

O en el orden en que estaría (¿alfa? Estoy fingiendo este ejemplo para mantener en secreto la identidad de un repositorio inocente). Entonces, ¿cuál es el HEADnegocio? ¿Es lo que la última persona que pushtuvo su HEADpunta en cuando empujaron? ¿No será eso siempre lo que sea que hayan pusheditado? HEADs moverse ... ¿por qué me importa lo que alguien haya HEADseñalado en otra máquina?

Solo estoy entendiendo el seguimiento remoto y tal, así que esta es una confusión persistente. ¡Gracias!

EDITAR: tenía la impresión de que los repositorios remotos dedicados (como GitHub, donde nadie ingresará y trabajará en ese código, pero solo tirar o empujar, etc.) no tenían y no deberían tener un HEAD porque, básicamente, había Sin copia de trabajo. ¿No tan?

Ben Hamill
fuente

Respuestas:

140

@robinst es correcto.

En git, puede seleccionar qué rama está desprotegida de forma predeterminada (es decir, cuando clona). Por defecto, origin/HEADapuntará a eso.

En GitHub, puede cambiar esto en la configuración de administrador para su repositorio de GitHub. También puede hacerlo desde la línea de comandos a través de

git remote set-head origin trunk

o eliminarlo por completo a través de

git remote set-head origin -d

Ejemplo . Mire el menú desplegable 'Cambiar ramas'. trunkestá marcado, así origin/HEADsigue trunk.

cdunn2001
fuente
Cambié el nombre de otro control remoto para ser originy mi me otherremote/HEAD -> masterestaba molestando. Ejecutar su comando me lo arregló.
Felipe Alvarez
59

La razón por la que un repositorio simple puede tener un HEAD es porque determina qué rama se extrae inicialmente después de un clon del repositorio.

Normalmente, HEAD apunta a master, y esa es la rama que se extrae cuando las personas clonan el repositorio. Si lo configura en otra rama (editando HEAD en el repositorio simple), la rama se desprotege en el clon.

robinst
fuente
2
Debido a que es posible eliminar esta referencia sin presionar, ¿ origin/HEADes correcta una referencia local? ¿Eliminarlo tiene algún efecto origin?
Zach Posten
@zposten: No, de la misma manera que la eliminación origin/masterno afecta el control remoto.
robinst
Eso significaría que después de clonar la referencia es solo una información inútil.
Bachsau
@Bachsau la referencia no se clona.
robinst 01 de
27

Tenía la impresión de que los repositorios remotos dedicados (como GitHub, donde nadie trabajaría y trabajaría en ese código, pero solo jalar o empujar, etc.) no tenían y no deberían tener un HEAD porque, básicamente, no funcionaba Copiar. ¿No tan?

Tuve exactamente la misma impresión que dijiste.

E incluso no puedo eliminar esa rama de seguimiento remoto de origen / HEAD clonada de github haciendo

git branch -d -r origin/HEAD

Esto no tuvo efecto.

¿Alguien puede decirme cómo puedo eliminar esa rama de seguimiento remoto de origen / HEAD?

actualizar

Aunque no encontré por qué se crea un origen / CABEZA cuando se clona desde github, encuentro una forma de eliminarlo.

La nueva versión de git proporciona

git remote set-head <name> -d

para eliminar el puntero HEAD inútil de la rama de seguimiento remoto.

Y también podemos cambiar el tonto nombre predeterminado 'origen' a lo que queramos usando

git remote rename origin <new_name>

Espero que esto pueda ayudar. :)

boblu
fuente
Tengo el mismo problema (incluso en GitHub), y set-head no funcionó. ¿Debo ejecutar 'git remote set-head HEAD -d'?
Joost Schuur
55
@Joost: esgit remote set-head origin -d
znq
13

Tienes razón en que empujar a repositorios remotos dedicados funciona mucho mejor cuando están 'desnudos', es decir, cuando no tienen directorios de trabajo. La arquitectura de Git está diseñada para actualizarse mediante parches o pull( fetch), lo que tiene sentido en un VCS distribuido. Como dicen los documentos en alguna parte, empujar a una rama que está actualmente desprotegida puede dar lugar a "resultados inesperados" .

El HEAD es parte de los requisitos para un repositorio válido. El diseño del repositorio de Git dice, en parte:

HEAD

A symref (see glossary) to the refs/heads/ namespace describing the currently active  
branch. It does not mean much if the repository is not associated with any working tree  
(i.e. a bare repository), but a valid git repository must have the HEAD file; some  
porcelains may use it to guess the designated "default" branch of the repository  
(usually master). It is legal if the named branch name does not (yet) exist.

Entonces verá HEAD como parte de la lista de sucursales, incluso si "no significa mucho ..."

Pablo
fuente
Esto no tiene sentido. Los repositorios comienzan desnudos, pero en el momento en que les presiona algo, ya no están desnudos y si ejecuta "git branch" en ellos, mostrarán una rama actualmente desprotegida.
geoidésico
@geoidesic Un repositorio podría estar vacío incluso si lo has empujado. Lo siguiente: mkdir foobar; cd foobar; git init --bare; cd ..; git clone foobar foobar_clone; cd foobar_clone; touch file; git add file; git config --global user.email "[email protected]"; git config --global user.name "Your Name"; git commit -m "test"; git push origin master; cd ..; cd foobar; git config core.baresalidas verdaderas. Además, no hay una copia de trabajo del archivo insertado en el repositorio foobar con esos comandos.
Anders Lindén
@geoidesic Un repositorio podría estar vacío incluso si lo has empujado. Lo siguiente: mkdir foobar; cd foobar; git init --bare; cd ..; git clone foobar foobar_clone; cd foobar_clone; touch file; git add file; git config user.email "[email protected]"; git config user.name "Your Name"; git commit -m "test"; git push origin master; cd ..; cd foobar; git config core.baresalidas verdaderas. Además, no hay una copia de trabajo del archivo insertado en el repositorio foobar con esos comandos.
Anders Lindén
@geoidesic A - repositorio git simple solo significa un repositorio sin árbol de trabajo, es decir, un repositorio que solo contiene un directorio .git, pero no puede tener ningún archivo desprotegido. Como no puede tener ningún archivo desprotegido, en realidad ni siquiera tiene un directorio .git, simplemente coloca todos los archivos .git directamente en el directorio principal. ¡Crea uno y verás!
00prometheus
5

Si "origin" es un repositorio remoto, origin / HEAD identifica la rama predeterminada en ese repositorio remoto.

Ejemplo:

$ git remote show
origin
$ git remote show origin
* remote origin
  Fetch URL: [email protected]:walkerh/pipe-o-matic.git
  Push  URL: [email protected]:walkerh/pipe-o-matic.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (fast-forwardable)

Tenga en cuenta la línea que dice "HEAD branch: master". Aquí es donde el repositorio remoto les permite a los clientes saber qué sucursal pagar de manera predeterminada.

Walker Hale IV
fuente
1

Siempre hay un HEAD que apunta a la rama actualmente desprotegida en el repositorio remoto (que puede o no ser maestro). Incluso los repositorios remotos tienen sucursales actuales. Por lo general, es maestro, y no puedo pensar en ninguna razón por la que uno quiera cambiarlo, pero se puede cambiar.

codelogic
fuente
2
los repositorios de github no han revisado las ramas No veo por qué esto se aplicaría.
Dustin
Los repositorios remotos NO deben tener un directorio de trabajo. Los repositorios remotos deben ser --bares y, por lo tanto, no pueden tener una rama actualmente desprotegida.
n4rzul
-14

Supongo que alguien empujó una rama y la llamó HEAD:

git push origin HEAD
Dustin
fuente
¿Puedo obtener algunos comentarios sobre lo que está mal con esto? Si quieres un origen / HEAD en github, esa es la única forma que sé de conseguirlo allí.
Dustin
El HEAD remoto es una referencia simbólica (generalmente para referencias / cabezas / maestra). Reemplazará la referencia simbólica por la identificación hash de la confirmación de su rama actual.
Daniel Fanjul
2
¿No deberían discutirse las suposiciones en los comentarios en lugar de ser una respuesta imprecisa?
Luciano