Por favor, tengo un gran problema en mi proyecto: este es el escenario. Tengo un proyecto de xcode en GIT. Hoy me di cuenta de que la última confirmación rompió algunas pruebas, así que revisé la confirmación anterior. Usé SourceTree y esta es la advertencia
Si lo hace, su copia de trabajo se convertirá en una 'HEAD separada', lo que significa que ya no estará en una rama. Si desea comprometerse después de esto, probablemente desee volver a verificar una rama o crear una nueva rama. ¿Esta bien?
Trabajé todo un día y al final lo comprometí todo. Así que necesitaba fusionar mi trabajo en la rama de desarrollo, así que revisé la rama de desarrollo y ... mi trabajo desapareció instantáneamente :(
Sé que estuvo mal separar mi CABEZA y Sourcetree me advirtió ... pero ¿hay una manera de restaurar mi trabajo?
Respuestas:
Si escribe
git reflog
, le mostrará el historial de las revisionesHEAD
señaladas. Tu cabeza separada debería estar ahí. Una vez que lo encuentre, hagagit checkout -b my-new-branch abc123
ogit branch my-new-branch abc123
(dóndeabc123
está el SHA-1 de la CABEZA separada) para crear una nueva rama que apunte a su cabeza separada. Ahora puede fusionar esa rama a su gusto.En general, si revisa una rama después de trabajar en una cabeza separada, Git debería informarle la confirmación de la cabeza separada en la que había estado, para que pueda recuperarla si lo necesita. Nunca he usado SourceTree, así que no sé si transmite ese mensaje. Pero si mostró ese mensaje, entonces debería poder usarlo para encontrar la confirmación, y nuevamente usar
git checkout -b
ogit branch
para crear una rama a partir de esa confirmación.fuente
fatal: A branch named 'mybranch' already exists.
¿Cómo agregar una rama existente?git cherry-pick e5b2f7b
, ¿dóndee5b2f7b
está el SHA-1 de la confirmación?En Sourcetree, puede hacer esto usando la GUI.
Primero busque la confirmación "perdida" buscando un mensaje en el Historial de comandos (ver: Mostrar salida de comando). Probablemente estará en el comando "Cambio de rama" después de la confirmación que perdió. En ese mensaje, con suerte verá el comentario de confirmación con un ID de confirmación 1234567.
Lleve ese ID de confirmación al siguiente paso.
Presione el botón "Rama" en la barra de herramientas superior y debería obtener un cuadro de diálogo "Nueva rama" donde puede especificar una determinada confirmación. Coloque ese ID de confirmación allí, especifique un nuevo nombre de rama, presione Crear rama y debería obtener una nueva rama con su confirmación perdida.
fuente
Si no desea mantener los cambios de HEAD separado y desea ir a la última confirmación de rama, use el siguiente comando directamente.
Nota: Eliminaré todos sus cambios en el HEAD separado.
fuente
Un colega mío acaba de tener esta situación. En su caso, hubo commits en cabecera desprendida - trabajan en R-Studio-- y la herramienta sí les advirtió que podían crear la rama con esta y aquella referencia SHA ... pero como la única opción era "Cerrar" --¡¡duh !! era un cuadro de información: cerraron el diálogo y perdieron la información para siempre ...
Gracias al
reflog
comando pudimos ver que los cambios no se perdieron. Pero en nuestro caso, elgit branch
no funcionó como se esperaba ... o un entrantegit pull
lo estropeó de alguna manera. Tuvimos que pescar los cambios del reflog a la rama recién creada:que colocó todas las confirmaciones que queríamos en la rama. Entonces podríamos fusionar la rama
develop
sin problemas.En caso de que esto sea informativo para alguien, identificamos las confirmaciones en la cabeza separada en el
reflog
al mirar las que están entre las marcadas con "checkout" (que identifican el cambio de rama):Aquellos que queríamos eran
HEAD@{8}
aHEAD@{6}
(ambos inclusive). Entonces los obtuvimos por:Luego, la resolución de fusión habitual y la confirmación final nos dejaron con la rama lost_changes que aloja el trabajo de cabezal separado que creíamos perdido. Fusionar eso en desarrollo fue un avance rápido esta vez.
fuente
Probé este escenario y encontré que git me dice SHA-1 de la última confirmación:
¿Viste este mensaje?
fuente
git reflog
debería mostrarte lo que necesitas.La cabeza separada está bien siempre que no desee realizar ningún cambio.
Si desea revertir una confirmación, puede usar git revert en una rama específica
Si desea trabajar con la cabeza separada y hacer compromisos; crear una nueva rama (y luego fusionarla);
fuente
git reflog
para ver el historial.git checkout -b temp e35d2b3
aquí e35dd23 es el valor hash de su compromiso.Acéptelo como una respuesta si resuelve su problema. De lo contrario, comparta su comentario.
fuente