¡Git, quiero deshacer todo! Comandos de corrección de errores

imagen



Git es un sistema práctico pero complejo. La dificultad, en primer lugar, es que, por descuido, puede cometer un error, que luego es difícil o incluso imposible de corregir. La documentación de Git proporciona descripciones de muchos comandos para ayudarlo a corregir un error.



Pero la cosa es que, para solucionar el problema, necesita saber el nombre exacto del comando. Y aquí tenemos el típico problema del huevo y la gallina. Este artículo describe los comandos que le ayudarán a resolver situaciones problemáticas.



Maldita sea, hice algo mal. ¡Dame una máquina del tiempo mágica!



git reflog
# you will see a list of every thing you've
# done in git, across all branches!
# each one has an index HEAD@{index}
# find the one before you broke everything
git reset HEAD@{index}
# magic time machine
      
      





imagen



Este comando le permite recuperar datos borrados accidentalmente al revertir la combinación que causó el problema. refLog se usa con mucha frecuencia; digamos gracias por sugerir agregar este comando.



Hice un compromiso, pero inmediatamente noté un error, ¡debe ser arreglado!



# make your change
git add . # or add individual files
git commit --amend --no-edit
# now your last commit contains that change!
# WARNING: never amend public commits
      
      





El comando permite corregir pequeñas cosas desagradables, cuando cometió algo y luego vio un problema como un espacio faltante después del signo "=". Sí, es posible realizar cambios con una nueva confirmación combinando los dos con rebase -i. Pero queda un largo camino por recorrer.



¡NÓTESE BIEN! Nunca cambie las confirmaciones en una rama pública. Use el comando solo para confirmaciones en la rama local, de lo contrario tendrá problemas.



¡Quiero cambiar el mensaje de la última confirmación!



git commit --amend
# follow prompts to change the commit message
      
      





Es solo ... requisitos de publicación estúpidos.



Me comprometí accidentalmente con master, ¡aunque debería haber estado en una nueva rama!



# create a new branch from the current state of master
git branch some-new-branch-name
# remove the last commit from the master branch
git reset HEAD~ --hard
git checkout some-new-branch-name
# your commit lives in this branch now :)
      
      





Si ya se comprometió con un hilo público, los comandos no funcionarán. En este caso, git reset HEAD @ {especificar el número de confirmaciones a las que volver} en lugar de HEAD ~ ayudará.



Bueno, me comprometí por error con la rama incorrecta



# undo the last commit, but leave the changes available
git reset HEAD~ --soft
git stash
# move to the correct branch
git checkout name-of-the-correct-branch
git stash pop
git add . # or add individual files
git commit -m "your message here";
# now your changes are on the correct branch
      
      





Hay otra forma en que muchos desarrolladores están usando cherry-pick.



git checkout name-of-the-correct-branch
# grab the last commit to master
git cherry-pick master
# delete it from master
git checkout master
git reset HEAD~ --hard
      
      





Necesito ejecutar diff, pero nada funciona.



Si está seguro de que se han realizado los cambios, pero el diff está vacío, es posible que haya indexado los cambios mediante add. Por lo tanto, vale la pena usar una bandera especial.



git diff --staged



En general, esto no es un error, sino una característica, pero es muy obvio ¯ \ _ (ツ) _ / ¯



Necesito deshacer urgentemente una confirmación que se realizó hace 5 confirmaciones



# find the commit you need to undo
git log
# use the arrow keys to scroll up and down in history
# once you've found your commit, save the hash
git revert [saved hash]
# git will create a new commit that undoes that commit
# follow prompts to edit the commit message
# or just save and commit
      
      





Afortunadamente, no tiene que retroceder 5 confirmaciones copiando y pegando archivos nuevos y antiguos. Puedes deshacer todo esto con revertir.



Además, puede deshacer no solo la confirmación, sino todo el archivo. Es cierto, estos ya serán otros comandos ...



Deshacer cambios en el archivo



Y aquí están, estos otros comandos.



# find a hash for a commit before the file was changed
git log
# use the arrow keys to scroll up and down in history
# once you've found your commit, save the hash
git checkout [saved hash] -- path/to/file
# the old version of the file will be in your index
git commit -m "Wow, you don't have to copy-paste to undo"
      
      





Cuando encontré esta oportunidad por primera vez, fue COOL, COOL, K-R-U-T-O. Pero si lo piensa bien, ¿por qué pagar es la mejor opción para descartar cambios en un archivo? : sacude-puño-en-linus-torvalds: todo, me rindo







cd ..
sudo rm -r fucking-git-repo-dir
git clone https://some.github.url/fucking-git-repo-dir.git
cd fucking-git-repo-dir
      
      





Gracias a Eric V. Por este método. Y dirigirle todas las quejas sobre el uso de sudo.



Si necesita poner a cero los cambios y volver por completo a la versión original, puede intentar hacerlo. Pero recuerde: estos comandos son destructivos e irreversibles.



# get the lastest state of origin
git fetch origin
git checkout master
git reset --hard origin/master
# delete untracked files and directories
git clean -d --force
# repeat checkout/reset/clean for each borked branch
      
      





¡Atención! Este artículo no pretende ser una guía completa. Y sí, hay otras formas de hacer lo mismo, e incluso mejor. Pero se me ocurrieron estas opciones por prueba y error. Entonces tuve una idea loca para compartir mis hallazgos. ¡Tómalo o vete!



imagen



Comentario del experto



Daniil Pilipenko , director del centro de reclutamiento de TI para SymbioWay y evangelista de la dirección de back-end de la universidad en línea Skillbox, agregó su opinión sobre Git y su relevancia para los desarrolladores.



Git apareció en 2005 y tardó mucho en hacerse con el control del mercado. Recuerdo cuando estábamos implementando SVN en el equipo de desarrollo en 2008. E incluso en 2012, una empresa cercana a mí estaba implementando Mercurial en gran medida. A lo largo de los años, para muchos se ha hecho evidente que Git es el mejor sistema de control de versiones y ahora lo utilizan casi todos los desarrolladores.



Si eres un desarrollador principiante que busca conseguir un trabajo, ¡asegúrate de aprender Git! Debe saber qué es un sistema de control de versiones y por qué es necesario, qué es una confirmación, una rama, cómo clonar un repositorio y enviar los cambios realizados al servidor, cómo obtener nuevos cambios del servidor, cómo fusionar, qué tipos de "reinicio" existen. Al principio, este tema puede parecerle incomprensible y difícil, pero solo necesita acostumbrarse a usar Git y no podrá dejarlo.



All Articles