"Los sistemas de control de versiones no son sobre archivos, son sobre los cambios a los archivos"
Git es un sistema de control de versiones distribuido diseñado para:
# Configuración global
git config --global user.name "Tu Nombre"
git config --global user.email "tu.email@ejemplo.com"
# Configuración del repositorio actual
git config user.name "Tu Nombre"
git config user.email "tu.email@ejemplo.com"
# Crear un nuevo repositorio
git init
# Clonar un repositorio existente
git clone https://github.com/usuario/repositorio.git
# Ver estado de archivos
git status
# Añadir archivos al staging area
git add archivo.txt # Archivo específico
git add . # Todos los archivos
# Confirmar cambios
git commit -m "Mensaje descriptivo del cambio"
git commit -a -m "Añadir y confirmar en un paso"
# Ver historial de commits
git log
git log --oneline # Formato resumido
git log --graph # Con representación gráfica
# Ver ramas existentes
git branch
# Crear nueva rama
git branch nueva-funcionalidad
# Cambiar a una rama
git checkout nueva-funcionalidad
git switch nueva-funcionalidad # Git moderno
# Crear y cambiar en un paso
git checkout -b nueva-funcionalidad
# Fusionar ramas
git checkout main
git merge nueva-funcionalidad
# Eliminar rama
git branch -d nueva-funcionalidad # Si ya está fusionada
git branch -D nueva-funcionalidad # Forzar eliminación
Los conflictos ocurren cuando Git no puede resolver automáticamente las diferencias entre ramas:
<<<<<<< HEAD
Cambios en la rama actual
=======
Cambios en la rama que estás fusionando
>>>>>>> rama-a-fusionar
git add
git commit
# Clonar repositorio con HTTPS
git clone https://github.com/usuario/repo.git
# GitHub solicitará credenciales en cada operación remota
# Recomendado: Configurar credential helper
git config --global credential.helper cache # Temporal
git config --global credential.helper store # Permanente
Generar clave SSH (si no la tienes)
ssh-keygen -t ed25519 -C "tu.email@ejemplo.com"
Añadir clave al ssh-agent
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
Añadir clave pública a GitHub
~/.ssh/id_ed25519.pub
Clonar usando SSH
git clone git@github.com:usuario/repo.git
Herramienta oficial de línea de comandos para GitHub:
# Seguir instrucciones según sistema operativo
# https://github.com/cli/cli#installation
gh auth login
# Clonar repositorio
gh repo clone usuario/repo
# Crear pull request
gh pr create
# Ver y revisar pull requests
gh pr list
gh pr checkout número
gh pr view número
# Crear issues
gh issue create
# Ver repositorios remotos
git remote -v
# Añadir repositorio remoto
git remote add origin https://github.com/usuario/repo.git
# Eliminar repositorio remoto
git remote remove origin
# Añadir upstream
git remote add upstream https://github.com/original/repo.git
# Obtener cambios del upstream
git fetch upstream
git merge upstream/main
# Obtener cambios sin integrarlos
git fetch origin
# Obtener e integrar cambios
git pull origin main
# Enviar cambios locales al remoto
git push origin main
# Establecer tracking para simplificar comandos
git push -u origin feature # Después solo: git push
git checkout -b feature/nueva-funcionalidad
git add .
git commit -m "feat: implementa nueva funcionalidad"
git push -u origin feature/nueva-funcionalidad
// Simple, basado en variables de entorno
if (process.env.FEATURE_NEW_UI === 'true') {
// Mostrar nueva interfaz
} else {
// Mostrar interfaz antigua
}
// Basado en usuarios
if (userGroups.includes('beta-testers')) {
// Mostrar funcionalidad beta
}
// Porcentaje de usuarios
if (Math.random() < 0.1) { // 10% de usuarios
// Mostrar nueva funcionalidad
}
// Ejemplo con biblioteca
import { initializeClient } from 'feature-flag-service';
const client = initializeClient('api-key');
if (client.isEnabled('new-payment-method')) {
// Mostrar nuevo método de pago
}
git checkout main
git merge feature/nueva-funcionalidad
git checkout feature/nueva-funcionalidad
git rebase main
# Ver a qué apunta HEAD
git rev-parse HEAD
# Ver historial con ubicación de HEAD
git log --oneline --decorate
HEAD normal: Apunta a una rama
HEAD -> main -> commit A
Detached HEAD: Apunta directamente a un commit
HEAD -> commit C (no rama)
# Cambiar de rama
git checkout rama-destino
# Crear y cambiar a nueva rama
git checkout -b nueva-rama
# Restaurar archivos desde HEAD
git checkout -- archivo.txt
# Moverse a un commit específico (¡crea detached HEAD!)
git checkout abc123
# Cambiar de rama
git switch rama-destino
# Crear y cambiar a nueva rama
git switch -c nueva-rama
# Regresar a la rama anterior
git switch -
# Descartar cambios en working directory
git restore archivo.txt
# Descartar cambios en staging area
git restore --staged archivo.txt
# Restaurar a una versión específica
git restore --source=HEAD~1 archivo.txt
git checkout abc123
git checkout v1.0.0
git checkout main
# Crear una nueva rama donde estás
git branch nueva-rama-backup
# Cambiar a la nueva rama
git checkout nueva-rama-backup
Poderosa herramienta para editar la historia antes de integrarla:
git rebase -i HEAD~3 # Editar los últimos 3 commits
Opciones disponibles:
Útil para limpiar la historia antes de hacer PR.
Permite mover HEAD y la rama actual a un commit específico:
git reset --soft HEAD~1 # Deshacer último commit, conservar cambios
git reset HEAD~1 # Deshacer último commit y staging
git reset --hard HEAD~1 # Eliminar último commit y cambios
Registra todos los movimientos de HEAD, útil para recuperar commits "perdidos":
# Ver historial de referencias
git reflog
# Recuperar commit eliminado
git checkout <hash-del-commit>
git branch nueva-rama # Para preservar el commit recuperado
Especificación para dar estructura a los mensajes de commit:
<tipo>[ámbito opcional]: <descripción>
[cuerpo opcional]
[notas de pie opcionales]
git commit -m "feat(auth): implementa autenticación con Google"
git commit -m "fix(ui): corrige alineación en pantallas pequeñas"
# Configurar Git y clonar repositorio
git config --global user.name "Tu Nombre"
git config --global user.email "tu@email.com"
git clone https://github.com/usuario/proyecto-demo.git
cd proyecto-demo
# Crear y cambiar a nueva rama
git checkout -b feature/nueva-api
// archivo: features.js
const FEATURES = {
NUEVA_API: process.env.FEATURE_NUEVA_API === 'true'
};
// archivo: api.js
if (FEATURES.NUEVA_API) {
// Implementación nueva
} else {
// Implementación antigua
}
git add features.js api.js
git commit -m "feat(api): implementa nueva API con feature flag"
git push -u origin feature/nueva-api
# Con GitHub CLI
gh pr create --title "Implementa nueva API" --body "Esta PR incluye la nueva API protegida por feature flag"
git checkout main
git pull
git merge feature/nueva-api
git push
En nuestra organización hemos establecido lineamientos oficiales para:
Consulta el documento completo en nuestro repositorio:
¿Cuándo usar merge vs. rebase?
¿Cómo recuperar cambios perdidos?
git reflog
para encontrar y recuperar commits "perdidos"¿Cómo resolver conflictos complejos?