Tengo una sucursal configurada para rastrear una referencia en origen. git checkout <branchname>
cambia a esa rama, y un git status
me mostrará qué tan adelante o detrás de mi rama es de origen, pero me sorprende que origin/HEAD
todavía apunte a origin/master
, y noorigin/<branchname>
Entonces mi pregunta es, ¿bajo qué circunstancias se mueve origen / CABEZA?
EDITAR:
Aprecio las respuestas sobre cómo mover origen / CABEZA, pero estoy interesado en lo que lo mueve "orgánicamente", fuera de mí diciéndome explícitamente que lo haga.
Por ejemplo, cuando cambio ramas, git hace que HEAD apunte a la rama que estoy revisando, así que me sorprende que el origen / HEAD no se mueva de la misma manera.
refs/origin/HEAD
. No se trata de cómoHEAD
se establece la referencia simbólica de un repositorio .Respuestas:
Tenga en cuenta primero que su pregunta muestra un poco de malentendido. origin / HEAD representa la rama predeterminada en el control remoto , es decir, el HEAD 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 las ramas remotas; es posible que tenga
master
yorigin/master
en su repositorio, dondeorigin/master
representa una copia local de lamaster
rama en el repositorio remoto.HEAD de origen solo cambiará si usted u otra persona realmente lo cambia en el repositorio remoto , lo que básicamente nunca debería suceder: desea que la rama predeterminada un repositorio público permanezca constante, en la rama estable (probablemente maestra). origin / 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 seguir adelante y responder la pregunta que hizo explícitamente ... origin / HEAD se configura automáticamente cuando clona un repositorio, y eso es todo. Curiosamente, que está no mediante comandos como
git remote update
- Creo que la única forma en que va a cambiar es si cambia manualmente. (Por cambio me refiero a apuntar a una rama diferente; obviamente, la confirmación apunta a cambios si esa rama cambia, lo que podría suceder en la búsqueda / extracción / actualización remota).Editar : El problema discutido a continuación se corrigió en Git 1.8.4.3 ; ver esta actualización .
Sin embargo, hay una pequeña advertencia. 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 del commit señalado por HEAD y todas las demás referencias; luego tiene que deducir el valor de HEAD encontrando una rama que apunte al mismo commit. Esto significa que si dos ramas apuntan allí, es ambiguo. (Creo que elige maestro si es posible, luego vuelve a alfabéticamente primero). Verá esto informado en la salida de
git remote show origin
:Curiosamente, aunque la noción de HEAD impresa de esta manera cambiará si las cosas cambian en el control remoto (por ejemplo, si se elimina foo), en realidad no se actualiza
refs/remotes/origin/HEAD
. Esto puede conducir a situaciones realmente extrañas. Digamos que en el ejemplo anterior origin / HEAD en realidad apuntaba a foo, y luego se quitó la rama foo de origen. Entonces podemos hacer esto:Entonces, aunque el programa remoto sabe que HEAD es maestro, no actualiza nada. La rama viciada se poda correctamente, y HEAD se cuelga (apuntando a una rama inexistente), y aún no se actualiza para señalar al maestro. Si desea arreglar esto, use
git remote set-head origin -a
, que determina automáticamente el HEAD del origen como se indica arriba, y luego establece el origen / HEAD para que apunte a la rama remota apropiada.fuente
git remote set-head origin -a
hizo el trabajo por míEs su configuración como propietario de su repositorio local. Cámbialo así:
Y origin / HEAD apuntará a su rama en lugar de master. Esto se aplicaría solo a su repositorio y no a otros. Por defecto, apuntará a maestro, a menos que se haya configurado algo más en el repositorio remoto.
La entrada manual para el set-head remoto proporciona buena información al respecto.
Editar: para enfatizar: sin que se lo digas, la única forma en que se "movería" sería un caso como el cambio de nombre de la rama maestra , que no creo que se considere "orgánico". Entonces, yo diría orgánicamente que no se mueve.
fuente
¿Qué mueve origen / CABEZA "orgánicamente"?
git clone
lo establece una vez en el lugar donde está HEAD en origengit clone
¿Qué representa HEAD en origen?
git clone
usa de tal manera¿Qué establece origen / CABEZA?
git clone
busca y lo establecegit fetch
actualiza como cualquier otra referencia, pero nogit remote set-head origin -a
busca y lo estableceTrivialidades
origin/HEAD
También se puede establecer en cualquier otro valor sin contactar con el control remoto:git remote set-head origin <branch>
fuente
origin/HEAD
y su solución ayudó. ¡Gracias!git fetch
actualizarlo, ya que permite configurar un acceso directo (local). Citando el documento: "No es necesario tener una rama predeterminada para un control remoto, pero permite que se especifique el nombre del control remoto en lugar de una rama específica". Sería extraño que un cambio remoto actualizara los accesos directos configurados localmente.origin/HEAD
es un mal nombre. Y eso quegit clone
usa un nombre remoto como predeterminado para una "rama configurada localmente" también lo contradice. En repositorios no desnudos, ni siquiera tiene sentido usar la corriente remotaHEAD
.Descargo de responsabilidad : esta es una actualización de la respuesta de Jefromi , que estoy escribiendo para salvar a los curiosos algún tiempo.
Intenté en vano replicar (en Git 2.0.1) el
remote HEAD is ambiguous
mensaje que Jefromi menciona en su respuesta; así que hice un poco de excavación (clonando https://github.com/git/git y buscando en el registro). Solía ser eso(Commit
4229f1fa325870d6b24fe2a4c7d2ed5f14c6f771
, de fecha 27 de febrero de 2009, encontrado congit log --reverse --grep="HEAD is ambiguous"
)Sin embargo, la ambigüedad en cuestión se ha eliminado desde entonces :
(Commit
9196a2f8bd46d36a285bdfa03b4540ed3f01f671
, con fecha del 8 de noviembre de 2013, encontrado congit log --grep="ambiguous" --grep="HEAD" --all-match
)Editar (gracias a torek ):
Esto significa que, si está utilizando Git v1.8.4.3 o posterior , no debería encontrarse con ningún problema ambiguo-remoto-HEAD.
fuente
Recuerde que hay dos repositorios de git independientes de los que estamos hablando. Su repositorio local con su código y el control remoto ejecutándose en otro lugar.
Tienes razón, cuando cambias una rama, HEAD apunta a tu rama actual. Todo esto está sucediendo en su repositorio local de git. No el repositorio remoto, que podría ser propiedad de otro desarrollador, o ubicarse en un servidor en su oficina, o github, u otro directorio en el sistema de archivos, o etc.
Su computadora (repositorio local) no tiene por qué cambiar el puntero HEAD en el repositorio git remoto. Podría ser propiedad de un desarrollador diferente, por ejemplo.
Una cosa más, lo que su computadora llama origen / XXX es su comprensión del estado del control remoto en el momento de la última búsqueda.
Entonces, ¿qué actualizaría "orgánicamente" origen / CABEZA? Sería actividad en el repositorio remoto de git. No es tu repositorio local.
La gente ha mencionado
Normalmente, eso se usa cuando hay un repositorio central compartido de git en un servidor para uso del equipo de desarrollo. Sería un comando ejecutado en la computadora remota. Vería esto como actividad en el repositorio remoto de git.
fuente
Ejecute los siguientes comandos desde git CLI:
fuente