====== Git - Flujo de trabajo ====== Comandos organizados según el uso habitual: configuración, ramas, clones, diferencias, fusión, sincronización remota y resolución de conflictos. ===== Configuración inicial ===== * **Muestra la versión de Git instalada**. git --version * **Inicializa un repositorio nuevo** en el directorio actual. git init * **Configura un directorio como seguro** (evita el error ''detected dubious ownership'' en entornos como /var/www). git config --global --add safe.directory /var/www/btrainer * **Inicia Git Flow** (estructura de ramas feature/develop/master/release/hotfix). git flow init ===== Estado y seguimiento ===== * **Muestra el estado actual** del working directory y staging area. git status * **Añade todos los cambios** (nuevos, modificados y eliminados) al área de staging. git add . * **Guarda los cambios en staging** con un mensaje descriptivo. git commit -m "Carga inicial" ===== Gestión de ramas ===== * **Lista las ramas locales** (la actual con asterisco). git branch * **Lista todas las ramas** (locales y remotas). git branch -a * **Crea una nueva rama** llamada ''arwen-estado''. git branch arwen-estado * **Crea una rama de respaldo** antes de una fusión peligrosa. git branch backup/master-pre-fusion * **Elimina una rama local** (solo si ya está fusionada). git branch -d arwen-estado * **Muestra la ayuda** del comando branch. git branch -h * **Cambia a la rama develop**. git checkout develop * **Cambia a la rama master**. git checkout master ===== Clonación y copias remotas ===== * **Clona un repositorio local a una máquina remota vía SSH** (sin --bare: directorio de trabajo completo). git clone /home/luis/Dropbox/Proyectos/btrainer ssh://ubuntu@boromir/home/ubuntu/Proyectos/btrainer * **Clona desde el directorio actual a remoto** (dos formas equivalentes). git clone . ssh://ubuntu@boromir/Proyectos/btrainer git clone . ubuntu@boromir/Proyectos/btrainer * **Clona un repositorio bare** (solo el historial, sin working directory). Útil para servidores centrales. git clone --bare . ssh://ubuntu@boromir/Proyectos/btrainer git clone --bare /home/luis/Dropbox/Proyectos/btrainer ssh://ubuntu@boromir/home/ubuntu/Proyectos/btrainer ===== Gestión de remotos ===== * **Muestra los remotos configurados** con sus URLs. git remote -v * **Añade un remoto llamado 'boromir'**. git remote add boromir ssh://ubuntu@boromir:/home/ubuntu/Proyectos/btrainer * **Obtiene la URL del remoto 'boromir'**. git remote get-url boromir * **Elimina el remoto 'boromir'**. git remote remove boromir ===== Sincronización con remotos ===== * **Descarga cambios del remoto 'boromir' sin fusionarlos** (dry-run primero para previsualizar). git fetch --dry-run boromir git fetch boromir * **Descarga y fusiona cambios del remoto** (pull completo). git pull * **Pull forzando la fusión** de historiales no relacionados (ej. dos repos independientes). git pull boromir master --no-rebase --allow-unrelated-histories * **Prueba de envío** (dry-run) antes de hacer push. git push --dry-run boromir master * **Envía la rama master al remoto 'boromir'**. git push boromir master * **Envía con sobreescritura forzada** (peligro: reescribe historia remota). git push boromir master --force * **Versión verbosa del push forzado** (muestra más detalles). git -v push boromir master --force git --verbose push boromir master --force * **Resetea el remoto de forma remota vía SSH** (fuerza el HEAD en el servidor sin hacer clone). ssh ubuntu@boromir "cd /home/ubuntu/Proyectos/btrainer && git reset --hard HEAD" ===== Comparaciones y diferencias ===== ==== Diferencias básicas ==== * **Muestra cambios sin stage** (working directory vs staging). git diff * **Muestra cambios concretos** en un archivo. git diff st.py git diff templates/client3_rutina.html * **Muestra diferencias en un directorio completo**. git diff templates/ ==== Diferencias entre ramas ==== * **Diferencia entre master y develop** con formato estadístico. git diff --stat develop master | less git diff --dirstat master develop | less * **Muestra solo nombres de archivos** que difieren. git diff --name-only git diff --name-only master develop | less * **Muestra nombres + estado** (A=added, M=modified, D=deleted). git diff --name-status master develop | less * **Muestra estadísticas numéricas** (líneas añadidas/eliminadas). git diff --numstat develop master | less * **Ignora cambios de espacios en blanco** (-w) y sin contexto (-U0). git diff -w master develop | less git diff -w -U0 master develop | less * **Versión resumida** (solo total de líneas cambiadas). git diff --shortstat develop master | less * **Formato raw** (máximo detalle, útil para scripts). git diff --raw master develop | less * **Diferencia entre ramas específicas** (master vs arwen-estado). git diff --stat master arwen-estado ==== Diferencias con el área de staging ==== * **Muestra archivos en staging** que están a punto de committearse. git diff --cached --stat * **Archivos nuevos** (solo los añadidos). git diff --cached --name-only --diff-filter=A * **Diferencia de un archivo específico** en staging. git diff --cached Pipfile git diff --cached st.py * **Diferencia de un binario o archivo especial** (ej. SVG). git diff --cached static/css/fonts/icomoon.svg ===== Historial y logs ===== * **Muestra el historial completo**. git log * **Muestra ayuda** del comando log. git log -h * **Log con referencias decoradas** (ramas, tags). git log --decorate * **Log de una rama específica**. git log develop * **Formato compacto** (una línea por commit) con grafo ASCII. git log --oneline --graph --all * **Combinación completa**: oneline + graph + all + decorate. git log --oneline --graph --all --decorate * **Versión con decoración y grafo** (similar al anterior pero más detallado). git log --decorate --all --graph * **Describe el commit actual** (tag más cercano + distancia + hash). git describe ===== Fusiones (merge) ===== * **Fusiona develop en la rama actual**. git merge develop * **Fusiona master en la rama actual**. git merge master ===== Resolución de conflictos ===== * **Mantiene la versión local** (ours) en conflicto. git checkout --ours st.py * **Mantiene la versión remota** (theirs) en conflicto. git checkout --theirs st.py ===== Notas importantes ===== * ''--force'' en push reescribe la historia remota. Usar con precaución en ramas compartidas. * ''git reset --hard'' en remoto vía SSH es destructivo localmente en el servidor. * ''git pull --no-rebase --allow-unrelated-histories'' es útil para unir dos repositorios independientes. * El flag ''-w'' en diff ignora cambios de espacios/blancos, ideal para limpiar ruido visual.