2010-03-23 12 views

Respuesta

87

"No está actualmente en ninguna rama" significa que tiene detachedhead, es decir, su puntero HEAD está haciendo referencia directamente a una confirmación en lugar de señalar simbólicamente el nombre de una rama.

Puede obtener esta situación revisando una confirmación de SHA1, o cuando se encuentra en medio de una rebase, o cuando falla una fusión. Es difícil decir lo que puede haber hecho para entrar en esta situación por accidente.

Se dice que puede perder sus cambios cuando cambia de un HEAD separado a alguna rama, pero el reflog siempre mantendrá un registro de dónde se movió su HEAD. De hecho, Git 1.7.5 te avisará cuando el cambio de un HEAD separado perderá commits. La única vez que puede realmente perder trabajo es cuando tiene cambios no confirmados, que puede querer comprometer o esconder.

Una manera simple de ver qué sucedió es git reflog o git log -g --decorate para obtener una lista más detallada. La opción --decorate etiquetará cada SHA1 con los nombres de todas las ramas que la señalan. Si el SHA1 de su HEAD actual es exactamente el mismo que el maestro, entonces no tiene que hacer nada más que git checkout master para volver al buen camino. De lo contrario, vea si SHA1 apunta a alguna otra rama. De lo contrario, puede crear una sucursal para aferrarse a ella.

Otro buen comando es git branch -av, que enumerará de manera similar todas las ramas y lo que señalan, para que pueda ver lo que realmente se supone que es (no branch).

+0

+1 para git reflog. Eso me mostró lo que lo estropeó. – kakyo

30

Es difícil de decir sin más detalles.

git pull recupera los cambios del repositorio remoto y luego realiza una fusión. Se puede configurar para hacer una rebase en lugar de una fusión (ya sea haciendo git pull --rebase, o configurando un valor verdadero para branch.<branch_name>.rebase para la rama en la que está tirando).

Si comenzó en una sucursal, cualquier extracción de tipo fusión le dejará siempre en esa sucursal. Por otro lado, el comando rebase siempre funciona usando un HEAD temporalmente separado (también conocido como "no branch"). Si se le dejó en este estado durante una extracción de tipo de rebase, entonces es porque la parte de rebase de la extracción encontró conflictos y está esperando que usted los resuelva y use rebase --continue (o --skip, o --skip, o --abort).

De forma predeterminada, el reflog almacena cada actualización que se realiza en HEAD (también puede haber una para cada rama). Puede ver el reflog con git reflog show (o git log -g para obtener una vista más detallada). Puede ayudarte a determinar cómo llegaste a este estado.

Si se encuentra en medio de una rebase (tiene un directorio .git/rebase-apply), probablemente se detuvo para permitirle resolver algunos conflictos. Use git status para verificar si hay entradas "no fusionadas". Cualquiera de estas entradas debe tener marcadores de conflicto incrustados en los archivos (suponiendo que sean archivos de texto sin formato). Debe editarlos para resolver los conflictos y marcarlos como fusionados ejecutando git add en ellos. Luego ejecute git rebase --continue para continuar con la rebase. Puede encontrarse con más conflictos que deberían manejarse de forma similar (editar, agregar, continuar). Si decide que ya no necesita una confirmación en particular, puede omitirla con git rebase --skip.Puedes abortar toda la rebase con git rebase --abort. Todos estos comandos de rebase se enumeran en el mensaje de error cuando se detiene una rebase debido a cualquier conflicto. Una vez que se hayan aplicado (omitido) todas las confirmaciones pendientes, se actualizará la rama original con la nueva confirmación final y se volverá a unir su HEAD (si aborta, se volverá a conectar su HEAD sin actualizar la rama).

Si su HEAD separado no se debe a conflictos en el medio de una rebase, entonces su HEAD se separó en algún momento antes del tirón. Deberá evaluar el estado actual del árbol para decidir qué desea hacer. Puede usar git show-branch --current --all o git log --graph --oneline --decorate --all o una herramienta gráfica como gitk para averiguar cómo su CABEZA actual (separada) se relaciona con sus otras ramas. Si decide que desea conservar el contenido de su HEAD, puede hacer una nueva sucursal con git branch new_branch_name. Si desea sobrescribir una sucursal existente, utilice git branch --force existing_branch_name. Luego use git checkout branch_name para volver a adjuntar HEAD de su repositorio a una rama.

+1

Un buen consejo sobre la presencia de '.git/rebase-apply' es una pista. – millhouse

1

Tenga en cuenta que, en caso de una "git pull --rebase" correr mientras que el HEAD se separa, Git trató de encontrar la rama aguas arriba de los HEAD (que por definición no existe) y que emite mensajes de error innecesarios unifamiliares.

Esto ya no es el caso de Git1.8.0.1 (26ª noviembre de 2012)

Ver this commit.

Cuestiones relacionadas