====== 01 - Control de versiones con Git ======
El **control de versiones** registra los cambios de un proyecto a lo largo del tiempo, permite volver a estados anteriores y trabajar en equipo sin sobrescribir el trabajo de los demás. **Git** es el sistema de control de versiones más usado.
===== 1. Conceptos =====
^ Concepto ^ Significado ^
| **Repositorio** | Carpeta con el historial completo de versiones del proyecto |
| **Commit** | Instantánea del proyecto en un momento dado, con su mensaje |
| **Historial** | Cadena de commits del repositorio |
| **Rama** | Línea de trabajo independiente dentro del repositorio |
| **Remoto** | Copia del repositorio en otro servidor, por ejemplo **GitHub** |
Un repositorio Git tiene tres zonas: el **directorio de trabajo** (los archivos que editas), el **staging area** (los cambios preparados) y el **historial** (los commits). Un commit registra lo que hay preparado en el staging area.
===== 2. Configuración inicial =====
git config --global user.name "Nombre"
git config --global user.email "correo@example.com"
El nombre y el correo quedan asociados a cada commit.
===== 3. Flujo básico =====
^ Comando ^ Acción ^
| ''git init'' | Crea un repositorio en la carpeta actual |
| ''git clone '' | Descarga un repositorio remoto |
| ''git status'' | Muestra el estado de los archivos |
| ''git add '' | Prepara archivos para el commit (staging) |
| ''git commit -m "mensaje"'' | Guarda una versión con su mensaje |
| ''git log --oneline'' | Muestra el historial resumido |
| ''git diff'' | Muestra los cambios sin preparar |
git init
git add .
git commit -m "Initial commit"
git status
===== 4. Ramas =====
Una **rama** permite trabajar en una funcionalidad sin afectar al código principal. La rama principal suele llamarse ''main''.
git branch feature/login # crea la rama
git switch feature/login # cambia a ella
# ... commits ...
git switch main
git merge feature/login # incorpora los cambios
@startuml
gitbranch
commit id: "A"
commit id: "B"
branch feature
commit id: "C"
commit id: "D"
merge feature
commit id: "E"
@enduml
===== 5. Conflictos =====
Un **conflicto** ocurre cuando dos ramas modifican las mismas líneas y Git no puede decidir cuál conservar. El archivo marcado muestra ambas versiones delimitadas por ''<<<<<<<'', ''======='' y ''>>>>>>>''.
<<<<<<< HEAD
Versión de la rama actual
=======
Versión de la rama que se fusiona
>>>>>>> feature/login
Resolverlo consiste en editar el archivo, dejar la versión correcta y repetir ''git add'' con ''git commit''. Fusionar con frecuencia reduce los conflictos.
===== 6. Remotos =====
git remote add origin # conecta con un remoto
git push -u origin main # publica la rama
git push # publica los últimos commits
git pull # descarga e integra los cambios del remoto
git fetch # descarga sin integrar
===== 7. GitHub =====
**GitHub** aloja repositorios y facilita la colaboración:
* **Pull request (PR):** propuesta para integrar una rama en otra, con revisión de cambios y comentarios.
* **Fork:** copia del repositorio en la cuenta de otra persona, útil para contribuir sin permisos de escritura.
===== 8. .gitignore =====
El archivo ''.gitignore'' lista patrones que Git debe ignorar: compilados, dependencias, configuración local o secretos.
target/
.idea/
*.log
application-local.properties
Nunca se versionan claves, contraseñas ni datos de acceso.
Commits pequeños y frecuentes con mensajes descriptivos mantienen un historial útil. Un mensaje de commit explica el cambio: "Add validation to registration form" es útil; "cambios" no.