Curso de Git desde Cero - Aprende Git
Introducción a Git y su Importancia
¿Qué es Git?
- Git es un sistema de control de versiones que permite registrar y rastrear cambios en proyectos, fundamental en el desarrollo de software.
- El curso está dirigido por Pedro Placencia, un desarrollador web apasionado por la enseñanza en español.
Objetivos del Curso
- Aprenderás desde cero sobre Git, incluyendo diferencias entre Git y GitHub, así como comandos esenciales para trabajar tanto individualmente como en equipo.
- Se abordarán conceptos clave como repositorios, commits, ramas y estados.
Conceptos Fundamentales de Control de Versiones
Ejemplo Práctico: Tesis
- Imagina que trabajas en una tesis; cada corrección genera una nueva versión. Sin un sistema automatizado, gestionar múltiples versiones se vuelve complicado.
- Un sistema de control de versiones centraliza las diferentes versiones para facilitar el seguimiento y la gestión.
Ventajas del Control de Versiones
- Permite ramificar y aplicar correcciones a partir de versiones anteriores antes de unirlas nuevamente.
- Facilita la consulta histórica sobre los cambios realizados a lo largo del tiempo.
Aplicación Práctica: Proyectos de Código
Organización del Trabajo
- Los sistemas como Git permiten mantener orden al trabajar solo o en equipo, organizando el trabajo mediante versiones.
- Se pueden utilizar etiquetas, ramas y mensajes para documentar cambios importantes dentro del proyecto.
Repositorio
- Un repositorio es donde se almacena el código junto con su historial de cambios. Es esencial para mantener un registro claro durante el desarrollo.
Instalación y Configuración Inicial
Instalación de Git
- Antes de crear un repositorio con Git, es necesario instalarlo. Se proporcionan enlaces para descargarlo según tu sistema operativo (macOS, Windows o Linux).
Uso del Terminal
- En Windows se recomienda usar "Git Bash", que ofrece funcionalidades adicionales para gestionar repositorios más eficientemente.
Comenzando con Repositorios Locales
Introducción a Git y su Configuración
Trabajando con Git en Entorno Local
- Se puede trabajar con Git en un entorno local sin necesidad de una cuenta, lo que se abordará antes de crear un repositorio en GitHub.
- Es recomendable familiarizarse primero con la consola y los comandos de Git antes de usar herramientas visuales como Visual Studio Code o software de gestión de repositorios.
- Al abrir Visual Studio Code, se puede seleccionar entre diferentes terminales, como PowerShell o Git Bash, dependiendo del entorno operativo.
Creación y Configuración del Proyecto
- Se crea un directorio llamado "git project" donde se generará un archivo HTML básico para iniciar el proyecto.
- Después de instalar Git, es crucial configurar la información del usuario (nombre y correo electrónico), ya que esto se utilizará como metadata para cada confirmación (commit).
Inicialización del Repositorio
- Una vez configurado el nombre y correo, se inicializa un nuevo repositorio ejecutando
git init, lo que crea un directorio oculto.gitpara el seguimiento de archivos.
- Los archivos recién creados aparecerán como "sin seguimiento", indicando que aún no están registrados en el repositorio.
Estados de los Archivos en Git
- Los archivos pueden estar en tres estados:
- Preparado (staged): Modificado y listo para la siguiente confirmación.
- Modificado: Cambios realizados respecto a la versión anterior.
- Confirmado: Cambios guardados como una nueva versión del archivo.
Añadiendo Archivos al Repositorio
Cómo gestionar archivos en Git
Recomendaciones para agregar archivos
- Se sugiere agregar cada archivo modificado individualmente al repositorio, lo que permite un mejor control sobre los cambios que se van a confirmar.
- Utilizar el comando
git statuspara verificar el estado del repositorio y los cambios realizados en los archivos.
Estado del repositorio
- Al ejecutar
git status, se indica que estamos en la rama principal (Master), donde no hay confirmaciones previas y existen cambios pendientes por confirmar.
- Los nuevos archivos son identificados como tales porque no había referencias anteriores a ellos.
Comandos básicos de Git
- Conocer dos comandos esenciales:
git addpara añadir archivos ygit statuspara ver el estado actual del repositorio.
- El comando
git commit -m "mensaje"es crucial para guardar cambios permanentemente, permitiendo describir las modificaciones realizadas.
Importancia de los mensajes de confirmación
- Es recomendable redactar mensajes de confirmación en inglés, especialmente si se trabaja en equipo, ya que facilita la trazabilidad de los cambios.
- Un mensaje claro ayuda a entender qué se ha hecho en cada confirmación, mejorando la colaboración entre desarrolladores.
Flujo de trabajo con Git
- Cada vez que se realiza un cambio, es necesario usar
git addseguido degit commitpara registrar esos cambios en el historial del proyecto.
- Visual Studio Code proporciona indicaciones sobre qué bloques de código han sido modificados respecto a versiones anteriores.
Manejo de cambios y restauración
- Si es necesario descartar cambios, se puede utilizar el comando
git restore.
- Confirmar nuevos cambios implica repetir el proceso con
git addy luego realizar un nuevo commit.
Identificación y comparación de commits
- Cada commit genera un hash único que permite identificarlo fácilmente y volver a versiones anteriores si es necesario.
¿Cómo gestionar el historial de commits en Git?
Visualización del historial de commits
- Se utiliza el comando
git logpara mostrar un registro del historial de commits en el repositorio, permitiendo ver los cambios realizados.
- El log incluye información sobre el autor del commit, su correo electrónico y la fecha en que se realizó cada cambio.
- Para una visualización más compacta, se puede usar
git log --oneline, que muestra un resumen con el hash y mensaje de cada commit.
- El último commit indica la posición actual en la rama Master y permite identificar fácilmente los cambios recientes.
Navegación entre versiones
- El comando
git checkoutpermite moverse entre diferentes estados del repositorio utilizando hashes de commits específicos.
- Es recomendable crear ramas adicionales para facilitar el trabajo en paralelo sin afectar la rama principal (Master).
- Al hacer un checkout a un commit anterior, se pueden realizar cambios experimentales sin alterar la versión estable actual.
Uso de etiquetas (tags)
- Utilizar hashes para volver a versiones anteriores no es práctico; por ello, se recomienda crear etiquetas con
git tagpara marcar versiones estables.
- Las etiquetas permiten regresar fácilmente a una versión específica sin necesidad de recordar o buscar hashes complicados.
- Al confirmar cambios posteriores, se puede utilizar
git checkout v1para volver al estado guardado bajo esa etiqueta.
Gestión y eliminación de etiquetas
- Para eliminar una etiqueta, se usa
git tag -d v1, lo cual elimina la referencia a esa versión específica del código.
Comparación entre commits
Diferencias entre versiones en Git
Comparación de commits
- Se explica cómo ver la diferencia entre dos commits específicos, utilizando etiquetas para identificar las versiones.
- La comparación revela que un commit tiene solo el cuerpo del mensaje, mientras que el otro incluye una sección adicional.
Manejo de errores en Git
- Se discute qué hacer si se comete un error al realizar cambios. Una opción es borrar manualmente las líneas modificadas.
- Si se desea deshacer cambios más grandes, se puede utilizar
git restorepara descartar modificaciones no confirmadas.
Deshaciendo cambios y confirmaciones
Deshacer adiciones y cambios
- Si un archivo ya ha sido añadido a la próxima confirmación, se puede usar
git restore --stagedpara deshacer esa acción.
- Para revertir tanto el cambio como la adición, se utiliza
git reset, apuntando a la rama actual (Master).
Revertir confirmaciones
- Cuando se necesita deshacer una confirmación ya realizada, se usa el comando
revert, que permite abrir un editor para modificar el mensaje de reversión.
- Al ejecutar
git revert HEAD, se revierte el último commit sin necesidad de editar el mensaje.
Ajustes en commits existentes
Agregar cambios a un commit anterior
- Si olvidaste agregar algo a un commit previo, puedes hacerlo usando
git addseguido degit commit --amend, lo cual modifica el último commit sin crear uno nuevo.
Trabajo con ramas en Git
Creación y gestión de ramas
- Se introduce la importancia de trabajar con ramas en Git. La rama Master suele ser utilizada para producción.
Introducción a la Gestión de Ramas en Git
Estructura de Ramas en un Proyecto
- En un entorno de trabajo colaborativo, se utilizan al menos dos ramas principales: Master y Develop. La rama Develop contiene la versión en desarrollo de la aplicación, lista para pruebas.
- Una vez que los cambios en Develop son probados, se realiza un merge hacia Master, lo que permite publicar la nueva versión en producción.
Creación y Uso de Nuevas Ramas
- Al agregar nuevas características o corregir errores (bug fixes), es recomendable crear una nueva rama basada en Develop, asegurando que el código base permanezca estable.
- Para crear una nueva rama, se utiliza el comando
git checkout -b nombre_de_la_rama, permitiendo trabajar sin afectar las ramas principales.
Confirmación de Cambios
- Los cambios realizados en una rama específica no afectan a otras ramas hasta que se realice un merge. Esto permite a cada miembro del equipo trabajar independientemente.
Manejo de Cambios Incompletos con Git Stash
Escenario Común: Ayuda a Compañeros
- Es común encontrarse con cambios incompletos cuando un compañero necesita ayuda. En este caso, es útil cambiar de rama sin perder los cambios actuales.
- El comando
git stashguarda temporalmente los cambios no confirmados, permitiendo moverse entre ramas sin perder trabajo.
Limitaciones y Opciones del Stash
- Por defecto,
git stashsolo guarda archivos modificados que ya tienen seguimiento. Archivos nuevos deben ser añadidos manualmente usandogit stash -u.
- Para aplicar los cambios guardados después de ayudar a un compañero, se puede usar
git stash pop, que aplica y elimina el stash correspondiente.
Aplicar Cambios Sin Eliminar del Stash
- Si se desea aplicar cambios sin eliminarlos del stash, se utiliza
git stash apply. Esto permite mantener el contenido almacenado para uso futuro.
Gestión Avanzada del Stash
Creación de Ramas desde el Stash
- Se puede crear una nueva rama directamente desde un stash utilizando el comando
git stash branch nombre_de_la_rama, facilitando la continuación del trabajo desde donde quedó.
Limpieza del Stash
Comandos Útiles en Git para el Trabajo en Equipo
Eliminación de Confirmaciones y Uso de Cherry Pick
- Se menciona la importancia de eliminar confirmaciones innecesarias utilizando
stash clear, lo que permite tener un código limpio antes de realizar nuevos commits.
- El comando
cherry-pickes útil para traer cambios específicos de otra rama, como un footer que se necesita en una rama de características.
- Para llevar un commit específico a una rama, se debe usar el hash del commit deseado, facilitando la sincronización entre desarrolladores.
Mezcla de Ramas y Buenas Prácticas
- Una vez que se ha terminado un feature, es crucial asegurarse de que todo esté confirmado antes de mezclarlo con la rama
develop.
- Se utiliza el comando
git mergepara integrar los cambios del feature endevelop, actualizando así el código base.
- Es recomendable eliminar ramas que ya no se utilizan después de ser mezcladas para mantener el repositorio limpio y organizado.
Manejo de Conflictos al Hacer Merge
- Los conflictos son comunes cuando varios desarrolladores trabajan en las mismas partes del código; resolverlos requiere calma y atención.
- Al intentar hacer un merge, si hay cambios conflictivos, Git intentará realizar una mezcla automática primero.
¿Cómo resolver conflictos en Git?
Identificación de Conflictos
- Cuando se editan los mismos bloques de código, Git señala un conflicto y ofrece opciones para resolverlo. La consola indica que hay un conflicto en el contenido del archivo
index.html, lo que significa que la mezcla automática ha fallado.
Proceso de Resolución
- Al revisar el código, Git añade señalizaciones para indicar dónde están los conflictos. Pueden existir múltiples conflictos en un solo archivo o en varios archivos diferentes.
- El estado de "merging" indica que estamos en medio del proceso de mezcla, pero este está detenido debido a un conflicto. Se muestra el cambio actual (en
develop) y el cambio entrante (defeature My awesome feature).
Opciones para Resolver Conflictos
- Visual Studio proporciona ayudas visuales para aceptar cambios: se puede optar por el cambio actual (
current change), el cambio entrante (incoming change), aceptar ambos o comparar las diferencias.
- Si no se entiende qué bloque debe permanecer, es recomendable consultar con el compañero de equipo responsable del otro bloque antes de decidir cuál conservar.
Confirmación y Finalización
- En este caso, se decide reemplazar el texto de prueba por el texto nuevo y confirmar los cambios usando
git commit. Esto limpia y ordena todo después de resolver el conflicto.
- Es importante recordar que los conflictos pueden estar presentes en varios archivos o tener múltiples instancias dentro del mismo archivo. Se deben revisar uno a uno y aplicar soluciones coherentes según el contexto del proyecto.
Subida a Repositorio Remoto
- Para alojar un repositorio en plataformas como GitHub, primero se crea un nuevo repositorio desde la cuenta personal. Luego, se añaden instrucciones específicas dependiendo si es un proyecto nuevo o existente.
- Para asociar un proyecto al repositorio creado, se utiliza
git remote addseguido del alias deseado (por ejemplo,origin) y la URL del repositorio.
Comandos Clave para Sincronización
- Una vez configurado todo, se puede usar
git push origin developpara subir la ramadevelopal repositorio remoto. Esto crea la rama correspondiente allí y sube todos los cambios realizados localmente.
Introducción a la Sincronización de Repositorios Remotos
¿Qué es el comando fetch?
- El comando
fetchpermite traer toda la metadata del repositorio remoto a tu repositorio local, sincronizando todas las ramas sin aplicar cambios. Esto facilita la navegación entre las ramas existentes en el repositorio remoto.
Importancia del commit y push
- Cada cambio realizado en el repositorio local permanece allí hasta que se ejecuta un
push. Es crucial entender que los cambios no se reflejan en el repositorio remoto hasta que se realiza esta acción.
- Si se elimina un archivo (por ejemplo,
index.js), este cambio debe ser confirmado mediante uncommit, ya que cualquier modificación en la estructura del repositorio es considerada un cambio.
Archivos útiles en Git
Archivo README.md
- El archivo
README.mdsirve como documentación para el proyecto. Se puede crear directamente al iniciar un nuevo repositorio y permite agregar una descripción clara del mismo.
- Al subir este archivo al repositorio remoto, proporciona información esencial sobre el proyecto a otros usuarios interesados.
Archivo .gitignore
- El archivo
.gitignorees oculto y se utiliza para listar archivos o directorios que no deben subirse al repositorio remoto, como por ejemplo, el directorionode_modules.
- Este archivo ayuda a evitar subir dependencias pesadas innecesarias, ya que estas pueden ser instaladas localmente usando el archivo
package.json.
Clonación de Repositorios
- Para trabajar con un repositorio existente en línea, puedes clonar su URL utilizando comandos como
git clone. Esto crea un directorio local con todo el código de la rama principal.
Buenas Prácticas en la Gestión de Repositorios con Git
Flujo de Trabajo Gitflow
- Se recomienda utilizar el flujo de trabajo Gitflow, que se adapta bien a la gestión de repositorios. Este método implica tener al menos dos ramas principales: develop y master.
- Además, se pueden crear ramas para features, hotfixes y versiones de release, permitiendo una organización clara del desarrollo.
Herramienta Útil para Gitflow
- Existe una librería que define alias para realizar diversas tareas en Gitflow, como inicializar el flujo y crear ramas para features. Esto facilita la mezcla de cambios hasta llevarlos a master o develop.
Mensajes de Commits
- Se sugiere seguir el estándar de conventional commits para los mensajes, aunque puede ser simplificado según el contexto. Cada commit debe comenzar con un prefijo que indique su tipo (ejemplo:
feat:para nuevas características).
- Utilizar este formato proporciona más contexto sobre las modificaciones realizadas en el repositorio, lo cual es útil tanto para desarrolladores como para revisiones futuras.
Recursos Adicionales
- Se proporcionan enlaces útiles en la descripción del video, incluyendo una guía simplificada sobre comandos básicos utilizados en Git, ideal para repasar lo aprendido.
Conclusión del Tutorial