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 ;)