2010-11-25 19 views
44

Antes que nada, Git apesta. Lo sé, lo sé, se supone que es lo mejor desde el pan en rebanadas, pero apesta. Es como intentar afeitarse con una motosierra: un pequeño error y hay sangre y dientes en todas partes. Quizás, si pudiera hacer una distinción exacta entre una cabeza, un ref, un compromiso, una rama, un tallo, un gnargel y un whizpoo, algo de esto podría ser un poco más fácil, pero para un mortal ordinario con solo 10 años experiencia de SVN, Perforce y RCS, todo parece una magia negra bastante irritable.Deshacer una mala extracción

Ahora por alguna razón, git pull nunca funcionó para mí. Recibo un mensaje de error de 10 líneas que, hasta ahora, ha sido tan útil como la palabra "error". Buscar en Google el mensaje de error produjo una amplia gama de sugerencias que solo tenían en común el hecho de que no tenían ningún efecto aparente en absoluto. Pero ese no es el problema de hoy: me he acostumbrado a escribir git pull origin branch.

Hoy, estaba pasando de una a otra rama, "master" y "lounge", y en este momento estaba en la rama master. Quería obtener los últimos cambios del repositorio remoto al local, pero lo escribí mal. En lugar de escribir git pull origin master, escribí git pull origin lounge y luego, sin pensarlo, escribí el comando correcto.

No hay evidencia de los primeros (malo) Tirando de registro, a sólo dos fusiones del maestro:

commit 0c6be9569bab0581244ea8603bf2edfee82cdd7b 
Merge: 43fdec5... db09f0d... 
Author: Malvolio <[email protected]> 
Date: Wed Nov 24 20:38:58 2010 -0500 

Merge branch 'master' of github.com:xcompanyx/xRepositoryX 

commit db09f0d79d744d6a354142041b47ff5d748999f3 
Merge: 81b6c3d... fc73e25... 
Author: Malvolio <[email protected]> 
Date: Wed Nov 24 17:38:16 2010 -0800 

Merge branch 'master' of github.com:xcompanyx/xRepositoryX 

commit 81b6c3d04b7c464f8750a56282635526a5ef83a1 
Author: Michael <[email protected]> 
Date: Wed Nov 24 17:38:07 2010 -0800 
    the last commit I did 

Pero los archivos recién creados en la rama salón hay en mi repositorio.

Así que ahora estoy fscked, ¿verdad? ¿Debería encender mi repositorio, volver a clonar el control remoto, volver a aplicar manualmente todos los cambios no utilizados y apuntarlo a Git chupar o hay algún conjuro que pueda recitar que lo haga todo mejor? ¿Ayudaría si sacrificara una cabra?

+15

@Robert - Pero entonces no me gustaría tener una risa tan agradable. –

+0

Y, para el problema original, decidí experimentar con la posibilidad cuando decía "Merge branch 'master'" realmente significaba "Merged [alguna rama desconocida y sin nombre] [con la rama actual, que, como saben, es named] 'maestro' ". Intenté hacer un restablecimiento completo a 81b6. Eso pareció funcionar (aunque, curiosamente, la siguiente extracción del origen recuperado algunos archivos cambió mucho antes) pero como con todo lo demás, Git, tengo que cruzar los dedos. – Malvolio

+7

Me encantaría tratar de ayudarte, pero pasaste la mitad de tu publicación atacando el SCM al que me estás preguntando cómo usarlo, y no proporcionaste información suficiente para responder a tu pregunta. ¿De verdad quieres ayuda, o solo para despotricar? – Cascabel

Respuesta

36

Utilice git reflog para ver a qué se refería su CABEZA antes de atornillarla.

Debería ver algo como:

48ab8d [email protected]{0}: pull: Fast-forward 
a34bda [email protected]{5}: commit: my last commit message 

Ahora, dirija su rama principal hacia atrás en la confirmación antes de que el mal tirón:

git reset --hard a34bda

Hecho. Como si nunca hubiera sucedido

+7

re-flog? Suena aterrador. – Piskvor

+0

Gracias, tendré que investigar el reflog más, pero sí, "restablecer" definitivamente pareció hacer el truco. Sigo teniendo curiosidad sobre la forma en que se ve en el registro, pero la forma en que se ve en el disco es correcta. Y @Piskvor: Lo leí como volver a grabar la primera vez también. ¿Qué dice eso de nosotros? – Malvolio

+0

'git reflog' es el comando que usas cuando' git' te ha quitado el alma y todavía no has resuelto tu problema. Simplemente 'git reflog' y disfruta de otra semana de ser golpeado en la cabeza por la herramienta que se supone que hará tu vida más fácil. Es realmente la única buena nomenclatura en todo el conjunto de comandos de este software POS. * "¡Gracias, Git! ¡Puedo tener otro error!" * – AJB

6

No puedo entender totalmente su historial a partir de su pregunta, pero en general, si realiza dos fusiones (una extracción es una fusión), es completamente sencillo eliminar una de ellas.

- o - o - o - A - M1 - M2 (master) 
       //
     - o - o - o / (origin/lounge) 
        /
      - o - o (origin/master) 

La manera más obvia:

git checkout master 
git reset --hard A 
git merge origin/master 

Esta versión utiliza su caché local de maestro de origen, si desea combinar todo lo que hay ahí fuera ahora, utilizar git pull origin master.