====== 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.