Gastón Ramos

Blog personal

Deshacer cambios en Git

Escrito en dos mañanas del 29 y 30 de Septiembre de 2024

La idea

La idea de este post es hacer un repaso de las 3 formas básicas para deshacer cambios en git, diría que son cosas muy necesarias en el día a día, así que ahí vamos!

1. Como cambiar el último commit: ( git commit --amend )

Si acabamos de hacer un commit y nos damos cuenta de que por ejemplo nos olvidamos de agregar un archivo, o que queremos mejorar/cambiar el mensaje de commit, podemos "cambiar" el último commit con "git commit --amend" Entonces supongamos que hicimos, esto:

        > git add my_file_A.rb
        > git commit -m "Adding some new files"
        [master (root-commit) c798093] Add my files
         1 file changed, 0 insertions(+), 0 deletions(-)
         create mode 100644 my_file_A.rb
      

Ahora nos damos cuenta de que nos olvidamos de agregar un archivo my_file_B.rb en nuestro último commit, y queremos agregarlo, entonces podemos hacer esto:

      > git add my_file_B.rb
      > git commit --amend
    

Y entonces vamos a ver que se abre nuestro editor configurado por defecto, y el mensaje de commit es el último, el cuál podemos modificar y además ahora también está nuestro archivo olvidado "my_file_B"

      Adding some new files

      # Please enter the commit message for your changes. Lines starting
      # with '#' will be ignored, and an empty message aborts the commit.
      #
      # Date:      Fri Sep 27 12:19:31 2024 -0300
      #
      # On branch master
      #
      # Initial commit
      #
      # Changes to be committed:
      #   new file:   my_file_A.rb
      #   new file:   my_file_B.rb
    

Guardamos y salimos, y listo. Debemos tener en cuenta, que esto nos cambia el commit, y por consiguiente va a cambiar el commit hash. En síntesis, este comando nos permite cambiar el commit más reciente reemplazándolo por completo.

2. Sacar un archivo de la zona de Stage: ( git restore --staged <file> )

Lo siguiente es para el caso en el que hayamos agregado un archivo modificado para ser enviado en el siguiente commit, es decir un archivo confirmado. Vamos a suponer que hicimos esto:

Modificamos los archivos:

      > echo "hi" >> my_file_A.rb
      > echo "hi-B" >> my_file_B.rb
      > git status
      On branch master
      Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git restore <file>..." to discard changes in working directory)
  	modified:   my_file_A.rb
	modified:   my_file_B.rb

      no changes added to commit (use "git add" and/or "git commit -a")
    

Entonces ahora agregamos los dos archivos para luego commitearlos

      > git add my_file_A.rb my_file_B.rb
      > git status
      On branch master
      Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
	modified:   my_file_A.rb
	modified:   my_file_B.rb
    

Pero en este puntos nos damos cuenta que queremos hacer 2 commits, uno por cada archivo, entonces lo primero que necesitamos hacer es sacar my_file_B.rb, y lo hacemos de la siguiente manera:

      > git restore --staged my_file_B.rb

      > git status 
      On branch master
      Changes to be committed:
        (use "git restore --staged ..." to unstage)
	modified:   my_file_A.rb

      Changes not staged for commit:
        (use "git add ..." to update what will be committed)
        (use "git restore ..." to discard changes in working directory)
	modified:   my_file_B.rb

    

Ahora podemos comitear my_file_A.rb,que está confirmado, y luego agregar (con git add) y comitear my_file_B.rb

3. Revertir los cambios en un archivo: ( git restore <file> )

Si nos vemos en el caso de que cambiamos un archivos, pero no queremos mantener esos cambios, git nos permite revertirlos y volver el archivo a la versión del último commit de nuestro working directory, hay que tener cuidado por que cualquier cambio que hayamos hecho en el archivo se va a perder. Por ejemplo ahora vamos a modificar el archivo file_A.rb para luego hacer un restore

      > echo "hi, me again" >> my_file_A.rb
      > git status
      On branch master
      Changes not staged for commit:
        (use "git add <file>..." to update what will be committed)
        (use "git restore <file>..." to discard changes in working directory)
	modified:   my_file_A.rb

no changes added to commit (use "git add" and/or "git commit -a")

      > git restore file_A.rb
      > git status
      On branch master
      nothing to commit, working tree clean
    

Bueno esto fué todo, escribí este artículo más para mí, por que siempre es bueno volver a repasar las cosas fundamentales, espero que te sea útil. Gracias por leerme. Gramos ;)