Git: ¿como fusionar inversamente un commit?


124

Con SVN es fácil fusionar inversamente un commit, pero ¿cómo hacer eso con Git?



No creo que esto sea lo que significa la pregunta. Una fusión inversa en SVN también revierte los cambios de la confirmación a cambios locales, por lo que puede editarlos y confirmar nuevamente.
Lirón

Respuestas:


105

Para crear una nueva confirmación que 'deshaga' los cambios de una confirmación anterior, use:

$ git revert <commit>

También es posible eliminar una confirmación de un punto arbitrario en el pasado al cambiar el nombre y luego restablecer, pero realmente no desea hacerlo si ya ha enviado sus confirmaciones a otro repositorio (o alguien más se ha retirado de usted) .


31
Probablemente deba proporcionar una -m <parent number>opción git revertpara especificar qué cambio revertir. Si desea deshacer una combinación de historial no publicado, use git reset --hard HEAD^1.
Jakub Narębski el

3
Jakub: eso es cierto si revierte una confirmación de fusión, pero en la terminología de Subversion, "fusión inversa" es en realidad simplemente el nombre para revertir cualquier tipo de confirmación.
Ben James

44
¡Tenga en cuenta que usar -msignifica que una fusión futura de la rama no fusionada no incluirá los cambios anteriores a esa fusión! Consulte schacon.github.com/git/howto/revert-a-faulty-merge.txt para conocer las formas adecuadas de volver a fusionar una rama no fusionada.
Martijn Pieters

125

Para revertir una combinación de cometer, es necesario utilizar: git revert -m <parent number>. Entonces, por ejemplo, para revertir la confirmación de fusión más reciente usando el padre con el número 1, usaría:

git revert -m 1 HEAD

Para revertir una confirmación de fusión antes de la última confirmación, debería hacer lo siguiente:

git revert -m 1 HEAD^

Use git show <merge commit SHA1>para ver a los padres, la numeración es el orden en que aparecen, por ejemploMerge: e4c54b3 4725ad2

documentación de combinación de git: http://schacon.github.com/git/git-merge.html

Discusión de fusión de git (confusa pero muy detallada): http://schacon.github.com/git/howto/revert-a-faulty-merge.txt


36
¿Cómo puede obtener el 'número' asociado con el padre? ¿Las ramas tienen una 'identificación' numérica intrínseca?
daniyalzade

77
Se usa git show <merge commit SHA1>para ver a los padres, la numeración es el orden en que aparecen, por ejemploMerge: e4c54b3 4725ad2
supermétodo

8
ejemplo: git revert -m 1 SHA1Ese comando funcionó para mí para revertir un commit de fusión que era varios commits de fusión antes del encabezado y tenía muchos commits debajo.
c.apolzon

3
¿Cuáles son los padres? E4c54b3 o 4725ad2?
Dolphin

1
Esto todavía no proporciona suficiente información sobre cómo los resultados de git show se relacionan con los números principales. ¿El "orden en que aparecen" se basa en 1? Basado en 0? En este ejemplo específicamente, ¿cuál es el SHA1 del padre 1? e4c54b3 o 4725ad2?
cowlinator

4

Si te entiendo correctamente, estás hablando de hacer un

svn merge -rn:n-1

para retirarse de una confirmación anterior, en cuyo caso, probablemente esté buscando

git revert

0
git reset --hard HEAD^ 

Use el comando anterior para revertir los cambios de fusión.


3
Esto descarta el commit de fusión, que no hace lo que el póster original está pidiendo. El OP está intentando hacer un parche inverso para deshacer los cambios anteriores, no borrar el historial de los cambios anteriores por completo.

-1

Si no desea comprometerse, o desea hacerlo más tarde (el mensaje de confirmación aún estará preparado para usted, que también puede editar):

git revert -n <commit>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.