El Kit del Pato
Cada uno con qué hace y cuándo usarlo. Se lee en tres minutos y se guarda para el día malo.
La hoja sale de esta misma página: imprímela o guárdala en PDF.
Rescate
git reflogGit apunta cada movimiento de HEAD en un cuaderno aparte. Ahí está el commit que creías muerto.
Cuándo: Borraste una rama sin fusionar, o un reset se llevó algo.
Lo conté en la pieza 007
git switch -c rescate <hash>Saca una rama nueva a partir del commit que encontraste en el reflog.
Cuándo: Ya tienes el hash y quieres recuperarlo sin tocar nada más.
Lo conté en la pieza 007
git reset --soft HEAD~1Deshace el último commit y te deja los cambios puestos, listos para rehacerlo.
Cuándo: El commit es tuyo y nadie lo ha descargado.
Lo conté en la pieza 008
git revert <hash>No borra nada; escribe un commit nuevo que hace lo contrario.
Cuándo: Ya lo descargó alguien. Lo que otro tiene no se reescribe.
Lo conté en la pieza 008
git reset --hard <hash>Rebobina la rama hasta ese commit y tira todo lo que venía después.
Cuándo: Solo con el reflog abierto al lado. Es rebobinar la cinta, no la papelera.
Todavía sin contar
git restore <archivo>Devuelve el archivo a como estaba en el último commit.
Cuándo: Lo tocaste por error y no lo has commiteado. Ojo, de esto no hay reflog.
Todavía sin contar
git checkout <hash> -- archivoTrae un solo archivo tal como estaba en ese commit, sin mover la rama.
Cuándo: Se rompió un archivo y el resto del trabajo va bien.
Todavía sin contar
git merge --abortDeshace el merge a medias y te deja como estabas antes del conflicto.
Cuándo: Llevas veinte minutos peleando y ya no sabes qué estás mirando. También en rebase.
Todavía sin contar
git clean -ndLista los archivos sin seguir que borraría, y no borra ninguno.
Cuándo: Siempre antes del -fd. Esa n es la diferencia entre limpiar y llorar.
Todavía sin contar
git stashEsconde lo que llevas a medias y te deja el árbol limpio.
Cuándo: Interrupción de cinco minutos. Acuérdate de sacarlo.
Lo conté en la pieza 002
git bisect startBúsqueda binaria sobre la historia. 400 commits se resuelven en 9 pruebas.
Cuándo: Algo se rompió y no sabes cuándo.
Lo conté en la pieza 011
Día a día
git mergeUne ramas creando un commit de unión. Conserva la historia tal cual pasó.
Cuándo: En main. Es la que no te va a traer problemas con nadie.
Lo conté en la pieza 001
git rebase mainReaplica tus commits encima de otra rama. Línea limpia, hashes nuevos.
Cuándo: En tu rama y solo en la tuya, antes de abrir el PR.
Lo conté en la pieza 001
git cherry-pick <hash>Trae un commit suelto de otra rama, sin arrastrar los diez de al lado.
Cuándo: Necesitas ese cambio y solo ese. Nada de copiar y pegar.
Todavía sin contar
git switch -Vuelve a la rama en la que estabas. Es el cd - de Git.
Cuándo: Llevas todo el día yendo y viniendo entre dos ramas.
Todavía sin contar
git diff --stagedEnseña exactamente lo que va a entrar en el commit, ni una línea más.
Cuándo: Justo antes de commitear. Es el último control antes de la puerta.
Todavía sin contar
git add -pTe enseña el diff por trozos y te obliga a decir sí o no a cada uno.
Cuándo: El agente escribió 300 líneas y no las has leído.
Lo conté en la pieza 010
git push --force-with-leaseFuerza el empujón solo si nadie ha subido nada desde tu última descarga.
Cuándo: Cada vez que subes una rama reescrita. Nunca --force a secas.
Todavía sin contar
git log --oneline --graph --allDibuja la forma real de la historia en la terminal, ramas incluidas.
Cuándo: Antes de rebasar, para ver de dónde sale de verdad cada rama.
Todavía sin contar
git blame -L 40,60 archivoDice qué commit escribió cada línea de ese trozo.
Cuándo: No para buscar culpable. Para encontrar el commit que explica el porqué.
Todavía sin contar
git log -S "nombreDeLaFuncion"Busca los commits donde ese texto apareció o desapareció.
Cuándo: La función existía, ya no está, y nadie se acuerda de habérsela llevado.
Todavía sin contar
git tag -a v1.0 -m "primera"Le pone un nombre fijo a un commit, y el nombre viaja con el repo.
Cuándo: Antes de desplegar. Un hash no se recuerda, v1.0 sí.
Todavía sin contar
git worktree add ../bug mainUna carpeta aparte con otra rama, sin tocar la que tienes abierta.
Cuándo: El bug urgente va para rato y no quieres acordarte de ningún stash.
Lo conté en la pieza 002
Alias del .gitconfig
undo = reset --soft HEAD~1Alias de .gitconfig. Deshace el commit y te deja los cambios.
Cuándo: Lo vas a usar más de lo que crees.
Lo conté en la pieza 012
amend = commit --amend --no-editArregla el último commit sin abrir el editor ni reescribir el mensaje.
Cuándo: Se te olvidó un archivo. Otra vez.
Lo conté en la pieza 012
wip = !git add -A && git commit -m wipGuarda todo en un commit desechable de un tirón.
Cuándo: Empieza la reunión en treinta segundos.
Lo conté en la pieza 012
st = status -sbEl estado en dos líneas en vez de en veinte.
Cuándo: Mil veces al día. Es el que más vas a usar.
Todavía sin contar
unstage = restore --stagedSaca el archivo de la zona de preparación sin tocar lo que escribiste.
Cuándo: Añadiste de más con un git add . y quieres deshacer solo eso.
Todavía sin contar
please = push --force-with-leaseForzar sin pisar a nadie, y encima con buenos modales.
Cuándo: Después de cada rebase. Si hay que pedirlo por favor, que sea el seguro.
Todavía sin contar
Terminal
:wqGuarda y sale de vim. Con eso ya no te quedas encerrado.
Cuándo: Son las 3 de la mañana y entraste por SSH.
Lo conté en la pieza 005
Ctrl + RBusca hacia atrás en el historial mientras escribes trozos del comando.
Cuándo: Ese comando larguísimo que escribiste hace tres días y no piensas reconstruir.
Todavía sin contar
sudo !!Repite el comando anterior, ahora con permisos.
Cuándo: Permission denied. No lo vuelvas a escribir entero.
Todavía sin contar
cd -Vuelve a la carpeta anterior. La misma idea que git switch -.
Cuándo: Saltas entre dos carpetas que están lejísimos la una de la otra.
Todavía sin contar
lsof -i :3000Dice qué proceso tiene ocupado el puerto, con su PID.
Cuándo: address already in use, y no sabes a quién estás a punto de matar.
Todavía sin contar
chown $USER archivoCambia el dueño del archivo, que es lo que fallaba de verdad.
Cuándo: Ibas a poner 777. El 777 no arregla el permiso, quita al portero.
Lo conté en la pieza 009
Oficio
.editorconfigUn archivo en la raíz y nadie vuelve a discutir tabs contra espacios.
Cuándo: Hoy. En todos tus repos.
Lo conté en la pieza 003
git config --global core.excludesFile ~/.gitignoreUn ignore tuyo para todos los repos, sin ensuciar el de nadie.
Cuándo: La primera vez que un compañero te pide que quites el .DS_Store.
Todavía sin contar
git config --global pull.rebase truegit pull deja de inventarse commits de merge cada vez que te actualizas.
Cuándo: Hoy, y en todas tus máquinas. Tu historia te lo va a agradecer.
Todavía sin contar
npm ciInstala exactamente lo que dice el lock, y borra node_modules antes.
Cuándo: En CI, y el día del en mi máquina sí funciona.
Lo conté en la pieza 004
.git-blame-ignore-revsLa lista de commits que blame debe saltarse, como el del formateo masivo.
Cuándo: El día que formateas el proyecto entero y no quieres firmar cada línea.
Todavía sin contar
Los comandos que te sacan del apuro, en una hoja. Gratis.
Cada uno con qué hace y cuándo usarlo. Se lee en tres minutos y se guarda para el día malo.
Un correo con el kit. Nada más. Te borras cuando quieras.
El Kit del Pato · duvanh.dev