2011-09-17 17 views
14

que acabo de hacer un¿Cómo deshacer una calabaza de combinación git?

git merge --squash feature-branch 

en mi develop rama.

El problema es que el comando anterior actualizó el encabezado sin crear un nuevo compromiso. Mi intención era crear un compromiso único para aplicar al jefe de develop.

En resumen, el registro para la rama develop antes y después de la fusión es exactamente el mismo.

¿Hay alguna forma de revertir develop a lo que era antes del git merge?

Gracias.

Solución

Basado en el comentario de Dan D. y la respuesta aceptada por debajo pude resolver mi problema. Vea a continuación lo que hice en caso de que esté en el mismo barco:

1 - Ejecuté git reflog y enumeré todas las confirmaciones y registros que hice con mi sucursal develop.

2 - En lugar de hacer un git reset [email protected]{1} según lo sugerido, encontré el número cuando hice el último compromiso para desarrollar que quería mantener. En mi caso fue [email protected]{188}. Así que escribí git reset [email protected]{188}.

3 - ejecuté git log y tenía un registro limpio que mostraba solo las confirmaciones que tenía antes de hacer la combinación incorrecta.

4 - Ejecuté git add -A . para representar todos los nuevos archivos creados durante el desarrollo de mi función.

5 - Me corrió git commit -m "install feature-x"

6 - Como resultado ahora tengo rama develop con los archivos correctos y el registro se limpia - mostrando sólo un commit para todos los cambios que hice durante el desarrollo de feature-x.

Todavía tengo que averiguar por qué mi git merge --squash feature-branch original no funcionó según lo previsto.

Solución 2

respuesta de Mark Longair es una solución definitiva a mi problema. Lo acabo de probar y funciona. Véase a continuación el proceso que estoy usando ahora para aplastar todas las confirmaciones internas dentro de un feature-branch e incluyen sólo una comprometo a la rama develop:

git checkout develop 
git merge --squash feature-branch 
git commit -m "install of feature-branch" 

La secuencia anterior funciona como un encanto.

+2

Use 'git reflog'. –

Respuesta

17

Si ejecuta git merge --squash <other-branch>, el árbol de trabajo y el índice se actualizan con el resultado de la combinación, pero no crea la confirmación.Todo lo que necesita hacer es ejecutar:

git commit 

Sin embargo, si cambia de opinión antes de comprometerse y simplemente desea abortar la fusión, se puede ejecutar simplemente:

git reset --merge 

No es necesario para usar el reflog

+0

Uau, gracias. Estoy trabajando en una nueva rama de características y voy a probar su sugerencia para ver si funciona. Actualizaré esta pregunta con los resultados. Gracias. – jdias

+0

Acabo de probar y funciona. Gracias, Mark. Acabo de actualizar mi pregunta con tu respuesta. – jdias

+0

+1 Otro thinko resuelto. ¡Gracias! (en una nota ligeramente frustrada: esto se debe a que en git todos los subcomandos se comportan de forma poco uniforme - fusionar, esconder aplicar, pagar con cambios locales, todos se comportan de manera diferente. Sin mencionar la plétora de 'git checkout HEAD --' vs.' git checkout HEAD - .', 'git rebase --abort', pero no' git merge --abort', 'git push --all', pero no' git pull --all' y muchas instancias sutiles como esa :)) – sehe

0

Si cambia de opinión antes de comprometerse, tiene las siguientes opciones:

abortar la fusión con moderna sintaxis git:

git merge --abort 

Y con sintaxis anterior:

git reset --merge 

Y realmente old-school:

git reset --hard 

Pero en realidad, vale la pena notar que git merge --abort es solo equivalente a git reset --merge dado que MERGE_HEAD está presente. Esto se puede leer en la ayuda de git para el comando de fusión.

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present. 

Después de una fusión fracasado, cuando no hay MERGE_HEAD, la fusión no se puede deshacer con git reset --merge pero no necesariamente con git merge --abort, lo que no son única sintaxis viejo y nuevo para la misma cosa. Personalmente encuentro git reset --merge mucho más útil en el trabajo diario.