2010-08-21 10 views
8

Tenía un montón de ramas separadas, y quería unirlas, ya que cada una de ellas era una actualización de una parte diferente del programa.Reparando Git repo después de la fusión incorrecta

Supongo que se suponía que debía fusionarlos, pero en su lugar ejecuté git commit -a después de marcar cada rama.

Luego me di cuenta de que todo el programa se remontaba en el tiempo, así que ejecuté git reset --soft HEAD (lo leí en un artículo en alguna parte que debería ayudar), pero eso no sirvió de nada.

También recibí este mensaje de git sobre la eliminación manual de algunos ./git/index.lock, así que lo moví a ./git/backup_of_index.lock, pero eso tampoco pareció hacer nada.

¿Cómo arreglo mi repositorio y fusiono todas las ramas?

+3

volver a una vieja copia de seguridad siempre funciona para mí –

+8

primer lugar, hacer una copia de seguridad completa de su árbol de trabajo y 'carpeta .git' ahora y poner en un lugar seguro, preferiblemente de sólo lectura. Por lo que has dicho, parece muy poco probable que hayas perdido el trabajo (no hay 'reset --hard', y parece que estuviste jugando con cosas comprometidas con las ramas). Una vez que hayas hecho eso, ve y encuentra a un experto en git en un canal interactivo en algún lugar que pueda informarte cómo buscar y restaurar tu estado anterior. Stackoverflow es casi seguro que no es el foro para esto porque necesitas ayuda interactiva, no solo preguntas y respuestas. –

+0

Gracias a todos, voy a utilizar toda la sugerencia y resolver algo, realmente no puedo elegir una respuesta todavía. –

Respuesta

1

errores:

  1. "Empecé a jugar con Git en mi nuevo proyecto"
  2. "Sólo quería combinarlos como cada uno de ellos eran una actualización de diferentes partes del programa"

No debería estar jugando con un territorio desconocido cuando su código significa algo. Si desea hacer esto, al menos tenga un plan alternativo.

La recuperación de desastres parece ser solo importante para aquellos que más lo necesitan pero en ese punto ya es demasiado tarde.

Estoy todo por la experimentación pero odio ver este tipo de situación, me siento mal por el desarrollador, ya que conozco sus zapatos muy bien, sin embargo, después de aprender este error, nunca lo olvidarás.

Antes de decidirse a jugar, tome su código y tírelo a otra parte para que cuando sh * t llegue al ventilador pueda volver a su zona de confort y continuar trabajando como un desarrollador feliz y volver a jugar después de obtener su trabajo hecho.

+0

Aunque estoy de acuerdo con sus puntos, esta no es una respuesta a la pregunta. Debería publicarse como comentario (aunque soy consciente de que los comentarios no pueden incluir este texto). – Jeff

+4

Originalmente comencé a escribir el comentario y me quedé sin espacio. : -/ – Chris

4

A menos que haya pirateado los datos en el directorio .git, es poco probable que haya perdido algo. Es posible que tenga que hacer un lío terrible para limpiar, y puede llevar mucho tiempo calcular qué hizo y dónde está, pero es probable que no haya perdido nada.

Esa es la buena noticia.

La mala noticia es que va a ser diabólicamente difícil para cualquiera ayudarlo mucho.

Es probable que necesite identificar todas las ramas y rastrear las confirmaciones de cada una de ellas. Tendrá que decidir si todas esas operaciones 'git commit -a' fueron una buena idea. Parece poco probable, por lo que es posible que deba realizar las fusiones correctamente, trabajando desde la siguiente hasta la última confirmación en cada rama.

También debe decidir lo que realmente estaba tratando de hacer.

Parece que quería fusionar algunas ramas, llámelas BranchA, BranchB y BranchC, a la rama principal, maestra. Pero no está claro eso es lo que probaste.

Dado que las cosas son un desastre, recomiendo crear otra rama que podemos llamar 'Reparación'. Crea esto desde el jefe de la rama principal.Luego, combine la versión adecuada de cada una de las BranchA, BranchB y BranchC en la rama Fixup. En cada etapa, verifique que el código realmente funcione correctamente, pasando su suite de pruebas, etc. Verifique cada fusión por separado en la rama de Reparación.

Cuando esté seguro de que la rama Fixup es correcta, vuelva a la rama principal y fusione la rama Fixup a la maestra.


Charles Bailey hace la sugerencia muy sensible (en un comentario a la pregunta): antes de hacer cualquier otra cosa, hacer una copia de seguridad de lo que se tiene, tal y como se encuentra actualmente. Solo entonces proceda con cualquier operación de limpieza. Y su sugerencia de obtener ayuda interactiva también es sensata.

14

El comando git más importante en esta situación es git reflog. El reflog rastrea todos los cambios en cada cabecera de bifurcación en particular, y el comando git reflog enumera todos los cambios en el cabezal de bifurcación que se remonta en el tiempo.

Si puede identificar una identificación de confirmación "buena" utilizando el reflog (y estará allí, en algún lugar), entonces está muy por delante de donde se encuentra ahora. Si un buen compromiso id es decir, abc123, entonces el comando:

git checkout -b rescue abc123 

crea una nueva rama llamada rescue en la Identificación del abc123 comprometerse.

Cuando estaba aprendiendo git, tenía un tipo similar de "¿dónde diablos estoy y cómo llegué aquí?" momento. Aprendí sobre el reflog en un different Stack Overflow question, y ha sido lo más valioso para saber sobre Git.

+0

Respiro este comentario como el que debes prestarle atención a Jonathan. Ejecute 'git reflog' (o' git log -g' para obtener la misma información con más datos), encuentre el último commit que fue bueno y revise una bifurcación en ese punto. –

+0

Además, hay un poco de documentación sobre una situación como esta aquí: http://progit.org/book/ch9-7.html#data_recovery –

+0

Venía aquí para decir "¡reflog!" solo por el título de la pregunta solo. – masonk

1

Una de las cosas increíbles de Git es que puede duplicar fácilmente todo su repositorio de trabajo. Esto le permite conservar una copia de seguridad mientras experimenta con ramificación y fusión.

Mi enfoque se propone para resolver su problema actual:

  1. Crear una copia de seguridad de toda su repositorio
  2. Experimento con las copias de usar y tirar del repositorio
  3. Cada vez que una pata haciendo que sus fuera del repositorio: deséchelo y vuelva a empezar con una nueva copia de su copia de seguridad
  4. Eventualmente, comenzará a dominar la piratería de repositorios; habrá recuperado su trabajo y se sentirá bien con lo que ha aprendido

Además, espero que esté utilizando gitk (o similar) para examinar los efectos de los cambios - lo que realmente puede ayudar a visualizar las diferentes líneas de código y cómo están relacionados.

gitk --all ## show me all the branches 
+0

Además (¿incluso mejor?): 'Gitk --reflog' - Creo que esta es una característica nueva, pero muy útil. – nobar