Jhonatan Pinheiro
Cargando página...
Jhonatan Pinheiro
Cargando página...
Jhonatan Pinheiro
Cargando página...
Configuración, commits, ramas, merge y rebase, remotos, el capítulo de deshacer (reset, revert, reflog), bisect y blame: 100 comandos con ejemplos.
Git es la herramienta que todo desarrollador usa y que casi nadie domina por completo. La buena noticia: unos 20 comandos cubren el 95% del trabajo — los otros 80 son los que te salvan el día en que algo sale mal.
Estos 100 comandos están en el orden en que aparecen en la vida real: configurar, crear, hacer commit, ramificar, integrar, publicar, deshacer e investigar.
Regla de oro: mientras no hayas hecho
push, casi todo es reversible. Después del push, prefiere los comandos que añaden historia (comorevert) frente a los que la reescriben (comorebasey--force).
Se hace una vez por máquina — y es lo que evita un commit con el autor equivocado.
Es lo que aparece en la autoría de cada commit. Sin eso, Git protesta en el primer commit.
git config --global user.name "Jhonatan Pinheiro"
git config --global user.email "voce@email.com"Lista todo lo que está en vigor y de dónde vino cada valor.
git config --list --show-originSin --global, vale solo en el proyecto actual. Útil para separar el correo personal del corporativo.
git config user.email "voce@empresa.com"Define quién abre el mensaje de commit y el rebase interactivo.
git config --global core.editor "code --wait"Hace que todo repositorio nuevo nazca con main en lugar de master.
git config --global init.defaultBranch mainEvita el clásico diff gigante entre Windows y Linux.
git config --global core.autocrlf true # Windows
git config --global core.autocrlf input # Linux y macOSLos comandos largos que repites cada día merecen un apodo.
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.lg "log --oneline --graph --decorate --all"Te evita escribir el token en cada push.
git config --global credential.helper store # guarda en disco
git config --global credential.helper manager # Windows (gestor del SO)Prueba criptográfica de autoría — el sello Verified en GitHub.
git config --global user.signingkey SEU_ID_GPG
git config --global commit.gpgsign trueHace que git pull proteste en lugar de crear un merge por su cuenta. Evita un historial enredado.
git config --global pull.rebase false
git config --global pull.ff onlyEl punto de partida: convertir una carpeta en repositorio o traer uno existente.
Convierte la carpeta actual en un repositorio Git (crea el directorio .git).
git initDescarga el proyecto con todo el historial y ya configura el remoto origin.
git clone https://github.com/usuario/projeto.gitDefine el nombre del directorio de destino.
git clone https://github.com/usuario/projeto.git minha-pastaTrae solo los commits más recientes. Mucho más rápido en un repositorio grande — ideal en CI.
git clone --depth 1 https://github.com/usuario/projeto.gitDescarga solo la rama que interesa.
git clone --branch desenvolvimento --single-branch https://github.com/usuario/projeto.gitSin escribir contraseña ni token, siempre que tu clave esté registrada.
git clone git@github.com:usuario/projeto.gitLista lo que Git debe ignorar. Pon aquí las dependencias, la build y los secretos.
# .gitignore
node_modules/
.env
.env.local
dist/
*.logAñadirlo al .gitignore no quita lo que ya está versionado.
git rm --cached .env
git commit -m "chore: remove .env do versionamento"Ver qué cambió, elegir qué entra y registrarlo. El noventa por ciento del uso de Git.
Muestra qué cambió, qué está preparado y en qué rama estás. Ejecútalo siempre antes de hacer commit.
git status
git status -s # versión cortaMueve el cambio al staging area — la antesala del commit.
git add arquivo.ts
git add src/Añade todo lo que cambió. Compruébalo con status antes, para no llevarte un archivo indeseado.
git add .Elige trozo a trozo dentro del mismo archivo. El mejor amigo del commit pequeño.
git add -pLa diferencia entre lo que está en disco y el último commit (sin contar lo que ya está preparado).
git diffMuestra exactamente lo que va a entrar en el próximo commit.
git diff --stagedCompara dos puntos cualesquiera de la historia.
git diff main..minha-feature
git diff main..minha-feature -- src/appRegistra lo que está preparado. El mensaje es documentación: escribe el porqué.
git commit -m "feat: adiciona filtro por assunto no blog"Título corto, línea en blanco y el contexto debajo.
git commit -m "fix: corrige contraste do tema claro" -m "O primary ficava em 3,2:1 sobre o fundo, abaixo do minimo AA."Prepara y hace commit de los archivos ya rastreados de una vez. No recoge archivos nuevos.
git commit -am "refactor: extrai helper de datas"Convención que deja el historial legible y permite generar un changelog automático.
# feat, fix, docs, style, refactor, perf, test, chore
git commit -m "perf(db): indexa pedidos por cliente_id"Corrige el último commit (mensaje o contenido). Solo antes del push.
git commit --amend -m "mensagem corrigida"
git commit --amend --no-edit # solo añade lo que está preparadoSin ningún cambio — útil para disparar un pipeline de CI.
git commit --allow-empty -m "chore: dispara build"Renombrar y eliminar manteniendo el rastro en el historial.
git mv antigo.ts novo.ts
git rm obsoleto.tsRamificar es barato en Git. Una rama por tarea es el patrón que evita dolores de cabeza.
Muestra las locales; con -a, también las remotas.
git branch
git branch -a
git branch -vv # con el último commit y el remoto de cada unaLa crea a partir del commit actual, sin cambiarte a ella.
git branch minha-featureswitch es el comando moderno; checkout sigue funcionando.
git switch minha-feature
git checkout minha-featureEl atajo más usado del día a día.
git switch -c minha-feature
git checkout -b minha-featureParte de un punto concreto en lugar del commit actual.
git switch -c hotfix mainRenombra la actual (-m) o una concreta.
git branch -m novo-nome
git branch -m nome-antigo novo-nome-d se niega si hay algún commit sin integrar; -D lo fuerza.
git branch -d minha-feature
git branch -D minha-featureElimina la rama del servidor después del merge.
git push origin --delete minha-featureEl - funciona igual que en cd.
git switch -Lista lo que ya se fusionó — candidatas seguras a borrar.
git branch --merged main
git branch --no-merged mainVincula la rama local con la del servidor, para hacer push/pull sin argumentos.
git branch --set-upstream-to=origin/minha-featureQuita de tu clon las ramas que ya no existen en el servidor.
git fetch --pruneDos ramas abiertas en carpetas distintas al mismo tiempo, sin volver a clonar.
git worktree add ../projeto-hotfix hotfix
git worktree list
git worktree remove ../projeto-hotfixÚtil dentro de un script y en el prompt del terminal.
git branch --show-currentDos formas de integrar el trabajo — y cómo salir del conflicto sin perder nada.
Trae la rama indicada a la actual, creando un commit de merge cuando hace falta.
git switch main
git merge minha-featureSin divergencia, Git solo adelanta el puntero — historia lineal, sin commit extra.
git merge --ff-only minha-featureFuerza el commit de merge, preservando la existencia de la rama en la historia.
git merge --no-ff minha-featureDevuelve todo al estado anterior al merge.
git merge --abortEdita los archivos marcados, quita los marcadores, añádelos y termina.
git status # lista los conflictos
# edita los archivos y quita <<<<<<< ======= >>>>>>>
git add arquivo-resolvido.ts
git commitAcepta tu versión o la que viene, sin edición manual.
git checkout --ours arquivo.ts # la versión de la rama actual
git checkout --theirs arquivo.ts # la versión que está entrandoAbre el conflicto en una herramienta gráfica configurada.
git mergetoolReaplica tus commits encima de otra rama. Deja la historia lineal.
git switch minha-feature
git rebase mainReordena, junta (squash), edita y elimina commits antes de abrir el PR.
git rebase -i HEAD~5¿Resolviste el conflicto? Continúa. ¿Se complicó? Aborta.
git rebase --continue
git rebase --skip
git rebase --abortLleva un commit concreto a la rama actual — el clásico del hotfix.
git cherry-pick a1b2c3d
git cherry-pick a1b2c3d..e4f5g6hRebase en tu rama antes del PR; merge para integrar en main. Nunca hagas rebase de una rama compartida.
# Bien: actualizar tu feature
git switch minha-feature && git rebase main
# Bien: integrar en la principal
git switch main && git merge --no-ff minha-featureSincronizar tu clon con el servidor — y entender la diferencia entre fetch y pull.
Muestra las direcciones configuradas para descargar y enviar.
git remote -vConecta el repositorio local con un servidor.
git remote add origin git@github.com:usuario/projeto.gitSe usa al migrar de HTTPS a SSH o al cambiar de organización.
git remote set-url origin git@github.com:usuario/projeto.gitDescarga las novedades sin tocar tu trabajo. El comando más seguro de Git.
git fetch originEs fetch + merge en un solo paso. Trae los cambios y ya los integra en tu rama.
git pull origin mainIntegra reaplicando tus commits por encima — sin un commit de merge por el camino.
git pull --rebase origin mainEnvía tus commits al servidor.
git push origin main-u vincula la rama local con la remota; después basta con git push.
git push -u origin minha-feature--force-with-lease se niega si alguien publicó algo que aún no has visto. Prefiérelo siempre a --force.
git push --force-with-lease origin minha-featureLas etiquetas no suben con un push normal.
git push origin v1.2.0
git push origin --tagsCuántos commits llevas por delante o por detrás.
git fetch
git status -sb
git log --oneline origin/main..HEAD # lo que tienes de másMantiene tu fork al día con el proyecto original.
git remote add upstream https://github.com/original/projeto.git
git fetch upstream
git merge upstream/mainCasi todo en Git es reversible. La diferencia está en lo que ya se publicó.
Devuelve el archivo al último commit. Pierdes lo que no se guardó.
git restore arquivo.ts
git checkout -- arquivo.ts # la forma antiguaDeja a cero el directorio de trabajo. Úsalo con conciencia.
git restore .Lo quita de lo preparado, pero mantiene el cambio en el archivo.
git restore --staged arquivo.ts
git reset arquivo.ts # la forma antiguaDeshace el commit y mantiene todo preparado. Ideal para rehacer el mensaje o juntar commits.
git reset --soft HEAD~1Deshace el commit y lo saca del staging, preservando los archivos. Es el valor por defecto.
git reset HEAD~1Deshace el commit y borra los cambios. No tiene deshacer — salvo por el reflog.
git reset --hard HEAD~1Crea un commit nuevo que deshace otro. Es la forma correcta de revertir algo ya publicado.
git revert a1b2c3dHay que indicar cuál es el lado principal (-m 1).
git revert -m 1 a1b2c3dRegistra todo por donde pasó el HEAD, incluidos los commits perdidos por un reset. Salva casi cualquier situación.
git reflog
git reset --hard HEAD@{2}Trae de vuelta la versión de un commit concreto.
git restore --source=HEAD~3 arquivo.tsBusca el commit en el reflog y vuelve a crear la rama en él.
git reflog
git branch minha-feature-recuperada a1b2c3dBorra los archivos no rastreados. Ejecútalo con -n antes para ver qué se iría.
git clean -n # simula
git clean -fd # borra archivos y directorios
git clean -fdx # incluye lo que está en .gitignoreSolo ese archivo viaja en el tiempo; el resto se queda como está.
git checkout a1b2c3d -- caminho/arquivo.tsUn .env subido sigue en el historial hasta que se reescriba — y el token hay que cambiarlo de todas formas.
git filter-repo --path .env --invert-paths
# después: git push --force-with-lease (acuérdalo antes con el equipo)Descubrir cuándo, por qué y por culpa de qué commit se rompió aquello.
El historial. Por sí solo es demasiado verboso — las variaciones de abajo valen más.
git log
git log -5La vista más útil: compacta, con las ramificaciones dibujadas.
git log --oneline --graph --decorate --allRecorta el historial por quién y cuándo.
git log --author="Jhonatan" --since="2 weeks ago"Encuentra el commit que introdujo (o quitó) un fragmento determinado.
git log -S "getThemeSelection" --onelineSolo los commits que tocaron esa ruta; --follow sigue los renombrados.
git log --follow -p -- src/lib/theme/presets.tsMuestra un commit entero: mensaje, autor y diff.
git show a1b2c3dDice quién escribió cada línea y en qué commit. Úsalo para entender, no para culpar.
git blame src/app/page.tsx
git blame -L 40,60 src/app/page.tsxBúsqueda binaria en el historial: encuentra en pocos pasos el commit que rompió algo.
git bisect start
git bisect bad # el actual está roto
git bisect good v1.0.0 # aquí funcionaba
# prueba, marca good/bad, repite
git bisect resetResumen por autor.
git shortlog -sn --allSin cambiar de rama ni tocar el directorio.
git show a1b2c3d:src/app/page.tsxGuardar el trabajo a medias, marcar versiones y reunir repositorios.
Guarda los cambios y limpia el directorio — para cambiar de contexto a toda prisa.
git stash
git stash push -m "meio da refatoração"pop lo aplica y lo quita de la pila; apply lo mantiene guardado.
git stash list
git stash pop
git stash apply stash@{1}Por defecto el stash ignora lo que no está rastreado.
git stash -uMarca una versión con autor, fecha y mensaje. Prefiérela a la etiqueta simple.
git tag -a v1.2.0 -m "Release 1.2.0"
git push origin v1.2.0Borrar exige quitarla local y remotamente.
git tag -l "v1.*"
git tag -d v1.2.0
git push origin --delete v1.2.0Un repositorio dentro de otro, fijado a un commit concreto.
git submodule add https://github.com/usuario/lib.git libs/lib
git submodule update --init --recursive
git clone --recurse-submodules https://github.com/usuario/projeto.git