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
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!
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.