Terminé con una cabeza separada hoy, el mismo problema que se describe en: git push dice que todo está actualizado a pesar de que tengo cambios locales
Hasta donde sé, no hice nada fuera de lo común, solo me comprometí y presioné desde mi repositorio local.
Entonces, ¿cómo terminé con un detached HEAD
?
branch-name@{n}
, la enésima posición anterior debranch-name
. Pero no importa qué, en algún momento debe haber habido ungit checkout <rev>
. Si eso no suena, entonces probablemente hiciste lo que Will mencionó: trató de hacergit checkout <file>
y logró especificar una revisión por accidente.git status
:all conflicts fixed: run "git rebase --continue"
git checkout remotes/origin/my-branch
lugar degit checkout my-branch
ogit checkout origin/my-branch
.Respuestas:
Cualquier pago de un commit que no sea el nombre de una de sus sucursales le dará un HEAD separado. Un SHA1 que representa la punta de una rama todavía da una CABEZA separada. Solo el pago de un nombre de sucursal local evita ese modo.
Ver comprometerse con una CABEZA separada
Por ejemplo, si desprotege una "rama remota" sin rastrearla primero, puede terminar con un HEAD separado.
Ver git: cambiar de rama sin separar la cabeza
Con Git 2.23 (agosto de 2019), ya no tiene que usar el comando confuso
git checkout
.git switch
también puede pagar una rama y obtener un HEAD de separación, excepto:--detach
opción explícitaVer:
Vs. usando el nuevo
git switch
comando:Si desea crear una nueva sucursal local que rastrea una sucursal remota:
¡No más errores!
¡No más CABEZA separada no deseada!
fuente
git commit files creates a new commit containing the contents of the latest commit, plus a snapshot of files taken from the working directory. Additionally, files are copied to the stage.
¿Qué significa "los archivos se copian en el escenario"? Pensé que los archivos estaban confirmados, lo que significa que la etapa está despejada.master
esté ened489
el diagrama de arriba,git checkout ed489
le dará un HEAD separado, mientrasgit checkout master
que no lo hará."You can think of this as an anonymous branch"
:) Me gusta la analogíaReproduje esto hace un momento por accidente:
enumera las ramas remotas
Quiero pagar uno localmente, así que corté pegar:
¡Presto! Estado HEAD separado
Solución # 1:
No incluya
origin/
en la parte delantera de la especificación de mi rama cuando la revise:Solución # 2:
Agregar
-b
parámetro que crea una rama local desde el remotogit checkout -b origin/Feature/f1234
ogit checkout -b Feature/f1234
volverá a su origen automáticamentefuente
git checkout -b Feature/f1234
<=>git branch Feature/f1234
ygit checkout Feature/f1234
.origin/branchname
, se buscaorigin/origin/branchname
decir que el primero es el nombre remoto que usa-b
, si no lo hace, crea unaanonymous
rama que se separa. Del mismo modo, para retirar desde un control remoto diferente, tendría que mencionar el-b
parámetro; de lo contrario, git no tiene una manera de saber que es desde un nuevo control remoto, lo buscaráorigin/remote/branchname
.tratar
esto le brinda un historial de cómo su HEAD y los punteros de rama se movieron en el pasado.
p.ej :
88ea06b HEAD @ {0}: pago: pasar de DESARROLLO a controles remotos / origen / SomeNiceFeature e47bf80 HEAD @ {1}: extraer origen DESARROLLO: Avance rápido
la parte superior de esta lista es una razón por la que uno podría encontrarse con un estado de CABEZA DESCONECTADA ... revisando una rama de seguimiento remoto.
fuente
Puede suceder fácilmente si intenta deshacer los cambios que ha realizado al volver a extraer los archivos y no obtener la sintaxis correcta.
Puede ver el resultado de
git log
: puede pegar la cola del registro aquí desde la última confirmación exitosa, y todos podríamos ver lo que hizo. O bien, puede pegarlo y preguntar#git
sobre IRC de freenode.fuente
Puede suceder si tiene una etiqueta con el mismo nombre que una rama.
Ejemplo: si "release / 0.1" es el nombre de la etiqueta, entonces
produce CABEZA separada en "release / 0.1". Si espera que release / 0.1 sea un nombre de sucursal, se confunde.
fuente
Detached HEAD
significa que lo que está actualmente desprotegido no es una sucursal local.Algunos escenarios que resultarán en un
Detached HEAD
estado:Si paga una sucursal remota , diga
origin/master
. Esta es una rama de solo lectura. Por lo tanto, cuando se crea una confirmación a partir deorigin/master
ella, será flotante , es decir, no estará conectada a ninguna rama.Si revisa una etiqueta o confirmación específica . Al realizar una nueva confirmación desde aquí, volverá a flotar libremente , es decir , no estará conectada a ninguna rama. Tenga en cuenta que cuando se desprotege una rama , las nuevas confirmaciones siempre se colocan automáticamente en la punta.
Cuando desee regresar y pagar una confirmación o etiqueta específica para comenzar a trabajar desde allí, puede crear una nueva rama que se origine a partir de esa confirmación y cambiar a ella
git checkout -b new_branch_name
. Esto evitará elDetached HEAD
estado ya que ahora tiene una rama desprotegida y no una confirmación.fuente
Una forma accidental simple es hacer un
git checkout head
como un error tipográfico deHEAD
.Prueba esto:
lo que da
fuente
checkout -b
que parece un pago pero en realidad se ramifica) pero otra lista es bienvenida.La otra forma de entrar en un estado de cabeza separada de git es intentar comprometerse con una rama remota. Algo como:
Tenga en cuenta que si hace esto, cualquier intento adicional de verificar origen / foo lo devolverá a un estado de cabeza separada.
La solución es crear su propia sucursal local de foo que rastree el origen / foo, luego opcionalmente presione.
Probablemente esto no tenga nada que ver con su problema original, pero esta página tiene muchos éxitos de Google para "git detached head" y este escenario está muy poco documentado.
fuente
Cuando finaliza la compra en un commit
git checkout <commit-hash>
o en una rama remota, su HEAD se separará e intentará crear un nuevo commit en él.Las confirmaciones a las que ninguna rama o etiqueta puede acceder serán basura recolectada y eliminada del repositorio después de 30 días.
Otra forma de resolver esto es mediante la creación de una nueva rama para el commit y checkout recién creado.
git checkout -b <branch-name> <commit-hash>
Este artículo ilustra cómo puede llegar al estado HEAD separado .
fuente