Post

Git / Comandos

Referencia completa de comandos Git, desde los esenciales hasta los más avanzados.

Git / Comandos

Flujo de trabajo típico

Antes de entrar en la referencia completa, este es el flujo que seguirás en el día a día:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 1. Clonar o inicializar
git clone https://github.com/usuario/repo.git
cd repo

# 2. Crear una rama para tu trabajo
git switch -c feature/nueva-funcionalidad

# 3. Editar archivos... y luego:
git add .
git commit -m "feat: añadir nueva funcionalidad"

# 4. Sincronizar con el remoto
git push origin feature/nueva-funcionalidad

# 5. Cuando el trabajo esté listo, fusionar a main
git switch main
git merge feature/nueva-funcionalidad

# 6. Subir main actualizado
git push origin main

Referencia por categoría


Inicialización

git init

Inicializa un repositorio Git nuevo en el directorio actual. Crea la carpeta oculta .git/ con toda la estructura interna.

1
git init

Inicializar con un nombre de rama concreto:

1
git init -b main

Inicializar un repositorio bare (sin working directory, usado en servidores):

1
git init --bare proyecto.git

git clone

Clona un repositorio remoto en tu equipo. Descarga todo el historial, ramas y archivos.

1
git clone https://github.com/usuario/repo.git

Clonar en una carpeta con nombre diferente:

1
git clone https://github.com/usuario/repo.git mi-proyecto

Clonar solo una rama específica:

1
git clone -b develop https://github.com/usuario/repo.git

Clonar sin historial (shallow clone), útil para repositorios grandes:

1
git clone --depth 1 https://github.com/usuario/repo.git

Staging y commits

git status

Muestra el estado actual del working directory y el staging area: archivos modificados, sin seguimiento o listos para commit.

1
git status

Versión compacta:

1
git status -s

git add

Añade cambios al staging area para incluirlos en el próximo commit.

Añadir un archivo concreto:

1
git add archivo.txt

Añadir todos los cambios del directorio actual:

1
git add .

Añadir todos los archivos con una extensión concreta:

1
git add *.md

Modo interactivo, selecciona qué partes de un archivo añadir:

1
git add -p archivo.txt

git commit

Guarda el estado del staging area como un nuevo commit en el historial.

1
git commit -m "feat: descripción del cambio"

Añadir al staging y hacer commit en un solo paso (solo archivos ya rastreados):

1
git commit -am "fix: corregir error en validación"

Modificar el último commit (mensaje o contenido), siempre que no se haya hecho push:

1
git commit --amend -m "mensaje corregido"

Commit vacío, útil para disparar pipelines CI/CD:

1
git commit --allow-empty -m "chore: trigger pipeline"

git diff

Muestra las diferencias entre estados.

Cambios en el working directory respecto al staging:

1
git diff

Cambios en el staging respecto al último commit:

1
git diff --staged

Diferencias entre dos commits:

1
git diff a3f92bc 7d1e4fa

Diferencias entre dos ramas:

1
git diff main..feature/login

Historial

git log

Muestra el historial de commits.

1
git log

Formato compacto, una línea por commit:

1
git log --oneline

Historial con gráfico de ramas:

1
git log --oneline --graph --all

Filtrar por autor:

1
git log --author="Alejandro"

Filtrar por fecha:

1
git log --since="2026-01-01" --until="2026-05-01"

Buscar commits cuyo mensaje contenga una cadena:

1
git log --grep="fix"

Ver qué commits tocaron un archivo concreto:

1
git log -- archivo.txt

git show

Muestra el contenido de un commit concreto: mensaje, autor, fecha y diff.

1
git show a3f92bc

git blame

Muestra quién modificó cada línea de un archivo y en qué commit.

1
git blame archivo.txt

Ramas

git branch

Gestiona ramas locales.

Listar ramas locales:

1
git branch

Listar ramas locales y remotas:

1
git branch -a

Crear una rama nueva (sin cambiar a ella):

1
git branch nueva-rama

Renombrar una rama:

1
git branch -m nombre-viejo nombre-nuevo

Eliminar una rama ya fusionada:

1
git branch -d rama

Forzar eliminación aunque no esté fusionada:

1
git branch -D rama

git switch

Cambia de rama (comando moderno, preferido sobre git checkout para ramas).

Cambiar a una rama existente:

1
git switch main

Crear una rama y cambiar a ella en un solo paso:

1
git switch -c feature/nueva

Volver a la rama anterior:

1
git switch -

git merge

Fusiona una rama en la rama activa.

1
git merge feature/login

Fusionar sin fast-forward, forzando la creación de un commit de merge:

1
git merge --no-ff feature/login

Abortar un merge con conflictos:

1
git merge --abort

git rebase

Reaplica los commits de una rama sobre otra, reescribiendo el historial. Produce un historial lineal más limpio que merge.

Rebasar la rama actual sobre main:

1
git rebase main

Rebase interactivo: permite reordenar, editar, fusionar o eliminar commits del historial:

1
git rebase -i HEAD~4

Dentro del editor aparecen los últimos 4 commits. Puedes usar pick, squash, reword, drop, etc.

Continuar el rebase tras resolver conflictos:

1
git rebase --continue

Abortar el rebase:

1
git rebase --abort

⚠️ Nunca hagas rebase de ramas que ya están en el remoto y otras personas usan. Reescribe el historial y causa conflictos a los demás.


Remotos

git remote

Gestiona los repositorios remotos vinculados.

Listar remotos:

1
git remote -v

Añadir un remoto:

1
git remote add origin https://github.com/usuario/repo.git

Cambiar la URL de un remoto:

1
git remote set-url origin https://github.com/usuario/nuevo-repo.git

Eliminar un remoto:

1
git remote remove origin

git fetch

Descarga los cambios del remoto sin aplicarlos al working directory. Solo actualiza las referencias remotas.

1
git fetch origin

Fetch de todas las ramas remotas:

1
git fetch --all

git pull

Descarga los cambios del remoto y los fusiona en la rama actual. Equivale a git fetch + git merge.

1
git pull origin main

Pull con rebase en lugar de merge (historial más limpio):

1
git pull --rebase origin main

git push

Sube los commits locales al repositorio remoto.

1
git push origin main

Subir una rama nueva al remoto y establecer el tracking:

1
git push -u origin feature/login

Forzar el push (sobreescribe el historial remoto, usar con precaución):

1
git push --force-with-lease origin feature/login

Usar --force-with-lease en lugar de --force: falla si alguien más ha subido cambios mientras tanto.

Eliminar una rama del remoto:

1
git push origin --delete rama-vieja

Etiquetas

git tag

Las etiquetas marcan commits concretos, normalmente versiones de release.

Listar etiquetas:

1
git tag

Crear una etiqueta ligera:

1
git tag v1.0.0

Crear una etiqueta anotada (recomendada para releases, incluye mensaje y firma):

1
git tag -a v1.0.0 -m "Primera versión estable"

Etiquetar un commit anterior:

1
git tag -a v0.9.0 a3f92bc

Subir una etiqueta al remoto:

1
git push origin v1.0.0

Subir todas las etiquetas:

1
git push origin --tags

Eliminar una etiqueta local:

1
git tag -d v1.0.0

Eliminar una etiqueta del remoto:

1
git push origin --delete v1.0.0

Stash

git stash

Guarda temporalmente los cambios del working directory sin hacer commit. Útil para cambiar de rama con trabajo a medias.

Guardar cambios en el stash:

1
git stash

Guardar con un nombre descriptivo:

1
git stash push -m "trabajo en progreso: login"

Incluir archivos sin seguimiento:

1
git stash push -u

Listar entradas del stash:

1
git stash list

Aplicar el stash más reciente sin eliminarlo:

1
git stash apply

Aplicar y eliminar del stash:

1
git stash pop

Aplicar una entrada concreta:

1
git stash apply stash@{2}

Eliminar una entrada concreta:

1
git stash drop stash@{2}

Limpiar todo el stash:

1
git stash clear

Deshacer cambios

git restore

Descarta cambios en el working directory o deshace el staging (comando moderno).

Descartar cambios en un archivo (vuelve al último commit):

1
git restore archivo.txt

Sacar un archivo del staging sin perder los cambios:

1
git restore --staged archivo.txt

git reset

Mueve el puntero HEAD y opcionalmente modifica el staging y el working directory.

Deshacer el último commit manteniendo los cambios en staging:

1
git reset --soft HEAD~1

Deshacer el último commit manteniendo los cambios en el working directory:

1
git reset --mixed HEAD~1

Deshacer el último commit y descartar todos los cambios:

1
git reset --hard HEAD~1

⚠️ --hard es destructivo. Los cambios se pierden de forma irrecuperable si no están en otro commit.


git revert

Crea un nuevo commit que invierte los cambios de un commit anterior. No reescribe historial, es seguro en ramas compartidas.

1
git revert a3f92bc

Revertir sin abrir el editor de mensajes:

1
git revert --no-edit a3f92bc

Comandos avanzados

git cherry-pick

Aplica un commit concreto de otra rama sobre la rama actual, sin fusionar toda la rama.

1
git cherry-pick a3f92bc

Cherry-pick de un rango de commits:

1
git cherry-pick a3f92bc..7d1e4fa

Aplicar sin hacer commit automáticamente (para revisar antes):

1
git cherry-pick -n a3f92bc

git bisect

Búsqueda binaria en el historial para localizar qué commit introdujo un bug. Git divide el historial a la mitad en cada paso hasta encontrar el commit problemático.

Iniciar la búsqueda:

1
git bisect start

Marcar el commit actual como malo (tiene el bug):

1
git bisect bad

Marcar un commit antiguo conocido como bueno (sin el bug):

1
git bisect good v1.0.0

Git hace checkout automáticamente a un commit intermedio. Pruebas y marcas:

1
2
git bisect good   # si este commit no tiene el bug
git bisect bad    # si este commit tiene el bug

Cuando Git encuentra el commit culpable, lo muestra. Finalizar:

1
git bisect reset

Automatizar con un script (Git ejecuta el script en cada paso y marca automáticamente):

1
git bisect run ./test.sh

git reflog

Muestra el historial completo de movimientos de HEAD, incluyendo commits eliminados con reset --hard. Es el salvavidas cuando se pierde trabajo.

1
git reflog

Recuperar un commit perdido por reset --hard:

1
2
git checkout a3f92bc        # ver el estado
git switch -c rama-recuperada  # crear rama desde ese punto

git worktree

Permite tener múltiples working directories del mismo repositorio en paralelo, cada uno en una rama diferente. Útil para revisar un PR mientras trabajas en otra cosa sin hacer stash.

Añadir un worktree en una carpeta nueva:

1
git worktree add ../proyecto-hotfix hotfix/bug-critico

Listar worktrees activos:

1
git worktree list

Eliminar un worktree:

1
git worktree remove ../proyecto-hotfix

git submodule

Incluye otro repositorio Git dentro del tuyo como dependencia versionada.

Añadir un submódulo:

1
git submodule add https://github.com/usuario/libreria.git libs/libreria

Clonar un repositorio que tiene submódulos:

1
git clone --recurse-submodules https://github.com/usuario/repo.git

Actualizar todos los submódulos al commit referenciado:

1
git submodule update --init --recursive

git archive

Exporta el contenido del repositorio en un archivo comprimido, sin incluir la carpeta .git/.

1
git archive --format=zip HEAD -o release.zip

Exportar solo una carpeta concreta:

1
git archive --format=tar.gz HEAD src/ -o src.tar.gz

.gitignore

El archivo .gitignore le dice a Git qué archivos o carpetas no debe rastrear nunca.

Ejemplo típico para un proyecto de desarrollo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Dependencias
node_modules/
vendor/

# Entornos virtuales
.env
.venv/

# Compilados y builds
dist/
build/
*.o
*.pyc
__pycache__/

# IDEs
.idea/
.vscode/
*.swp

# Logs
*.log
logs/

# Sistema operativo
.DS_Store
Thumbs.db

Ignorar un archivo ya rastreado (primero hay que sacarlo del índice):

1
git rm --cached archivo.txt

Comprobar qué regla de .gitignore está ignorando un archivo:

1
git check-ignore -v archivo.txt
This post is licensed under CC BY 4.0 by the author.