Git: volver a una confirmaci贸n anterior

    Si he aprendido algo en mis m谩s de 15 a帽os de programaci贸n, es que los errores son comunes y cometo muchos de ellos. Esto tambi茅n se aplica a las herramientas de control de versiones. Ya sea que realice cambios accidentalmente o simplemente se d茅 cuenta de que su c贸digo comprometido anterior no es lo que deseaba, a menudo tendr谩 que revertir una confirmaci贸n anterior en Git.

    En este art铆culo, mostrar茅 algunas formas de revertir sus confirmaciones, seg煤n su caso de uso. Este es un tema complicado (que es cierto para muchos temas de Git en general), as铆 que aseg煤rese de seguir las instrucciones que mejor se adapten a sus necesidades.

    Eliminar confirmaciones no publicadas

    Si a煤n no ha publicado sus confirmaciones en un repositorio remoto, como GitHub, entonces b谩sicamente puede eliminar las confirmaciones anteriores utilizando el reset mando.

    Si bien esta es una soluci贸n efectiva, es peligrosa ya que est谩 reescribiendo el historial y dejando las confirmaciones “eliminadas” sin referencia o “hu茅rfanas”. La 煤nica forma de encontrar y recuperar estas confirmaciones sin referencia es con git reflog.

    los reset El comando tiene tres opciones diferentes, dos de las cuales describiremos aqu铆:

    $ git reset --hard <hash-or-ref>
    

    Utilizando la --hard opci贸n, todo se revierte a la confirmaci贸n especificada. Esto incluye los punteros de referencia del historial de confirmaci贸n, el 铆ndice de preparaci贸n y su directorio de trabajo.

    Esto significa que al usar solo este comando, no solo volver谩 a una confirmaci贸n anterior, sino que perder谩 todos los cambios operativos en el proceso. Para evitar perder cualquier cambio de trabajo, puede utilizar el stash y stash pop comandos:

    $ git stash
    $ git reset --hard <hash-or-ref>
    $ git stash pop
    

    los stash comando guarda sus cambios de trabajo (sin ning煤n compromiso o cambio en el 谩rbol), y luego stash pop los trae de vuelta.

    La otra opci贸n que puede considerar es la --soft opci贸n. Esta opci贸n funciona de la misma manera que git reset --hard <hash-or-ref>, pero solo afecta al historial de confirmaciones, no a su directorio de trabajo o 铆ndice de ensayo.

    $ git reset --soft <hash-or-ref>
    

    Entonces, si tiene cambios no confirmados que desea conservar, es probable que esta sea la opci贸n que desee.

    Eliminar confirmaciones publicadas

    Entonces, digamos que comprometi贸 su c贸digo y luego lo envi贸 al repositorio remoto. En este punto, es muy recomendable que no haga usa algo como git reset ya que estar铆as reescribiendo la historia.

    En cambio, el enfoque recomendado ser铆a utilizar el revert mando. Este comando funciona deshaciendo los cambios que se realizaron en la confirmaci贸n especificada creando una nueva confirmaci贸n y no eliminando ninguna confirmaci贸n anterior. Esto es ideal para cambios publicados porque entonces se conserva el verdadero historial del repositorio. Aqu铆 est谩 el comando:

    $ git revert <hash-or-ref>
    

    Entonces, digamos que tiene un archivo de texto en su repositorio con el siguiente contenido:

    This is my sample text
    

    Y luego lo cambia a:

    This is my awesome sample text
    

    Su historial de confirmaciones podr铆a verse as铆:

    $ git log --pretty=oneline
    676ec97a9cb2cebbb5c77904bbc61ced05b86f52 Added 'awesome' to text
    735c5b43bf4b5b7107a9cc3f6614a3890e2889f6 Initial commit
    

    Si decidimos que ya no queremos “impresionante” en nuestro texto, pero no queremos eliminar el 676ec cometer, podemos usar revert para deshacer ese cambio:

    $ git revert 676ec
    [master f68e546] Revert "Added 'awesome' to text"
     1 file changed, 1 insertion(+), 1 deletion(-)
    

    Despu茅s de que se nos solicite que ingrese un mensaje de confirmaci贸n, ahora podemos ver en nuestro historial de confirmaci贸n que en realidad hay una nueva confirmaci贸n:

    $ git log --pretty=oneline
    f68e546ac2ae240f22b2676b5aec499aab27f1ca Revert "Added 'awesome' to text"
    676ec97a9cb2cebbb5c77904bbc61ced05b86f52 Added 'awesome' to text
    735c5b43bf4b5b7107a9cc3f6614a3890e2889f6 Initial commit
    

    Como resultado de esto, la primera y la tercera confirmaci贸n representan exactamente el mismo estado del proyecto. La confirmaci贸n se ha revertido y no se perdi贸 ning煤n historial.

    Tenga en cuenta que hay bastantes otras formas de usar este comando, como si desea revertir 2 confirmaciones, puede usar:

    $ git revert HEAD~2
    

    O si desea revertir muchas confirmaciones no continuas, especif铆quelas individualmente:

    $ git revert 676ec 735c5
    

    Consultar temporalmente un compromiso anterior

    Al “revertir una confirmaci贸n”, puede querer decir que desea volver temporalmente a un estado anterior en su repositorio, pero sin realizar ning煤n cambio real en el 谩rbol. En este caso, probablemente solo desee verificar el compromiso, lo que le permitir谩 volver al maestro o cualquier otro estado cuando haya terminado:

    $ git checkout <hash-or-ref>
    

    Esto cambiar谩 su directorio de trabajo al contenido de esa confirmaci贸n, as铆 como a la ubicaci贸n a la que apunta HEAD, ninguna de las cuales es irreversible. Cualquier cambio que realice aqu铆 puede confirmarse en una rama o guardarse para su uso posterior.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *