Fragua Tech

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.

Analogía: Git es como un "deshacer" (Ctrl+Z) con superpoderes. Puedes ver TODO el historial de cambios, quién los hizo, cuándo y por qué. Además puedes crear "universos paralelos" (ramas) donde experimentar sin afectar la versión principal.

¿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
Dato: Cuando clonas un repositorio de 10 años con 10.000 commits, te llevas los 10.000 commits. Por eso puedes ver el 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 Area
git commit -m "Descripción"
  Staging Area → Repositorio

Anatomía de un Commit

Cada commit es una "foto" del estado del proyecto en un momento dado, con un mensaje descriptivo.

commit a1b2c3d
Author: 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"          ← Primero

git commit avanza el puntero de la rama al nuevo nodo del árbol

Antes de git commit

ABHEAD → main

Después de git commit

ABCHEAD → main

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 actual
  • HEAD~1 — el commit anterior
  • HEAD~3 — 3 commits atrás
  • HEAD^ — el padre (como HEAD~1)

Usos comunes

git diff HEAD~1
  # diff con commit anterior
git reset --soft HEAD~1
  # deshacer último commit
git checkout HEAD~3
  # viajar 3 commits atrás
Detached HEAD: si HEAD apunta a un commit directamente (no a una rama), estás en estado “detached”. Es normal al explorar versiones antiguas; crea una rama con git 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

ABCHEAD → main

Después — rama creada en el mismo commit

ABCmainHEAD → feature

git merge feature — nodo M con 2 padres (C y E)

Antes de git merge feature

ABCDEHEAD → mainfeature

Después — merge commit M con 2 padres

ABCDEMHEAD → mainfeature
Material complementario

Comandos esenciales

Estos son los comandos que usarás todos los días como desarrollador.

Configuración

configinitclone

Flujo diario

statusaddcommitpush

Inspección

logdiff.gitignore

Ramas

branchcheckoutmergepull
Configuración

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 repositorio
git init
# Clonar uno existente
git clone https://github.com/user/repo.git
Flujo diario

El flujo básico

Estos 4 comandos son el pan de cada día de todo desarrollador.

git status
  # Ver estado de archivos
git add archivo.txt
  # Agregar un archivo al staging
git add .
  # Agregar todo
git commit -m "Descripción del cambio"
  # Crear commit
git push
  # Subir a Github
Directorio→ git add →Staging→ git commit →Repo local→ git push →Github
Inspección

Ver historial y diferencias

Ver historial

git log
  # Historial completo
git log --oneline
  # Historial compacto
git diff archivo.txt
  # Ver cambios sin commitear

.gitignore

# Archivo .gitignore
node_modules/
.env
*.exe
.DS_Store

Archivos que Git debe ignorar (contraseñas, dependencias, binarios)

Error común: Hacer commit de archivos que no deberían estar en el repo (contraseñas, node_modules/). Solución: crear un .gitignore antes del primer commit.
Ramas

Trabajar con ramas

Crear y cambiar de rama

git branch
  # Ver ramas
git checkout -b mi-rama
  # Crear y cambiar a rama
git checkout main
  # Volver a main

Fusionar y sincronizar

git merge mi-rama
  # Fusionar rama en la actual
git branch -d mi-rama
  # Eliminar rama fusionada
git pull
  # Descargar cambios remotos

git reset --hard HEAD~1 — el puntero retrocede, el commit queda "huérfano"

Antes — main en C

ABCHEAD → main

Después de git reset --hard HEAD~1

ABCHEAD → main
Material complementario
Profesional

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
# Ejemplos
feat(auth): agrega login con Google
fix(api): corrige timeout en /users
docs: actualiza README
refactor: extrae lógica a helper

Tipos 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"
Máquina del tiempo

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 commiteada

git stash

Guarda cambios a medias sin commitear. Útil al cambiar de rama rápido.

git stash
git checkout main
git stash pop

git reset

Mueve HEAD hacia atrás. Reescribe historial, úsalo solo en ramas locales.

git reset --soft HEAD~1
  # deshacer último commit, conservar cambios
git reset --hard HEAD~1
  # destructivo: borra los cambios

git revert

Crea un nuevo commit que deshace otro. Seguro en ramas compartidas.

git revert a1b2c3d
  # historial intacto, cambios revertidos
Regla de oro: reset reescribe historial — nunca lo uses en commits ya publicados. Para commits compartidos, usa revert.
Playground

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

HEAD → mainÚltimo commit: BRamas: 1Commits: 2
ABHEAD → main

Acciones sobre HEAD

Crear rama

Moverse entre ramas

Mergear rama → main

git init → Repositorio inicializado
git commit (A) → Primer commit en main
git commit (B) → Segundo commit en main

Tip: 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. 1. Ve a github.com y haz login
  2. 2. Click en "New repository"
  3. 3. Elige nombre y descripción
  4. 4. Público o privado
  5. 5. NO inicialices con README si ya tienes código local

Conectar repo local

# Conectar con Github
git remote add origin \
  https://github.com/tu-user/tu-repo.git
# Renombrar rama a main
git branch -M main
# Subir por primera vez
git push -u origin main

Fork 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

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ública
cat ~/.ssh/id_ed25519.pub

2. Añadirla en Github

  1. 1. Settings → SSH and GPG keys
  2. 2. “New SSH key”
  3. 3. Pega tu id_ed25519.pub
  4. 4. Verifica con ssh -T git@github.com
# Ahora puedes clonar con SSH
git clone git@github.com:usuario/repo.git
  # ¡sin contraseña cada push!
Importante: la llave 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.yml
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci && npm test

Cada 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 rama
git checkout -b feature/agregar-login
# 2. Hacer cambios y commits
git add .
git commit -m "Implementa formulario de login"
# 3. Subir la rama
git push -u origin feature/agregar-login
# 4. Crear PR en Github → revisión → merge

Github Flow: feature → Pull Request → main

ABDEFPRMmainfeature/loginHEAD → 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 feature
CONFLICT (content): Merge conflict in app.js
Automatic 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. 1. Abre el archivo marcado
  2. 2. Decide qué versión conservar (o combinarlas)
  3. 3. Borra los marcadores <<<, ===, >>>
  4. 4. git add archivo
  5. 5. git commit (mensaje autogenerado)
Evitarlos: haz 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)

Empieza con Github Flow. Es el 90% de los casos. Adopta algo más complejo solo cuando tu producto lo exija.

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

ConceptoDefinición
GitSistema de control de versiones distribuido
RepositorioCarpeta de proyecto con historial de cambios
Commit"Foto" del estado del proyecto en un momento dado
BranchLínea independiente de desarrollo
MergeFusión de los cambios de una rama en otra
Push / PullSubir / descargar cambios del repositorio remoto
ForkCopia de un repositorio en tu cuenta de Github
Pull RequestSolicitud de revisión de código antes de hacer merge
.gitignoreArchivo que indica qué archivos Git debe ignorar
HEADPuntero al commit actual en el que estás trabajando
StashGuardar cambios a medias sin hacer commit
RevertCrear un commit que deshace otro (seguro en ramas compartidas)
ConflictoCambios incompatibles en la misma línea que requieren decisión manual
SSH keyLlave criptográfica para autenticarse con Github sin contraseña
Conventional CommitsEstándar de mensajes: tipo(ámbito): descripción
Github ActionsCI/CD integrado para correr tests, lint y deploy automáticos
Básico

Ejercicio 3.1: Tu primer repositorio

Crea tu primer repositorio Git desde cero. Sigue estos pasos en tu terminal.

# 1. Crear carpeta del proyecto
mkdir mi-primer-repo
cd mi-primer-repo
# 2. Inicializar Git
git init
# 3. Crear README.md
echo "# Mi Primer Repositorio" > README.md
# 4. Agregar y hacer commit
git status
git add README.md
git commit -m "Primer commit: agrega README"
# 5. Verificar
git log
Básico

Ejercicio 3.2: Práctica de commits

Practica el flujo de trabajo básico: crear archivos, modificarlos, ver diferencias y hacer commits.

# 1. Crear un archivo
echo "Mis notas del curso" > notas.txt
git add notas.txt
git commit -m "Agrega notas del curso"
# 2. Modificar el archivo
echo "Clase 3: Git y Github" >> notas.txt
# 3. Ver los cambios
git diff notas.txt
# 4. Commit y verificar
git add notas.txt
git commit -m "Agrega notas de clase 3"
git log --oneline
Intermedio

Ejercicio 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 rama
git checkout -b feature/nuevo-contenido
# 2. Crear archivo y hacer commit
echo "Contenido nuevo" > contenido.txt
git add contenido.txt
git commit -m "Agrega contenido.txt"
# 3. Volver a main — ¡el archivo desaparece!
git checkout main
ls    # contenido.txt NO aparece
# 4. Merge — ¡ahora sí aparece!
git merge feature/nuevo-contenido
ls    # contenido.txt SÍ aparece
git branch -d feature/nuevo-contenido
Intermedio

Ejercicio 3.4: Subir a Github

Conecta tu repositorio local con Github y sube tu código a la nube.

Pasos en Github

  1. 1. Crea un repositorio nuevo (vacío)
  2. 2. NO marques "Initialize with README"
  3. 3. Copia la URL del repositorio

En tu terminal

git remote add origin URL
git branch -M main
git push -u origin main
# Hacer un cambio y verificar
echo "update" >> README.md
git add . && git commit -m "update"
git push
Avanzado

Ejercicio 3.5: Simular un Pull Request

Simula el flujo completo de trabajo en equipo: rama, cambios, push y Pull Request.

# 1. Crear rama
git checkout -b feature/mi-cambio
# 2. Hacer cambios significativos
echo "Nueva sección" > seccion.md
git add . && git commit -m "Agrega sección"
# 3. Push de la rama
git 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 local
git checkout main
git pull
Interactivo

Ejercicio 3.6: Buenos vs malos commits

Clasifica cada mensaje de commit. Un buen commit es claro, específico y sigue una convención.

Commit Quiz1 / 8 — Aciertos: 0
git commit -m "feat(auth): agrega login con Google OAuth"
Interactivo

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?

💼

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 Nombre
Breve 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-perfil

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

Fragua Tech — Clase 3