Git y Github
Clase 3 — Introducción a Git y Github
¿Por qué control de versiones?
El control de versiones resuelve dos problemas fundamentales del desarrollo de software.
Historial completo
Cada cambio queda registrado. Puedes volver a cualquier versión anterior en cualquier momento.
Colaboración sin caos
Múltiples personas pueden trabajar en el mismo proyecto simultáneamente sin pisarse.
¿Qué es Git?
Git fue creado en 2005 por Linus Torvalds (el creador de Linux). Es el sistema de control de versiones más usado del mundo.
95%+
de equipos usan Git
Requisito
en toda oferta laboral
Ramas
para experimentar
Base
de Github, GitLab, Bitbucket
Distribuido vs Centralizado
Git es distribuido: cada desarrollador tiene el historial completo en su máquina. Sistemas antiguos como SVN o CVS eran centralizados: si el servidor se caía, nadie podía trabajar.
Centralizado (SVN, CVS)
- ❌ Un solo repositorio en un servidor
- ❌ Si el servidor cae, nadie puede trabajar
- ❌ Operaciones lentas (cada commit viaja a la red)
- ❌ Historial solo accesible online
Distribuido (Git)
- ✅ Cada copia local es un repositorio completo
- ✅ Puedes trabajar sin conexión
- ✅ Operaciones locales — instantáneas
- ✅ Historial disponible siempre
git log sin internet.Sin Git vs Con Git
Sin control de versiones
- ❌ proyecto_final.zip
- ❌ proyecto_final_v2.zip
- ❌ proyecto_final_DEFINITIVO.zip
- ❌ proyecto_final_DEFINITIVO_v2_REAL.zip
- ❌ "¿Quién borró mi código?"
Con Git
- ✅ Historial completo de cambios
- ✅ Cada cambio tiene autor y fecha
- ✅ Puedes volver a cualquier versión
- ✅ Ramas para experimentar sin riesgo
- ✅ Colaboración organizada
📚Material complementario▾
Conceptos fundamentales
Repositorio
Tu proyecto con historial
Commit
"Foto" del proyecto
Branch
Línea de desarrollo
Merge
Fusionar cambios
Las tres áreas de Git
Git organiza tu trabajo en tres áreas. Los archivos fluyen de izquierda a derecha.
Directorio de trabajo
Tus archivos en disco
Donde editas código
Staging Area
Preparados para commit
git add
Repositorio
Historial guardado
git commit
git add archivo.txt Directorio → Staging Areagit commit -m "Descripción" Staging Area → RepositorioAnatomía de un Commit
Cada commit es una "foto" del estado del proyecto en un momento dado, con un mensaje descriptivo.
commit a1b2c3dAuthor: Ana García <ana@email.com>Date: Mon Apr 7 10:30:00 2026 Agrega formulario de contacto"Agrega formulario de contacto" ← Último"Implementa menú de navegación""Primera versión del sitio" ← Primerogit commit avanza el puntero de la rama al nuevo nodo del árbol
Antes de git commit
Después de git commit
HEAD: el puntero que te sitúa
HEAD es un puntero especial que indica en qué commit estás ahora mismo. Normalmente apunta al último commit de tu rama actual. Cuando haces checkout, HEAD se mueve.
Notación práctica
HEAD— commit actualHEAD~1— el commit anteriorHEAD~3— 3 commits atrásHEAD^— el padre (como HEAD~1)
Usos comunes
git diff HEAD~1 # diff con commit anteriorgit reset --soft HEAD~1 # deshacer último commitgit checkout HEAD~3 # viajar 3 commits atrásgit switch -c nombre si quieres conservar cambios.Ramas y Merge
Una rama es un puntero a un commit del árbol. Crear una rama no copia archivos: solo añade otro puntero al mismo nodo. Merge une dos ramas creando un commit con dos padres.
git branch feature — se añade un puntero, el árbol no cambia
Antes — git checkout -b feature
Después — rama creada en el mismo commit
git merge feature — nodo M con 2 padres (C y E)
Antes de git merge feature
Después — merge commit M con 2 padres
📚Material complementario▾
- InteractivoVisualizing Git (interactivo)
- InteractivoLearn Git Branching (interactivo)
- VideoGit Branching explicado
Comandos esenciales
Estos son los comandos que usarás todos los días como desarrollador.
Configuración
Flujo diario
Inspección
Ramas
Inicializar y configurar
Configurar identidad
git config --global user.name "Tu Nombre"git config --global user.email "tu@email.com"Solo se hace una vez por computadora
Crear o clonar un repositorio
# Crear nuevo repositoriogit init# Clonar uno existentegit clone https://github.com/user/repo.gitEl flujo básico
Estos 4 comandos son el pan de cada día de todo desarrollador.
git status # Ver estado de archivosgit add archivo.txt # Agregar un archivo al staginggit add . # Agregar todogit commit -m "Descripción del cambio" # Crear commitgit push # Subir a GithubVer historial y diferencias
Ver historial
git log # Historial completogit log --oneline # Historial compactogit diff archivo.txt # Ver cambios sin commitear.gitignore
# Archivo .gitignorenode_modules/.env*.exe.DS_StoreArchivos que Git debe ignorar (contraseñas, dependencias, binarios)
node_modules/). Solución: crear un .gitignore antes del primer commit.Trabajar con ramas
Crear y cambiar de rama
git branch # Ver ramasgit checkout -b mi-rama # Crear y cambiar a ramagit checkout main # Volver a mainFusionar y sincronizar
git merge mi-rama # Fusionar rama en la actualgit branch -d mi-rama # Eliminar rama fusionadagit pull # Descargar cambios remotosgit reset --hard HEAD~1 — el puntero retrocede, el commit queda "huérfano"
Antes — main en C
Después de git reset --hard HEAD~1
📚Material complementario▾
Buenos mensajes de commit
Un buen mensaje le ahorra horas a tu yo del futuro. El estándar más usado es Conventional Commits.
Formato recomendado
tipo(ámbito): descripción# Ejemplosfeat(auth): agrega login con Googlefix(api): corrige timeout en /usersdocs: actualiza READMErefactor: extrae lógica a helperTipos más usados
feat — nueva funcionalidad
fix — corrige un bug
docs — solo documentación
style — formato, no código
refactor — cambia código sin alterar comportamiento
test — añade o modifica tests
chore — mantenimiento, config
Malos ejemplos
- ❌ "cambios"
- ❌ "arreglado"
- ❌ "asdasd"
- ❌ "update stuff"
Buenos ejemplos
- ✅ "feat(carrito): permite aplicar cupones"
- ✅ "fix: corrige división por cero en IVA"
- ✅ "docs: explica cómo clonar el repo"
- ✅ "refactor(api): extrae validación a middleware"
Deshacer cambios sin miedo
Git te permite volver atrás. Cada comando tiene un alcance distinto: elige según dónde esté el cambio que quieres deshacer.
git restore
Descarta cambios en tus archivos (directorio de trabajo).
git restore archivo.txt # vuelve a la última versión commiteadagit stash
Guarda cambios a medias sin commitear. Útil al cambiar de rama rápido.
git stashgit checkout maingit stash popgit reset
Mueve HEAD hacia atrás. Reescribe historial, úsalo solo en ramas locales.
git reset --soft HEAD~1 # deshacer último commit, conservar cambiosgit reset --hard HEAD~1 # destructivo: borra los cambiosgit revert
Crea un nuevo commit que deshace otro. Seguro en ramas compartidas.
git revert a1b2c3d # historial intacto, cambios revertidosreset reescribe historial — nunca lo uses en commits ya publicados. Para commits compartidos, usa revert.Git en vivo: prueba los comandos sobre el árbol
Cada botón ejecuta un comando real de Git y verás cómo muta el árbol: commits, ramas y HEAD. Empieza con main y dos commits; improvisa desde ahí.
Acciones sobre HEAD
Crear rama
Moverse entre ramas
Mergear rama → main
git init → Repositorio inicializadogit commit (A) → Primer commit en maingit commit (B) → Segundo commit en mainTip: crea una rama feature, haz un par de commits, vuelve a main y ejecuta git merge feature. Observa cómo aparece el commit con dos padres.
Github: Colaboración en la Nube
Github es la plataforma donde vive tu código en la nube. Es tu repositorio remoto, tu portafolio y tu herramienta de colaboración.
Hosting remoto
Tu código en la nube
Colaboración
Trabajo en equipo
Portafolio
Tu carta de presentación
CI/CD
Automatización
Crear y conectar un repositorio
Crear en Github
- 1. Ve a github.com y haz login
- 2. Click en "New repository"
- 3. Elige nombre y descripción
- 4. Público o privado
- 5. NO inicialices con README si ya tienes código local
Conectar repo local
# Conectar con Githubgit remote add origin \ https://github.com/tu-user/tu-repo.git# Renombrar rama a maingit branch -M main# Subir por primera vezgit push -u origin mainFork vs Clone y tu portafolio
Fork
Copia de un repositorio en tu cuenta de Github. Útil para contribuir a proyectos de otros.
Clone
Descarga un repositorio a tu computadora local.git clone URL
Github como portafolio profesional
- ⭐ Haz commits regularmente
- ⭐ Escribe buenos READMEs
- ⭐ Contribuye a proyectos open source
- ⭐ Usa un nombre de usuario profesional
📚Material complementario▾
- DocsGithub Docs - Inicio rápido
- ArtículoCómo hacer un buen README
- InteractivoGithub Profile README Generator
SSH keys: autenticación segura
Github ya no acepta contraseñas por HTTPS para push. Tienes dos opciones modernas: SSH keys (recomendado) o Personal Access Tokens.
1. Generar llave SSH
ssh-keygen -t ed25519 -C "tu@email.com" # Enter para aceptar ubicación # Pon una passphrase (opcional)# Copia la llave públicacat ~/.ssh/id_ed25519.pub2. Añadirla en Github
- 1. Settings → SSH and GPG keys
- 2. “New SSH key”
- 3. Pega tu
id_ed25519.pub - 4. Verifica con
ssh -T git@github.com
# Ahora puedes clonar con SSHgit clone git@github.com:usuario/repo.git # ¡sin contraseña cada push!id_ed25519 (sin .pub) es privada. Nunca la compartas, nunca la subas a un repo.Más allá del código
Github no es solo almacenamiento. Es una plataforma completa de gestión de producto y automatización.
Issues
Tickets para reportar bugs, pedir features o discutir ideas. Cada issue tiene número (#42).
- • Labels (bug, enhancement...)
- • Asignación a personas
- • Se enlazan con PRs con
Closes #42
Projects
Tableros tipo Kanban / Sprint para organizar issues y PRs.
- • Vista tabla, board o roadmap
- • Filtros por estado, prioridad
- • Métricas automáticas
Actions
CI/CD integrado. Corre tests, lint, deploy automáticamente en cada push.
- • Workflows en YAML
- • Miles de actions prefabricadas
- • Gratis para repos públicos
# .github/workflows/tests.ymlon: [push, pull_request]jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm ci && npm testCada vez que alguien haga git push o abra un PR, Github ejecutará tus tests automáticamente.
Pull Requests
Un Pull Request (PR) es la forma profesional de proponer cambios. Pides que alguien revise tu código antes de integrarlo.
1. Crear rama
2. Hacer cambios
3. Push
4. Abrir PR
5. Revisión
6. Merge
Github Flow
El flujo de trabajo más simple y popular para equipos.
# 1. Crear ramagit checkout -b feature/agregar-login# 2. Hacer cambios y commitsgit add .git commit -m "Implementa formulario de login"# 3. Subir la ramagit push -u origin feature/agregar-login# 4. Crear PR en Github → revisión → mergeGithub Flow: feature → Pull Request → main
main siempre desplegable. La rama feature evoluciona, se abre un PR, y al hacer merge se crea un commit con dos padres en main.
Conflictos de merge
Un conflicto ocurre cuando dos ramas modifican la misma línea de un mismo archivo. Git no sabe cuál es la versión correcta y te pide que decidas.
git merge featureCONFLICT (content): Merge conflict in app.jsAutomatic merge failed; fix conflicts and commit.Así se ve el archivo en conflicto
function saludo() {<<<<<<< HEAD return "Hola";======= return "Hello";>>>>>>> feature}Pasos para resolverlo
- 1. Abre el archivo marcado
- 2. Decide qué versión conservar (o combinarlas)
- 3. Borra los marcadores
<<<,===,>>> - 4.
git add archivo - 5.
git commit(mensaje autogenerado)
git pull frecuentemente, mantén ramas cortas y con cambios enfocados. Si te atascas: git merge --abort cancela todo y vuelve al estado anterior.Workflows: elige el adecuado
No hay un único “Git correcto”. Cada equipo adopta un flujo de trabajo según su tamaño, producto y frecuencia de release.
Github Flow
Simple. main + ramas feature. PR y merge.
- ✅ Fácil de aprender
- ✅ Perfect para web apps con deploy continuo
Ideal para: equipos pequeños, SaaS, despliegue continuo
GitFlow
Complejo. main, develop, release/*, hotfix/*.
- ⚠ Muchos pasos y ramas
- ✅ Versionado estricto
Ideal para: software con releases versionados (apps móviles, desktop)
Trunk-based
Todos mergean directo a main con feature flags.
- ✅ Integra cambios constantemente
- ⚠ Requiere buena cobertura de tests
Ideal para: equipos grandes con CI/CD maduro (Google, Netflix)
Buenas prácticas en PRs
Al crear un PR
- ✅ Título claro y descriptivo
- ✅ Descripción de qué cambia y por qué
- ✅ Cambios pequeños y enfocados
- ✅ Un PR por funcionalidad
Al revisar un PR
- 🔎 ¿El código es legible?
- 🔎 ¿Hay errores lógicos?
- 🔎 ¿Sigue las convenciones del proyecto?
- 🔎 Sé constructivo en los comentarios
📚Material complementario▾
Resumen de la Clase 3
| Concepto | Definición |
|---|---|
| Git | Sistema de control de versiones distribuido |
| Repositorio | Carpeta de proyecto con historial de cambios |
| Commit | "Foto" del estado del proyecto en un momento dado |
| Branch | Línea independiente de desarrollo |
| Merge | Fusión de los cambios de una rama en otra |
| Push / Pull | Subir / descargar cambios del repositorio remoto |
| Fork | Copia de un repositorio en tu cuenta de Github |
| Pull Request | Solicitud de revisión de código antes de hacer merge |
| .gitignore | Archivo que indica qué archivos Git debe ignorar |
| HEAD | Puntero al commit actual en el que estás trabajando |
| Stash | Guardar cambios a medias sin hacer commit |
| Revert | Crear un commit que deshace otro (seguro en ramas compartidas) |
| Conflicto | Cambios incompatibles en la misma línea que requieren decisión manual |
| SSH key | Llave criptográfica para autenticarse con Github sin contraseña |
| Conventional Commits | Estándar de mensajes: tipo(ámbito): descripción |
| Github Actions | CI/CD integrado para correr tests, lint y deploy automáticos |
Ejercicio 3.1: Tu primer repositorio
Crea tu primer repositorio Git desde cero. Sigue estos pasos en tu terminal.
# 1. Crear carpeta del proyectomkdir mi-primer-repocd mi-primer-repo# 2. Inicializar Gitgit init# 3. Crear README.mdecho "# Mi Primer Repositorio" > README.md# 4. Agregar y hacer commitgit statusgit add README.mdgit commit -m "Primer commit: agrega README"# 5. Verificargit logEjercicio 3.2: Práctica de commits
Practica el flujo de trabajo básico: crear archivos, modificarlos, ver diferencias y hacer commits.
# 1. Crear un archivoecho "Mis notas del curso" > notas.txtgit add notas.txtgit commit -m "Agrega notas del curso"# 2. Modificar el archivoecho "Clase 3: Git y Github" >> notas.txt# 3. Ver los cambiosgit diff notas.txt# 4. Commit y verificargit add notas.txtgit commit -m "Agrega notas de clase 3"git log --onelineEjercicio 3.3: Trabajando con ramas
Crea una rama, haz cambios, y luego fusiona. Observa cómo los archivos aparecen y desaparecen al cambiar de rama.
# 1. Crear y cambiar a nueva ramagit checkout -b feature/nuevo-contenido# 2. Crear archivo y hacer commitecho "Contenido nuevo" > contenido.txtgit add contenido.txtgit commit -m "Agrega contenido.txt"# 3. Volver a main — ¡el archivo desaparece!git checkout mainls # contenido.txt NO aparece# 4. Merge — ¡ahora sí aparece!git merge feature/nuevo-contenidols # contenido.txt SÍ aparecegit branch -d feature/nuevo-contenidoEjercicio 3.4: Subir a Github
Conecta tu repositorio local con Github y sube tu código a la nube.
Pasos en Github
- 1. Crea un repositorio nuevo (vacío)
- 2. NO marques "Initialize with README"
- 3. Copia la URL del repositorio
En tu terminal
git remote add origin URLgit branch -M maingit push -u origin main# Hacer un cambio y verificarecho "update" >> README.mdgit add . && git commit -m "update"git pushEjercicio 3.5: Simular un Pull Request
Simula el flujo completo de trabajo en equipo: rama, cambios, push y Pull Request.
# 1. Crear ramagit checkout -b feature/mi-cambio# 2. Hacer cambios significativosecho "Nueva sección" > seccion.mdgit add . && git commit -m "Agrega sección"# 3. Push de la ramagit push -u origin feature/mi-cambio# 4. En Github: crear PR con descripción# 5. Revisar en "Files changed"# 6. Mergear el PR desde Github# 7. Actualizar localgit checkout maingit pullEjercicio 3.6: Buenos vs malos commits
Clasifica cada mensaje de commit. Un buen commit es claro, específico y sigue una convención.
git commit -m "feat(auth): agrega login con Google OAuth"/ 8 correctas
Ejercicio 3.7: Resuelve un conflicto de merge
Un conflicto real. Elige cómo resolverlo y ve las consecuencias de cada decisión.
Estás haciendo git merge feature/header y Git se detiene: CONFLICT en Header.tsx. Abres el archivo y ves esto:
export function Header() { return (<<<<<<< HEAD <h1>Mi Portafolio</h1>======= <h1>Ana García — Dev</h1>>>>>>>> feature/header )}¿Con qué versión te quedas?
Resultado
Eliges HEAD. Borras las líneas 5 a 7 y la línea 3. El archivo queda con <h1>Mi Portafolio</h1>. Los cambios de la rama feature/header se pierden en este archivo.
Eliges feature. Borras las líneas 3 a 5 y la línea 7. El archivo queda con <h1>Ana García — Dev</h1>. Los cambios de main se sobrescriben.
Combinas ambas. Editas manualmente para que quede, por ejemplo:<h1>Ana García — Mi Portafolio</h1>. Esto suele ser la mejor opción cuando los cambios no son excluyentes.
git add Header.tsxgit commit -m "resuelve conflicto en Header.tsx"Tip: siempre borra los marcadores <<<<<<<,======= y >>>>>>> antes de hacergit add.
Proyecto: Portafolio en Github
Crea un repositorio de portafolio personal en Github que muestre quién eres y tus proyectos.
Requisitos
- • Repositorio público en Github
- • README.md con tu presentación
- • Lista de proyectos (reales o planeados)
- • Al menos 5 commits descriptivos
- • Un archivo .gitignore
Conceptos que usarás
- • git init, add, commit, push
- • Ramas (branch, checkout, merge)
- • Pull Request en Github
- • .gitignore
- • Markdown para README
Estructura sugerida del README
# Tu NombreBreve descripción sobre ti.## Sobre mí- Estudiante de desarrollo de software- Interesado en: web, IA, mobile...## Proyectos| Proyecto | Descripción | Tecnologías ||----------|-------------|-------------|| Mi App | App de notas| TypeScript |## Contacto- Email: tu@email.com- LinkedIn: linkedin.com/in/tu-perfilBonus y criterios
Bonus
- ⭐ Crear un profile README (repo con tu username)
- ⭐ Usar ramas para cada sección del portafolio
- ⭐ Agregar imágenes o badges al README
- ⭐ Contribuir a un repositorio open source
Criterios de evaluación
- ☑ Repositorio público accesible en Github
- ☑ README con contenido relevante
- ☑ Historial de commits limpio (5+ commits)
- ☑ Al menos un Pull Request creado y mergeado
- ☑ .gitignore presente
Commit temprano, commit seguro
Git no es solo una herramienta: es tu red de seguridad. Cada commit es un punto al que puedes volver. Practica todos los días.