2012-05-02 21 views
41

Esto no es un problema importante, solo algo que quiero saber si es posible o no.Cómo revertir varias confirmaciones como parte de una única confirmación

Digamos que tenemos dos confirmaciones, abcd123 y wxyz789, que se producen en lugares separados, no muy alejados, muy atrás en el historial de un repositorio. Ahora digamos que queremos revertirlos. Haciendo

git revert abcd123 wxyz789 

resultaría en dos confirmaciones separadas, una reversión abcd123 y el otro revertir wxyz789.

Esto está bien y bien, pero ¿y si los errores que queremos corregir en las dos confirmaciones están lógicamente vinculados, y para los fines de auto-documentación nos gustaría hacer una única confirmación que contenga un solo "Rompí algo así que ahora estoy revertiendo los archivos x, y yz "¿comentario? ¿Hay un comando git que hace esto?

(. Por supuesto, soy consciente de que es posible crear una confirmación donde acabo de corregir manualmente todos los cambios y luego empuje Esto es doloroso por todas las razones obbious.)

+0

posible duplicado de [Revertir múltiples confirmaciones de git] (http://stackoverflow.com/questions/1463340/revert-multiple-git-commits) –

+0

Vi ese hilo. La diferencia entre este y este es que Bill espera hacer una copia de seguridad de múltiples archivos desde HEAD. Mis commits ocurren en "lugares separados no adyacentes muy atrás en la historia de un repositorio". – JimmidyJoo

+1

Y, sin embargo, volver a leer la respuesta elegida me da lo que quiero. El indicador --no-commit es lo que necesito. Entonces ... ¿Cómo nomino mi pregunta para que se elimine de la existencia? – JimmidyJoo

Respuesta

52

que puede hacer:

git revert abcd123 
git revert --no-commit wxyz789 
git commit --amend 

... y luego escriba un mensaje de confirmación apropiado que describa el efecto combinado de revertir ambas confirmaciones.

+0

¿Funcionará esto con más de 2 commits? –

+0

@ AntonI.Sipos sí, todos los que quieras. – Trufa

+17

Más conciso: 'git revert abcd123 wxyz789 --no-commit' ' git commit' – rmp251

29

En caso de reversiones complicadas, que se cambian entre sí, el revert --no-commit puede ser problemático.

Mi solución simple era hacer reversión real, y la calabaza:

git revert <all commits> 
git rebase -i 

y marcar todos los revierte como squash, excepto el primero, para crear una única confirmación.

+0

¡Me gusta mucho esta solución! – monokrome

+1

+1. Para los estudiantes de git: 1. leer un poco sobre lo que se compromete, 2. llegar a ser competente con rebase interactivo: aplastamiento, eliminación, edición, rebase, reordenamiento de las confirmaciones. Una vez que hagas que tu mente se familiarice con ella (pista: solo es un viaje en el tiempo), esta solución se vuelve mucho más natural que cambiar con cosas como '--no-commit'. (Y no tema la regla de "no volver a publicar", siempre que lo haga en su sucursal local o privada, puede hacer * cualquier cosa *) –

+1

** Consejos adicionales: ** Primero puede cambiarse de 'pick' a' reword' (para ingresar un nuevo mensaje de confirmación) o 'edit' (para organizar los cambios sin comprometer). Para otras reversiones, puede usar 'fixup' en lugar de' squash' si no le importan los mensajes de confirmación. – ADTC

18
git revert -n <commits> 
git commit 

El primer comando hará todos los reveses sin crear ningún compromiso y organizará el resultado final (la opción -n). Después de eso, el comando de confirmación crea una única confirmación.

+1

Perfecto. Sucinto. Y le permite agregar su mensaje de confirmación después de todas las reversiones en lugar de volver a enmendar una confirmación que sugieren otras respuestas. –

+0

Excepto que no funciona. Necesito revertir los últimos 5 commits, de los cuales 3 son estas fantásticas fusiones de Git que ocurren cada vez que haces cambios en alguien más. Entonces, este error con 'commit <###> es una fusión, pero no se da la opción -m'. Cada combinación tiene dos padres, al parecer tengo que determinar qué padre de cada una de estas fusiones necesito mantener. Cómo demonios incluso lo trabajo, y mucho menos cómo especifico que para el comando de revertir no tengo ni idea. – Neutrino

Cuestiones relacionadas