Esta hoja de trucos cubre los comandos y procesos más comunes de Git y GitHub, incluyendo .gitignore, Gitflow, y más. ¡Tenla a mano para un flujo de trabajo eficiente!
- Configuración Inicial ⚙️
- Conceptos Básicos 💡
- Comandos Esenciales 🛠️
- Ramas (Branches) 🌱
- Deshacer Cambios ↩️
- Trabajando con Remotos (GitHub) ☁️
- .gitignore 🚫
- Gitflow 🌊
- Resolución de Conflictos ⚔️
- Etiquetas (Tags)🏷️
- GitHub Actions 🤖
- Consejos Adicionales ✨
-
Configurar tu identidad:
git config --global user.name "Tu Nombre" git config --global user.email "tu@email.com"
👁️🗨️ Nota:
--globalaplica la configuración a todos tus repositorios. Usa--localpara configurar un repositorio específico (omite--global). -
Configurar tu editor de texto:
git config --global core.editor "code --wait" # Ejemplo con VS Code #Otras opciones: nano, vim, etc.
👁️🗨️Nota:
--waitle dice a git que espere a que cierres el editor para continuar. -
Inicializar un repositorio Git:
git init # En la carpeta raíz de tu proyecto -
Ver la configuración actual de Git
git config --list git config --list --show-origin # Te muestra de que archivo viene cada configuración
- Repositorio: Un directorio que Git rastrea. Contiene todo el historial de cambios.
- Commit: Una "foto" del estado de tu proyecto en un momento dado.
- Stage (Área de Preparación): Donde seleccionas los cambios que quieres incluir en el próximo commit.
- Branch (Rama): Una línea de desarrollo independiente. Útil para trabajar en nuevas características sin afectar el código principal.
- HEAD: Un puntero que indica el commit actual (la punta de la rama actual).
- Remote (Remoto): Un repositorio en otro lugar (como GitHub).
- Push: Enviar tus commits locales a un repositorio remoto.
- Pull: Traer los cambios de un repositorio remoto a tu local.
- Merge: Combinar los cambios de una rama en otra.
- Clone: Crear una copia local de un repositorio remoto.
-
Estado del repositorio:
git status # Muestra los archivos modificados, en stage, etc. -
Añadir archivos al stage:
git add <archivo> # Añade un archivo específico git add . # Añade todos los archivos modificados git add -u # Añade solo los archivos modificados, no los nuevos. git add *.txt # Añade todos los archivos .txt
-
Crear un commit:
git commit -m "Mensaje descriptivo del commit" git commit -am "Mensaje" # Añade y commit en un paso (solo archivos modificados)
👁️🗨️Nota: ¡Escribe mensajes de commit claros y concisos!
-
Ver el historial de commits:
git log # Muestra el historial completo git log --oneline # Muestra el historial en formato compacto git log -p # Muestra los cambios (diff) en cada commit git log --graph # Muestra un gráfico de las ramas y merges git log --author="Nombre" #Filtra por autor git log --grep="palabra clave" #Busca commits por palabra clave en el mensaje. git log --after="2023-10-01" --before="2023-10-31" #Filtra por rango de fechas. git log -- <ruta_al_archivo> # Muestra el historial de un archivo específico.
-
Ver los cambios (diff):
git diff # Muestra los cambios no añadidos al stage git diff --staged # Muestra los cambios en el stage git diff <commit1> <commit2> # Compara dos commits git diff <rama1> <rama2> #Compara dos ramas
-
Listar ramas:
git branch # Lista las ramas locales git branch -r # Lista las ramas remotas git branch -a # Lista todas las ramas (locales y remotas)
-
Crear una nueva rama:
git branch <nombre-rama> #Crea una rama a partir del commit actual. git branch <nombre-rama> <commit> #Crea una rama a partir de un commit específico.
-
Cambiar a otra rama:
git checkout <nombre-rama> git switch <nombre-rama> # Alternativa más moderna a checkout (Git 2.23+)
-
Crear y cambiar a una nueva rama en un solo paso:
git checkout -b <nombre-rama> # ¡Muy útil! git switch -c <nombre-rama> # Alternativa moderna.
-
Combinar ramas (merge):
git checkout <rama-destino> # Cambia a la rama donde quieres integrar los cambios git merge <rama-a-combinar> # Combina la rama especificada en la rama actual
-
Borrar una rama:
git branch -d <nombre-rama> # Borra la rama localmente (si ya se combinó) git branch -D <nombre-rama> # Fuerza el borrado (incluso si no se combinó) git push origin --delete <nombre-rama> # Borra una rama remota
👁️🗨️Nota: Usa
-Dcon precaución, puedes perder trabajo no guardado. -
Renombrar una rama:
git branch -m <nombre-antiguo> <nombre-nuevo> #Renombra la rama actual.
-
Ver la rama actual:
git branch --show-current
-
Descartar cambios locales (no en stage):
git checkout -- <archivo> # ¡Cuidado! Cambios no guardados se pierden git clean -f #Elimina todos los archivos sin seguimiento (untracked) git clean -fd # Elimina archivos y directorios untracked. git clean -n # Simula la limpieza, mostrando qué se eliminaría, sin borrar nada.
-
Quitar un archivo del stage:
git restore --staged <archivo> git reset HEAD <archivo> #Forma antigua, pero aun funciona
-
Deshacer un commit (sin borrarlo del historial):
git revert <commit> # Crea un nuevo commit que deshace los cambios
👁️🗨️Nota:
revertes seguro para usar en ramas compartidas. -
Modificar el último commit (¡solo si no lo has compartido!):
git commit --amend -m "Nuevo mensaje" # Cambia el mensaje del último commit git commit --amend # Abre el editor para modificar el mensaje y/o añadir cambios
👁️🗨️ ¡Importante! Nunca uses
amenden commits que ya hayas enviado (push) a un repositorio remoto compartido. Reescribe el historial, y eso causa problemas a otros. -
Deshacer commits (borrándolos del historial - ¡peligroso en ramas compartidas!):
git reset --soft <commit>: Mueve HEAD al commit especificado, pero mantiene los cambios en el stage.git reset --mixed <commit>: Mueve HEAD y quita los cambios del stage, pero los mantiene en tu directorio de trabajo.git reset --hard <commit>: Mueve HEAD, quita los cambios del stage y los borra de tu directorio de trabajo. ¡Cuidado!
👁️🗨️Nota:
resetes peligroso si lo usas en commits que ya has compartido. Reescribe el historial.
-
Clonar un repositorio remoto:
git clone <url-del-repositorio>
-
Listar repositorios remotos:
git remote -v # Muestra los remotos y sus URLs -
Añadir un repositorio remoto:
git remote add <nombre-remoto> <url-del-repositorio> # Ejemplo: git remote add origin https://github.com/tuusuario/tu-repo.git
👁️🗨️Nota: "origin" es el nombre convencional para el remoto principal.
-
Enviar cambios a un remoto (push):
git push <nombre-remoto> <nombre-rama> git push -u origin main # "-u" configura el seguimiento para futuros push/pull git push --all <nombre-remoto> #Envía todas las ramas locales git push --tags #Envía todas las etiquetas
-
Traer cambios de un remoto (pull):
git pull <nombre-remoto> <nombre-rama> #Trae cambios y combina (fetch + merge) git pull --rebase <nombre-remoto> <nombre-rama> #Trae cambios y aplica rebase (ver abajo)
-
Fetch (traer cambios sin combinar):
git fetch <nombre-remoto> # Trae los cambios, pero no los combina git fetch --all #Trae los cambios de todos los remotos
👁️🗨️Nota:
fetches útil para ver qué hay de nuevo sin afectar tu rama actual. -
Rebase
git checkout <feature-branch> git rebase <base-branch> # Por ejemplo: git rebase main
👁️🗨️Nota: Rebase reescribe la historia de tu rama, haciendo que parezca que trabajaste de manera lineal, como si hubieras creado la rama despues de todos los cambios de main. Evita
rebaseen ramas públicas o compartidas a menos que sepas muy bien lo que haces.
- Un archivo de texto llamado
.gitignoreen la raíz de tu repositorio. - Especifica archivos y directorios que Git debe ignorar (no rastrear).
- Útil para evitar subir archivos generados, dependencias, archivos de configuración locales, etc.
Ejemplo de .gitignore:
# Ignorar archivos de configuración de editores
.idea/
*.swp
# Ignorar archivos compilados
*.o
*.exe
*.class
# Ignorar logs
logs/
*.log
# Ignorar dependencias (ejemplo con Node.js)
node_modules/
# Ignorar archivos de configuración específicos
config.local.php
#Ignorar carpetas
carpeta_a_ignorar/
#Ignorar archivos por extensión
*.pdf
#Excepciones
!importante.pdf #Este archivo sí se incluirá
👁️🗨️ ¡Importante! Si un archivo ya está siendo rastreado por Git, añadirlo a .gitignore no lo eliminará de tu repositorio. Primero debes usar git rm --cached <archivo>.
Un modelo de ramificación popular para gestionar proyectos.
-
Ramas principales:
main(omaster): Código listo para producción.develop: Rama de integración. Contiene las últimas características en desarrollo.
-
Ramas de soporte:
feature/<nombre>: Para desarrollar nuevas características. Se crean a partir dedevelopy se combinan de nuevo endevelop.release/<versión>: Para preparar una nueva versión para producción. Se crean a partir dedevelopy se combinan enmainydevelop.hotfix/<descripción>: Para corregir errores críticos en producción. Se crean a partir demainy se combinan enmainydevelop.
Flujo de trabajo básico de Gitflow:
-
Nueva característica:
git checkout -b feature/mi-caracteristica develop- (Desarrollar la característica, hacer commits)
git checkout developgit merge --no-ff feature/mi-caracteristica(El--no-ffcrea un commit de merge, preservando el historial)git branch -d feature/mi-caracteristica
-
Nueva versión (release):
git checkout -b release/1.2.0 develop- (Actualizar número de versión, preparar documentación, etc.)
git checkout maingit merge --no-ff release/1.2.0git tag -a 1.2.0 -m "Versión 1.2.0"(Crear una etiqueta)git checkout developgit merge --no-ff release/1.2.0git branch -d release/1.2.0git push origin main develop 1.2.0(Enviar la etiqueta también).
-
Hotfix:
git checkout -b hotfix/problema-urgente main- (Corregir el error, hacer commits)
git checkout maingit merge --no-ff hotfix/problema-urgentegit tag -a 1.2.1 -m "Hotfix 1.2.1"git checkout developgit merge --no-ff hotfix/problema-urgentegit branch -d hotfix/problema-urgentegit push origin main develop 1.2.1
👁️🗨️Nota: Gitflow es solo un modelo. Puedes adaptarlo a tus necesidades. Hay herramientas que automatizan parte de Gitflow (como git-flow).
- Ocurren cuando Git no puede combinar automáticamente los cambios de dos ramas.
- Git marca las áreas conflictivas en los archivos afectados.
Ejemplo de conflicto:
<<<<<<< HEAD
Este es el contenido de mi rama actual.
=======
Este es el contenido de la otra rama.
>>>>>>> otra-rama
Pasos para resolver conflictos:
- Editar el archivo: Abre el archivo y decide qué código mantener. Elimina los marcadores
<<<<<<<,=======,>>>>>>>. - Añadir el archivo al stage:
git add <archivo> - Crear un commit:
git commit -m "Resueltos conflictos de merge"
-
Crear una etiqueta ligera
git tag <nombre-etiqueta>
-
Crear etiqueta anotada:
git tag -a <nombre-etiqueta> -m "Mensaje de la etiqueta"
-
Listar etiquetas:
git tag #Lista las etiquetas git tag -l "v1.*" #Lista usando patrones. git show <nombre-etiqueta> #Muestra información de la etiqueta
-
Crear etiqueta en un commit pasado:
git tag -a v1.2 <commit-hash> -m "Versión 1.2"
-
Compartir etiquetas:
git push origin <nombre-etiqueta> #Sube una etiqueta en especifico git push origin --tags #Sube todas las etiquetas al repositorio remoto
-
Borrar etiqueta:
git tag -d <nombre-etiqueta> #Borra la etiqueta localmente git push origin --delete <nombre-etiqueta> #Borra la etiqueta del remoto
- Definición: Plataforma de CI/CD integrada en GitHub.
- Archivos YAML: Los flujos de trabajo se definen en archivos
.ymldentro del directorio.github/workflows.
Ejemplo básico de un workflow:
name: Mi Workflow
on: [push] # Se ejecuta en cada push
jobs:
build:
runs-on: ubuntu-latest # Sistema operativo
steps:
- uses: actions/checkout@v3 # Clona el repositorio
- name: Ejecutar pruebas
run: |
npm install
npm test-
Usa un buen editor de código: VS Code, Sublime Text, Atom, etc., con integración con Git.
-
Aprende a usar la línea de comandos: Es la forma más poderosa de interactuar con Git.
-
Lee la documentación oficial de Git: Es muy completa.
-
Practica, practica, practica: La mejor forma de aprender Git es usándolo.
-
No tengas miedo de experimentar: Crea repositorios de prueba para probar cosas.
-
Usa alias de Git: Para abreviar y personalizar comandos
git config --global alias.co checkout git config --global alias.br branch git config --global alias.ci commit git config --global alias.st status git config --global alias.l "log --oneline --graph --decorate" #Un log más completo