Tenga en cuenta primero que su pregunta muestra un poco de malentendido.origen/HEAD representa la rama predeterminada en el control remoto, es decir, la CABEZA que está en ese repositorio remoto al que está llamando origen. Cuando cambias ramas en tu repositorio, no estás afectando eso. Lo mismo es cierto para sucursales remotas; Es posible que tenga master
y origin/master
en su repositorio, donde origin/master
representa una copia local de la rama master
en el repositorio remoto. CABEZA
de origen sólo cambiará si usted o alguien más en realidad cambia en el repositorio remoto, que básicamente no debería ocurrir nunca - desea que la rama por defecto un acuerdo de recompra pública de permanecer constante, en la rama estable (probablemente dominar) . origen/HEAD es una referencia local que representa una copia local de HEAD en el repositorio remoto. (Su nombre completo es refs/remotes/origin/HEAD.)
Creo que lo anterior responde a lo que realmente quería saber, pero para continuar y responder a la pregunta que hizo explícitamente, se establece origen/HEAD automáticamente cuando clonas un repositorio, y eso es todo. Curiosamente, es no establecido por comandos como git remote update
- Creo que la única forma en que cambiará es si lo cambia manualmente. (Por cambio me refiero a punto a una rama diferente; obviamente, el cometer apunta a cambios si es que los cambios de la rama, lo que podría suceder en FETCH/tire/actualización remota.)
Editar: El problema discuten a continuación fue corregido en Git 1.8.4.3; ver this update.
Hay una pequeña advertencia, sin embargo. HEAD es una referencia simbólica, que apunta a una rama en lugar de directamente a una confirmación, pero los protocolos de transferencia remota de git solo informan confirmaciones para las referencias. Entonces, Git conoce el SHA1 de la confirmación señalada por HEAD y todos los demás refs; luego debe deducir el valor de HEAD al encontrar una rama que apunte al mismo compromiso. Esto significa que si dos ramas apuntan allí, es ambiguo. (Creo que recoge maestro, si es posible, entonces cae de nuevo a la primera orden alfabético.) Verá este informa en la salida del git remote show origin
:
$ git remote show origin
* remote origin
Fetch URL: ...
Push URL: ...
HEAD branch (remote HEAD is ambiguous, may be one of the following):
foo
master
Curiosamente, aunque la idea de la cabeza de impresión de este modo va a cambiar si las cosas cambio en el control remoto (por ejemplo, si se elimina foo), en realidad no actualiza refs/remotes/origin/HEAD
. Esto puede conducir a situaciones realmente extrañas. Digamos que en el ejemplo anterior, el origen/HEAD apuntaba a foo y luego se eliminaba la rama foo del origen. Entonces podemos hacer esto:
$ git remote show origin
...
HEAD branch: master
$ git symbolic-ref refs/remotes/origin/HEAD
refs/remotes/origin/foo
$ git remote update --prune origin
Fetching origin
x [deleted] (none) -> origin/foo
(refs/remotes/origin/HEAD has become dangling)
Así que aunque el show remoto sabe que HEAD es maestro, no actualiza nada. La rama foo obsoleta se poda correctamente, y la CABEZA queda colgando (apuntando a una rama inexistente), y todavía no la actualiza para apuntar a la maestra. Si quiere arreglar esto, use git remote set-head origin -a
, que automáticamente determina el HEAD del origen como arriba, y luego realmente establece el origen/HEAD para apuntar a la rama remota apropiada.
Tenga en cuenta que esta pregunta es sobre referencias simbólicas locales en controles remotos, como 'refs/origin/HEAD'. No se trata de cómo se establece la referencia simbólica propia del repositorio 'HEAD'. – clacke