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