No puedo pagar una rama específica, “estado HEAD separado”

6 minutos de lectura

Mi amigo y yo tenemos un repositorio que él creó. Luego creó una rama llamada “lexer” para que trabajáramos.

El problema es que, si bien puede alternar entre maestro y lexer, a mí no me funciona en absoluto.

Eventualmente comencé de nuevo (rm -rf repo y luego clonó el repositorio) pero aún es imposible verificar la rama lexer?

En un repositorio recién clonado:

git branch da:

$ git branch
* master

git checkout lexer da:

$ git checkout lexer
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

¿PUEDO pagar origin/lexer pero termino en un estado HEAD desconectado?

$ git checkout origin/lexer master
Note: checking out 'origin/lexer'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

Es posible para mí empujar a la rama lexer haciendo

git push origin HEAD:lexer

pero bueno, realmente me gustaría arreglar este lío. ¿Es tan raro que a él le funcione pero a mí no? Dice que tampoco tiene cambios locales del repositorio de git …

¿Alguien tiene alguna pista?

Voy a aventurarme a adivinar que tienes un directorio llamado lexer en el nivel superior. Ya que git checkout se usa tanto para cambiar de rama como para restablecer archivos en el árbol, probablemente esté detectando que no tienes una rama llamada lexer pero sí tiene un camino y selecciona el segundo modo. Le funciona a tu amigo porque ya tiene un lexer rama.

La solución más fácil es probablemente crear la rama usando git branch en cambio.

git branch --track lexer origin/lexer

debería hacer eso por ti. A continuación, puede utilizar git checkout para cambiar a él.

Otra opción podría ser utilizar el -- marcar para git checkout. No lo he probado pero creo que debería funcionar:

git checkout lexer --

cuando agregas --la palabra anterior siempre se considera una rama/confirmación/árbol y la palabra posterior a una ruta.

  • La primera solución también funciona si hay una rama y una etiqueta con el mismo nombre.

    – mjobrien

    14 de julio de 2017 a las 14:48

  • Esto funcionó para mí, pero todavía no sé dónde estaba el conflicto. Creé una nueva rama para conservar mis cambios actuales, presioné a mi control remoto, rm -rf’d todo. Reclonado, buscado, verificado mi rama creada recientemente a través de git checkout origin/recently-created-branch y pluma, CABEZA separada. Tu primera sugerencia me arregló todo de inmediato.

    – Shadoninja

    16/10/2017 a las 17:50

  • me he estado preguntando que -- lo hace en los comandos de git desde hace un año. ¡Gracias!

    – GrayedFox

    17 de julio de 2018 a las 13:15

  • Me encontré con esto, sin un directorio en conflicto con el mismo nombre. El segundo comando permitiría el pago, pero aún con HEAD separado. La primera (para agregar información de seguimiento) es la respuesta correcta. Otra variante útil: git checkout -t origin/lexer. ¡Gracias!

    – geipel

    16 abr 2019 a las 21:04


  • git branch –track lexer origin/lexer funciona para mí

    –Yang Wang

    4 de abril de 2020 a las 1:18


Probablemente quieras esto:

git checkout -t origin/lexer

Del manual de git:

Por comodidad, –track sin -b implica la creación de una rama…

y

-t, –track… Al crear una nueva rama, configure la configuración “upstream”… Si no se proporciona la opción -b, el nombre de la nueva rama se derivará de la rama de seguimiento remoto

  • Esto siempre funciona, si lo usó por primera vez en un nuevo repositorio, de lo contrario, mostrará un mensaje fatal: una rama llamada …… etc.

    – El exorcista

    11 de febrero de 2020 a las 13:21

  • ¡Síiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii *1e6

    – scrat.squirrel

    9 oct 2020 a las 15:16

avatar de usuario
phil h

TLDR: Esto podría ser solo un sintaxis tema. En vez de

git checkout origin/mybranch

Probar:

git checkout mybranch

Los pasos que toma git, dado el siguiente comando:

git checkout origin/mybranch
  1. git busca una rama llamada ‘origin/mybranch’ en el repositorio local.
  2. Al no encontrarlo, buscará una rama llamada ‘origin/mybranch’ en los remotos disponibles.
  3. Al no encontrar eso tampoco, intenta tratarlo como una etiqueta de confirmación y encuentra la etiqueta ‘origin/mybranch’ contra una confirmación específica. Comprueba ese compromiso por usted, en un estado separado.

¡Pero eso no era lo que querías! Querías la rama llamada ‘mybranch’. Si solo hay un control remoto con tal rama (y nada localmente para confundir las cosas), entonces git asumirá que te refieres a este uso, completando <remote> para ti:

git checkout -b <branch> --track <remote>/<branch>

Si no puede encontrar una rama con el nombre que coincida, lo predeterminado es esto:

git checkout [--detach] <commit> 

Que es donde entra el mensaje HEAD separado.

Ver los documentos de pago de gity preste atención a <branch> contra <remote>.

  • este era mi problema

    – JobHunter69

    17 de agosto de 2020 a las 16:31

  • esto me llevó una eternidad darme cuenta

    – LuXxenatorX

    23 de septiembre de 2020 a las 10:41

  • estos fueron mis problemas, tuve que eliminar controles remotos/origen

    – SSS

    3 de noviembre de 2020 a las 19:12

avatar de usuario
Felipe

no puedes pagar lexer porque no tiene la rama en su repositorio local (y seguramente una carpeta con el mismo nombre). Solo tiene la rama remota ‘origin/lexer’. Primero tienes que crear la sucursal local:

git checkout -b lexer origin/lexer

Una buena explicación sobre el tema: https://git-scm.com/book/en/v2/Git-Branching-Remote-Branches#Tracking-Branches

Entras en un estado de CABEZA separada porque origin/lexer es una rama de seguimiento remoto y, por lo tanto, solo de lectura. Solo quieres pagar lexer, y haz tu trabajo en eso. Entonces, cuando empujas, origin/lexer se pondrá al día.

Editar: Al volver a leer su pregunta, veo que ha intentado pagar lexer, pero termina quedándose en maestro. es extraño que git checkout está fallando en silencio. Probar git checkout -t origin/lexer.

avatar de usuario
cristiano

Otra suposición descabellada: tiene una etiqueta con el mismo nombre, así que

git checkout lexer

en realidad revisa la etiqueta, no la rama

avatar de usuario
Comunidad

Cuando tu lo hagas: git checkout origin/lexer master simplemente cambias tu HEAD para apuntar a la última confirmación en nuestro remote rama. Es una rama de solo lectura.

Si deseas entender qué es HEAD, lee esto:
¿Cómo mover HEAD a una ubicación anterior? (Cabeza separada)

En tu caso simplemente necesitas hacer lo siguiente:

Actualice su repositorio con el código más reciente con todas las ramas y etiquetas

# Update your local repository with all the remote branches
# --prune = remove all deleted data locally which was removed on the remote
git fetch --all --prune

Ahora deberías tener las últimas sucursales a nivel local.

Eliminar la antigua sucursal local

!!! IMPORTANTE:

Si realizó modificaciones y no las presionó, no elimine la rama local

git branch -D lexer 

Consulte la sucursal deseada

# don't use the remote simply the branch name
git checkout lexer 

Ahora tiene una sucursal local con el nombre lexer extraído de su sucursal remota

¿Ha sido útil esta solución?