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!