Estaba trabajando en mi repositorio y noté que un archivo tenía cambios locales. Ya no los quería, así que eliminé el archivo, pensando que solo podía sacar una copia nueva. Quería hacer el equivalente Git de
svn up .
Usar git pull
no parecía funcionar. Algunas búsquedas aleatorias me llevaron a un sitio donde alguien recomendaba hacer
git checkout HEAD^ src/
( src
es el directorio que contiene el archivo eliminado).
Ahora descubro que tengo la cabeza separada. No tengo idea de qué es eso. ¿Cómo puedo deshacer?
git checkout master
te llevará de vuelta a la rama maestra. Si desea borrar cualquier cambio de copia de trabajo, probablemente desea hacerlogit reset --hard
.git checkout -- src/
create temp branch - checkout temp branch - checkout master - delete temp branch
working copy changes
? ¿Se refiere a los cambios que realizó en los archivos después de verificar otra confirmación (es decir, los cambios que realizó mientras estaba en un estado de cabeza separada)?Respuestas:
Cabeza separada significa que ya no estás en una rama, has verificado una sola confirmación en el historial (en este caso, la confirmación anterior a HEAD, es decir, HEAD ^).
Si desea eliminar sus cambios asociados con el HEAD separado
Solo necesita verificar la sucursal en la que estaba, p. Ej.
La próxima vez que haya cambiado un archivo y desee restaurarlo al estado en que se encuentra en el índice, no elimine el archivo primero, solo hágalo
Esto restaurará el archivo foo al estado en que se encuentra en el índice.
Si desea mantener sus cambios asociados con el HEAD separado
git branch tmp
: esto guardará sus cambios en una nueva rama llamadatmp
.git checkout master
master
, ejecutegit merge tmp
desde lamaster
rama. Deberías estar en lamaster
rama después de corrergit checkout master
.fuente
Previous HEAD position was 7426948...
Si ha cambiado archivos que no desea perder, puede enviarlos. Los he comprometido en el modo separado y después de eso puedes pasar a una rama temporal para integrarlos más tarde en master.
Extraído de:
Qué hacer con el compromiso realizado en una cabeza separada
fuente
git stash
? Como eso es lo primero que viene a mi mente. crear una nueva sucursal será una exageración.git rebase my-temporary-work
y luego eliminar la ramagit branch -d my-temporary-work
para que parezca que se comprometió con la rama correcta en primer lugar.git stash
suena como la herramienta perfecta para este caso. ¿Podría por favor escribir una respuesta con los pasos sugeridos para lograr eso?Una solución sin crear una rama temporal.
Cómo salir (“arreglar”) el estado HEAD separado cuando ya cambió algo en este modo y, opcionalmente, desea guardar sus cambios:
Confirma los cambios que deseas conservar. Si desea hacerse cargo de cualquiera de los cambios que realizó en el estado HEAD separado, confírmalos. Me gusta:
Descarte los cambios que no desea conservar. El restablecimiento completo descartará cualquier cambio no confirmado que haya realizado en el estado HEAD separado:
(Sin esto, el paso 3 fallaría, quejándose de los archivos no confirmados modificados en el HEAD separado).
Mira tu sucursal. Salga del estado HEAD separado al verificar la rama en la que trabajó antes, por ejemplo:
Asume tus compromisos. Ahora puede hacerse cargo de los compromisos que realizó en el estado HEAD separado mediante la selección de cereza, como se muestra en mi respuesta a otra pregunta .
fuente
git reset --hard
exactitud se fue que necesitaba, porque quiero que el de aguas arriba, siendo la fuente y los cambios locales debe ser eliminado.Cabeza separada significa:
Si no tiene cambios: puede cambiar a maestro aplicando el siguiente comando
Si tiene cambios que desea conservar:
En el caso de un HEAD desconectado, los commits funcionan de manera normal, excepto que no se actualiza ninguna rama con nombre. Para actualizar la rama maestra con sus cambios confirmados, haga una rama temporal donde se encuentre (de esta manera la rama temporal tendrá todos los cambios confirmados que ha realizado en el HEAD separado), luego cambie a la rama maestra y combine la rama temporal con el maestro.
fuente
Esto es lo que acabo de hacer después de darme cuenta de que tenía la cabeza despegada y que ya había realizado algunos cambios.
Cometí los cambios.
Recordé el hash (1fe56ad) de la confirmación. Luego revisé la rama en la que debería haber estado.
Finalmente apliqué los cambios del commit a la rama.
Creo que esto es un poco más fácil que crear una rama temporal.
fuente
git cherry-pick <hash>
.Si realizó algunos cambios y luego se dio cuenta de que está en una cabeza separada, hay una solución simple para eso: stash -> checkout master -> stash pop:
Tendrá sus cambios no comprometidos y la CABEZA "adjunta" normal, como si nada hubiera pasado.
fuente
Cuando revisas una confirmación específica
git
, terminas en una cabeza separada estado de ... es decir, su copia de trabajo ya no refleja el estado de una referencia con nombre (como "maestro"). Esto es útil para examinar el estado pasado del repositorio, pero no lo que desea si realmente está intentando revertir los cambios.Si ha realizado cambios en un archivo en particular y simplemente desea descartarlos, puede usar el
checkout
comando de esta manera:Esto descartará cualquier cambio no confirmado y revertirá el archivo a cualquier estado que tenga en la cabecera de su rama actual. Si desea descartar los cambios que ya ha confirmado, puede usar el
reset
comando. Por ejemplo, esto restablecerá el repositorio al estado de la confirmación anterior, descartando cualquier cambio posterior:Sin embargo, si está compartiendo el repositorio con otras personas, a
git reset
puede ser perjudicial (porque borra una parte del historial del repositorio). Si ya ha compartido los cambios con otras personas, generalmente desea vergit revert
verlos, lo que genera un "anticommite", es decir, crea una nueva confirmación que "deshace" los cambios en cuestión.El Libro Git tiene más detalles.
fuente
git checkout path/to/foo
podría entrar en conflictogit checkout some-branch
, por lo que sería mejor usarlogit checkout -- path/to/foo
para evitar estos conflictos.HEAD está en un puntero y, como resultado, apunta, directa o indirectamente , a un commit particular:
HEAD adjunto significa que está unido a alguna rama (es decir, apunta a una rama).
Independiente medios cabeza que se no conectado a ningún rama, es decir, que apunta directamente a algunos commit.
En otras palabras:
Para comprender mejor las situaciones con HEAD adjunto / desconectado, muestremos los pasos que conducen al cuadruplete de imágenes de arriba.
Comenzamos con el mismo estado del repositorio (las imágenes en todos los cuadrantes son las mismas):
Ahora queremos realizar
git checkout
, con diferentes objetivos en las imágenes individuales (los comandos encima de ellos están atenuados para enfatizar que solo vamos a aplicar esos comandos):Esta es la situación después de ejecutar esos comandos:
Como puede ver, HEAD apunta al objetivo del
git checkout
comando: a una rama (primeras 3 imágenes del cuadruplete) o (directamente) a un commit (la última imagen del cuadruplete).El contenido del directorio de trabajo también se modifica para que esté de acuerdo con el compromiso apropiado (instantánea), es decir, con el compromiso señalado (directa o indirectamente) por el HEAD.
Así que ahora estamos en la misma situación que al comienzo de esta respuesta:
fuente
Dado que el "estado de la cabeza separada" lo tiene en una rama temporal, simplemente use lo
git checkout -
que lo coloca en la última rama en la que estuvo.fuente
git reflog
y pueden transferirse a una nueva sucursal oa través degit cherry-pick
una sucursal existente. Ver esta pregunta .Para aclarar aún más la respuesta de @Philippe Gerber, aquí está:
Antes
cherry-pick
, agit checkout master
es necesario en este caso. Además, sólo se necesita unacommit
endetached head
.fuente
Apéndice
Si la sucursal a la que desea regresar fue el último pago realizado, simplemente puede usar
checkout @{-1}
. Esto lo llevará de regreso a su pago anterior.Además, puede alias este comando, por ejemplo,
git global --config alias.prev
para que solo tenga que escribirgit prev
para volver a la comprobación anterior.fuente
Estar en "cabeza separada" significa que HEAD se refiere a una confirmación específica sin nombre (como opuesta a una rama con nombre) (cf: https://git-scm.com/docs/git-checkout section Cabeza separada )
Para solucionar el problema, solo necesita seleccionar la rama seleccionada anteriormente por
git checkout @{-1}
fuente
Cuando se encuentre en una situación de cabeza separada y cree nuevos archivos, primero asegúrese de que estos nuevos archivos se agreguen al índice, por ejemplo con:
Pero si solo ha cambiado o eliminado archivos existentes, puede agregar (-a) y confirmar con un mensaje (-m) al mismo tiempo a través de:
Luego, simplemente puede crear una nueva rama con su estado actual con:
Tendrá una nueva sucursal y todos sus ajustes estarán allí en esa nueva sucursal. Luego puede continuar presionando hacia el control remoto y / o realizar el pago / extracción / fusión como lo desee.
fuente
Git me dijo cómo hacerlo.
si escribiste:
Guardar el estado
Entonces:
fuente
Quería mantener mis cambios, así que solucioné esto haciendo ...
ese trabajo para mi
fuente
Normalmente
HEAD
apunta a una rama. Cuando no está apuntando a una rama, en cambio, cuando apunta a un hash de confirmación69e51
, significa que tiene un HEAD separado. Debe señalar dos ramas para solucionar el problema. Puedes hacer dos cosas para arreglarlo.hash
fuente
La cabeza separada significa que no ha desprotegido su sucursal correctamente o que ha desprotegido una sola confirmación.
Si encuentra un problema de este tipo, primero oculte los cambios locales para no perderlos.
Después de eso ... verifique la rama deseada con el comando:
Digamos que quieres ramificar MyOriginalBranch:
git checkout -b someName origin / MyOriginalBranch
fuente
probablemente lo hiciste
git reset --hard origin/your-branch
.Intenta solo
git checkout your-branch
fuente
trabajó para mi. Se trataba solo de dar explícitamente el nombre remoto y la rama.
fuente
En mi caso, corro
git status
y vi que tenía algunos archivos sin seguimiento en mi directorio de trabajo.Solo tenía que limpiarlos (ya que no los necesitaba) para ejecutar el rebase que quería realizar.
fuente
Esto funciona para mí, asignará una nueva rama para la cabeza separada:
git checkout new_branch_name detached_head_garbage_name
fuente
El HEAD separado significa que actualmente no estás en ninguna rama. Si desea MANTENER sus cambios actuales y simplemente crear una nueva sucursal, esto es lo que debe hacer:
Posteriormente, es posible que desee fusionar esta nueva rama con otras ramas. Siempre es útil el comando git "a dog" :
fuente