git - tag - Revertir los cambios realizados por la fusión
git tag best practices (4)
git revert --mainline
Generalmente:
git revert --mainline 1 dd8cbe3e4
Dónde:
-
dd8cbe3e4
es la confirmación de fusión incorrecta que desea deshacer, y -
--mainline
le dice cuál de las múltiples confirmaciones anteriores es la que se debe restaurar (recuerde, una confirmación de combinación tiene múltiples confirmaciones principales y solo puede conservar una de ellas).- No puedo encontrar una buena explicación de lo que significa el
1
, pero supongo que1,2,3...
corresponde a una lista de asignaciones a las confirmaciones inmediatamente anteriores add8cbe3e4
, ordenadas por orden cronológico ascendente (las más antiguas primero, que es usualmente lo que quieres revertir).
- No puedo encontrar una buena explicación de lo que significa el
Fuente:
http://thezencoder.com/2013/09/05/how-to-correctly-revert-a-bad-merge-in-git/
El desarrollador estaba comprometiendo pequeños cambios a dos archivos. Pero durante este compromiso, tuvo un conflicto de fusión que eliminó muchas cosas (probablemente no tenía la última versión actualizada). Luego fue empujado al repositorio compartido y algunos otros desarrolladores hicieron algunos otros compromisos.
Ahora, nos dimos cuenta de que la combinación eliminó los archivos importantes y queremos revertirlos.
¿Cómo puedo hacer esto sin perder los cambios de los próximos compromisos?
Estaba tratando de git revert commitsha
, pero no me devolvió los cambios. ¿Necesito revertir la mergesha
? ¿Cómo puedo determinarlo?
En resumen, ADVERTENCIA : no hay una forma segura real de deshacer una fusión, excepto para restablecer realmente la rama a la confirmación antes de la fusión.
Permítanme explicar y buscar una referencia existente por ahora.
- Git revertir de fusión cometer causa problemas cuando la fusión se realiza realmente.
- Git fusionar, luego revertir, luego revertir la reversión
Cómo citar la respuesta enlazada de Cómo revertir una confirmación de fusión de git defectuosa
Básicamente, revertir una combinación deshará los cambios en los datos, pero no los cambios en el historial (gráfico) . Por lo tanto, se espera que revertir su fusión defectuosa no haga nada.
Ciertamente, restablecer la rama sería el enfoque más simple, pero tiene inconvenientes si el resultado de la fusión ya se ha enviado a un repositorio compartido (porque está reescribiendo el historial publicado).
Aquí está el desglose
-
git merge <someref>
para fusionar (opcionalmente confirmar después de resolver conflictos) Si descubre de inmediato que desea restablecer la rama antes de la fusión:
git reset HEAD@{1} # optionally pass --hard to reset the working tree too
si te enteraras solo mas tarde,
Utilice el reflog para encontrar el punto antes de la fusión. (
HEAD@{1}
es la abreviatura del valor anterior de la referencia de cabecera actual, pero el proceso de búsqueda rastrea un historial limitado de valores para la referencia de cabecera)git reflog
restablecer la rama
git reset HEAD@{n} # substitute reflog entry index
opcionalmente rebase / cherry-pick las confirmaciones hechas después de la fusión
git cherry-pick HEAD@{1} # just an example. interactive tools will make this easier
En resumen, puede hacer un git reset --soft <commit>
donde commit puede ser HEAD^
(anterior), HEAD~2
(current-2), un SHA, etc.
Con --soft todos los cambios estarán listos para comprometerse, por lo que realmente puede cambiar el compromiso. Con - hard los cambios se perderán todos.
Después de modificar el compromiso, debe forzar los cambios en el repositorio compartido con git push --force
.
Tenga en cuenta que deberá decirles a los otros desarrolladores que deben volver a colocar sus repositorios en el repositorio compartido. (use git pull --rebase
). Sin embargo, podrían obtener algunos conflictos de fusión ... Por favor, tenlo en cuenta.
Otro enfoque (más seguro) es crear una diferencia entre el último producto y la versión actual del archivo y luego restaurar las partes perdidas al copiar y pegar.
Esto siempre funciona, no necesita ninguna opción de línea de comando impar, y no manipula las cosas que debería dejar solo :-)
Eclipse, por ejemplo, tiene buenas herramientas para seleccionar cada diferencia individual y copiarla en cualquiera de las dos versiones. Simplemente use el menú "Comparar" para abrir ambas versiones una al lado de la otra.