Presentamos una lista de comandos de git que pueden ser útiles en diversos casos.

El oráculo del desarrollador git es un glosario de comandos básicos que comprenden actividades desde las más sencillas hasta las más complejas. Guárdalo en tus favoritos para que lo tengas a mano cuando necesites consultar un comando git.

Configuración

# Abre la configuración global ~/.gitconfig en el editor predeterminado
# para modificar las opciones

git config -e --global

# Establece el nombre y correo electrónico para los mensajes de commit
git config --global user.name "John Doe"
git config --global user.email "johndoe@example.com"

# Muestra todas las opciones de configuración.
git config --list

# Muestra la salida de los comandos con colores
git config --global color.diff auto
git config --global color.status auto
git config --global color.branch auto

GIT_AUTHOR_NAME, GIT_COMMITTER_NAME: Variables de entorno para modificar el nombre completo del committer (sobreescribe la configuración especificada a través de git config).

GIT_AUTHOR_EMAIL, GIT_COMMITTER_EMAIL: Variables de entorno para modificar el correo del committer (sobreescribe la configuración especificada a través de git config).

Inicializar repositorio

# Inicializa el repositorio git en la carpeta actual
git init
# Inicializa el repositorio para ser utilizado como servidor
git init --bare

Añadir/Eliminar archivos

# Agrega archivos al área de versionamiento para ser incluidos
# en el próximo commit
git add [ARCHIVO1] [ARCHIVO2] [ARCHIVO3] ...
git stage [ARCHIVO1] [ARCHIVO2] [ARCHIVO3] ...

# Ejemplos:
# git add archivo.php
# git add *.py
# Agrega carpetas al área de versionamiento para ser incluidos
# en el próximo commit
git add [CARPETA]
git stage [CARPETA]

# Ejemplos:
# git add .
# git add documentos/
# Muestra un modo interactivo para seleccionar las líneas de código
# que se deben agregar al área de versionamiento
git add -p
git stage --patch
# Muestra un modo interactivo para selecionar los archivos
# a incluir en el área de versionamiento
git add -i
git stage --interactive
# Remueve archivos del sistema de archivos y de la base de datos
git rm [ARCHIVO1] [ARCHIVO2] [ARCHIVO3] ...
# Remueve archivos sólo de la base de datos
git rm --cached [ARCHIVO1] [ARCHIVO2] [ARCHIVO3] ...
# Remueve archivos de la base de datos que hayan sido removidos del
# sistema de archivos (con rm, por ejemplo)
git rm $( git ls-files --deleted )

Registrar cambios

# Registra los cambios del área de versionamiento de los archivos
# -m especifica el mensaje descriptivo de los cambios
git commit [ARCHIVO1] [ARCHIVO2] [ARCHIVO3] ... [-m "MENSAJE"]
# Regista todos los cambios en el área de versionamiento
git commit -a
# Registra los cambios en modo verbose
git commit -v
# Permite corregir el mensaje del último commit
git commit --amend

# Permite corregir el mensaje del último commit incluyendo los cambios hechos a los archivos
git commit --amend [ARCHIVO1] [ARCHIVO2] [ARCHIVO3] ...

Información

# Muestra un resumen de todos los cambios realizados desde
# el último commit
git diff

# Muestra un resumen de los cambios realizados a un [ARCHIVO]
# en particular desde el último commit
git diff -- [ARCHIVO]

# Muestra los cambios versionados pero que no se les ha hecho commit
# (staging area)
git diff --cached
# Muestra el estado del versionamiento: archivos añadidos al área de
# versionamiento, archivos versionados con cambios y archivos sin versionar.
git status

# Muestra el registro de los commits hechos hasta el momento
git log

# Muestra el registro con los diffs completos en cada commit
git log -p

# Muestra el registro con colores
git log --color

# Muestra el registro en forma de gráfico
git log --graph

# Muestra el registro con la información de los tags
git log --decorate

# Muestra el registro con un resumen de los cambios hechos
# en cada commit
git log --stat

# Muestra los commits hechos por un autor en específico
git log --author=name@mail.com

# Muestra los commits hechos después de la fecha MM DD YYYY
git log --after="MM DD YYYY"

# Muestra los commits hechos antes de la fecha MM DD YYYY
git log --before="MM DD YYYY"

# Muestra los commits que han sido fusiones de ramas
git log --merges

# Muestra los commits en formato de una línea
git log --pretty=oneline

# Muestra los commits en formato:
git log --pretty=format:"%an %ad %h %s"

# Muestra los commits entre un rango de commits
git log [COMMIT]..[COMMIT]
# Muestra los commits que afectaron un [ARCHIVO], los más recientes primero
git whatchanged [ARCHIVO]
# Muestra los cambios (diff) introducidos en un commit específico
git show [COMMIT]
# Muestra los autores de cada línea en un archivo
git blame [ARCHIVO]

# Muestra los autores de cada línea en un archivo para un [COMMIT] específico
git blame [ARCHIVO] [COMMIT]
# Muestra una interfaz gráfica para git blame
# (necesita la instalación del paquete git-gui)
git gui blame [ARCHIVO]
# Muestra todos los archivos versionados
git ls-files
# Muestra todos los tags existentes en el repositorio remoto
git ls-remote [REMOTE]

Ramas, Fusiones y Etiquetas

# Muestra las ramas locales
git branch

# Muestra las ramas remotas
git branch -r

# Muestra las ramas locales y remotas
git branch -a
# Crea una [RAMA-NUEVA] a partir de la rama actual
git branch [RAMA-NUEVA]

# Crea una [RAMA-NUEVA] a partir de una [RAMA-EXISTENTE]
git branch [RAMA-NUEVA] [RAMA-EXISTENTE]
# Crea una [RAMA-NUEVA] en el [REPOSITORIO] a partir de una [RAMA-EXISTENTE]
git push [REPOSITORIO] [RAMA-EXISTENTE]:refs/heads/[RAMA-NUEVA]
# Crea una [RAMA-NUEVA] configurada para seguir una [RAMA-REMOTA]
git branch --track [RAMA-NUEVA] [RAMA-REMOTA]

# Ejemplo:
# git branch --track development origin/development
# Configura una [RAMA-EXISTENTE] para seguir una [RAMA-REMOTA]
git branch --set-upstream [RAMA-EXISTENTE] [RAMA-REMOTA]
# Elimina una [RAMA]
git branch -d [RAMA]

# Elimina una [RAMA] incluso si tiene datos no versionados
git branch -D [RAMA]

# Elimina una [RAMA] que fue creada para seguir una [RAMA-REMOTA]
git branch -r -d [RAMA]
# Cambia a la rama [RAMA]
git checkout [RAMA]

# Crea una [RAMA-NUEVA] a partir de una [RAMA-EXISTENTE] y luego se cambia a [RAMA-NUEVA]
git checkout -b [RAMA-NUEVA] [RAMA-EXISTENTE]
# Elimina una [RAMA] del [REPOSITORIO]
git push [REPOSITORIO]:[RAMA]
# Incluye un [ARCHIVO] desde una [RAMA] en la rama actual
git co [RAMA] [ARCHIVO]
# Muestra el contenido de un [ARCHIVO] de una [RAMA] diferente a la actual
git show [RAMA] -- [ARCHIVO]
# Muestra el contenido de un [ARCHIVO] en un [COMMIT] específico
git show [COMMIT]:[ARCHIVO]
# Fusiona una [RAMA] con la rama actual
git merge [RAMA]
# Fusiona una [RAMA] pero no hace commit
git merge [RAMA] --no-commit
# Fusiona una [RAMA] y en caso de haber conflictos, resolverlos dejando los
# cambios de la rama actual
git merge [RAMA] -X recursive -s ours

# Fusiona una [RAMA] y en caso de haber conflictos, resolverlos dejando los
# cambios de [RAMA]
git merge [RAMA] -X recursive -s theirs
# Abre un solucionador de conflictos interactivo en caso de una fusión fallida
git mergetool
# Muestra una lista de todas las etiquetas definidas en el repositorio.
git tag -l
# Crea una etiqueta [TAG] en el último commit
git tag [TAG]
# Elimina una etiqueta [TAG]
git tag -d [TAG]

Compartir

# Clona un repositorio git presente en [URL]
git clone [URL]
# Trae los cambios existentes en el [REPOSITORIO] sin fusionar los cambios
git fetch [REPOSITORIO]
# Fusiona los cambios existentes en el [REPOSITORIO] de la [RAMA]
git pull [REPOSITORIO] [RAMA]
# Envía los cambios de una [RAMA] al [REPOSITORIO]
git push [REPOSITORIO] [RAMA]
# Agrega un repositorio remoto [URL] bajo el pseudónimo [REPOSITORIO]
git remote add [REPOSITORIO] [URL]
# Muestra la información referente a un [REPOSITORIO]
git remote show [REPOSITORIO]
# Elimina un [REPOSITORIO] de la lista de repositorios disponibles
git remote rm [REPOSITORIO]
# Elimina una [RAMA] en el [REPOSITORIO]
git push [REPOSITORIO] :ref/heads/[RAMA]
# Crea una [RAMA] en el [REPOSITORIO]
git push [REPOSITORIO] [REPOSITORIO]:ref/heads/[RAMA]
# Reemplaza [RAMA] con [NUEVARAMA] en el [REPOSITORIO]
git push [REPOSITORIO] +[RAMA]:[NUEVARAMA]

Corrigiendo errores y manipulando historial

# Revierte un [COMMIT]
git revert [COMMIT]
# Trae el [ARCHIVO] desde un [COMMIT] previo al sistema de archivos actual
git checkout [COMMIT] [ARCHIVO]
# Remueve los archivos del area de versionamiento para el próximo commit
git reset HEAD [ARCHIVO1] [ARCHIVO2] [ARCHIVO3] ...
# Devuelve el estado del sistema de archivos hasta el último commit
git reset --hard
# Devuelve hasta el último commit, pero deja los archivos en el área de versionamiento
git reset --soft
# Trae el código de un [TAG] al área de versionamiento
git co [TAG]
# Obtiene los cambios introducidos por [COMMIT] y hace un nuevo commit
git cherry-pick [COMMIT]
# Permite fusionar los N últimos commits en uno solo
git rebase --interactive HEAD~N

Guardado temporal

# Guarda las modificaciones sin registrar en una base de datos temporal
# Permite realizar otras operaciones (git pull, git checkout, etc.) sin
# necesidad de hacer commit de los cambios
git stash
git stash save
# Restaura los cambios guardados en el último stash
git stash apply
# Restaura los cambios guardados en el último stash y lo remueve de la lista
git stash pop
# Muestra una lista de todos los stashes
git stash list
# Muestra el contenido de los cambios guardados en un [STASH]
git stash show [STASH] -p
# Elimina un [STASH]
git stash drop [STASH]
# Elimina todos los stashes
git stash clear

Submódulos

# Agrega el repositorio [URL] como submódulo en la [RUTA] dentro de
# un repositorio git existente
git add submodule [URL] [RUTA]
# Actualiza [e inicializa] el estado de los submódulos de un super-repo
git submodule update [--init]
# Ejecuta un [COMANDO] en cada uno de los submódulos
git submodulo foreach [COMANDO]

Eliminación de submódulos

  1. Eliminar la línea correspondiente del archivo .gitmodules.
  2. Eliminar la sección pertinente de .git/config.
  3. Ejecutar git rm --cached [RUTA-AL-SUBMÓDULO] (sin barra al final).
  4. Hacer commit y eliminar los archivos del submódulo.

Actualización de submódulos

cd [RUTA-AL-SUBMODULO]
git pull [REPOSITORIO] [RAMA]
cd [RUTA-AL-SUPER-REPO]
git commit -a

Trabajando con parches

# Genera un parche a partir del último commit
git format-patch HEAD^
# Genera un parche a partir de un rango de commits
git format-patch [COMMIT]̣̣^..[COMMIT]
# Aplica un [PARCHE] generado por git format-patch
git am [PARCHE]
# Genera un [PARCHE] a partir de las diferencias entre el último commit
# y el estado actual (con formato compatible con la herramienta patch)
git diff --no-prefix > [PARCHE]

Archivos comprimidos

# Genera un archivo tar en [RUTA]
git archive master | tar -x -C [RUTA]
# Genera un archivo source.tar.bz2
git archive master | bzip2 > source.tar.bz2
# Genera un archivo source.zip del último commit
git archive -o source.zip HEAD
# Genera un archivo source.tar.gz a partir del tag [TAG]
git archive -o source.tar.gz [TAG]

Hacks

# Optimizar el repositorio para disminuir el tamaño
git gc --aggressive
# Comprime al máximo el repositorio
git repack -a -d --window=50 --depth=50 --window-memory=1024m
# Ignora [ARCHIVO] del versionamiento
echo "[ARCHIVO]" >> .gitignore

¡Espero que les sirva!