tipos tag remove practices etiquetas crear best git revert

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 que 1,2,3... corresponde a una lista de asignaciones a las confirmaciones inmediatamente anteriores a dd8cbe3e4 , ordenadas por orden cronológico ascendente (las más antiguas primero, que es usualmente lo que quieres revertir).

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.

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.