Skip to content

Tutorial de Git para estudiantes Fundamentos, branches y submódulos

Proyecto: Desarrollo de una aplicación web de gestión de tareas para el instituto

Repositorio del profesor: https://github.com/profesor-informatica/proyecto-tareas-clase

Objetivo: Los estudiantes colaborarán en el desarrollo, aprendiendo Git paso a paso.


  • ✓ Crear y mantener el repositorio principal
  • ✓ Configurar permisos y protecciones de ramas (branches)
  • ✓ Revisar y aprobar Pull Requests
  • ✓ Resolver conflictos complejos
  • ✓ Gestionar releases y tags
  • ✓ Supervisar el flujo de trabajo del equipo
  • Clonar el repositorio
  • Crear branches para sus características
  • Realizar commits con sus cambios
  • Crear y enviar Pull Requests
  • Resolver conflictos básicos
  • Mantener su fork actualizado

Git es un sistema de control de versiones distribuido que permite:

  • Rastrear cambios en archivos
  • Colaborar con otros desarrolladores
  • Mantener un historial completo del proyecto
  • Trabajar en paralelo sin interferencias
  • Repositorio: Carpeta que contiene tu proyecto y su historial
  • Commit: Instantánea de tu proyecto en un momento específico
  • Branch: Línea independiente de desarrollo
  • Merge: Combinar cambios de diferentes branches
  • Remote: Repositorio en un servidor (como GitHub)

El profesor debe crear el repositorio base:

Terminal window
# Crear repositorio local
mkdir proyecto-tareas-clase
cd proyecto-tareas-clase
git init
# Configuración inicial
git config user.name "Profesor Informática"
git config user.email "profesor@instituto.edu"
# Crear estructura inicial del proyecto
mkdir src css js
echo "# Proyecto Tareas Clase" > README.md
echo "<!DOCTYPE html><html><head><title>Tareas</title></head><body><h1>Gestión de Tareas</h1></body></html>" > index.html
# Primer commit
git add .
git commit -m "Inicial: Estructura básica del proyecto"
# Conectar con GitHub y subir
git branch -M main
git remote add origin https://github.com/profesor-informatica/proyecto-tareas-clase.git
git push -u origin main

Cada estudiante debe configurar Git en su máquina:

Terminal window
# Configuración global (hacer una sola vez)
git config --global user.name "Tu Nombre"
git config --global user.email "tu.email@estudiante.com"
# Verificar configuración
git config --list
# Configurar editor (opcional)
git config --global core.editor "code --wait"

Módulo 3: Primeros pasos con el repositorio

Section titled “Módulo 3: Primeros pasos con el repositorio”
Terminal window
# Clonar el repositorio del profesor
git clone https://github.com/profesor-informatica/proyecto-tareas-clase.git
# Entrar al directorio
cd proyecto-tareas-clase
# Ver el estado actual
git status
# Ver el historial
git log --oneline
Terminal window
# Ver archivos en el repositorio
ls -la
# Ver información del repositorio remoto
git remote -v
# Ver todas las ramas
git branch -a

Terminal window
# Ver estado de archivos
git status
# Agregar archivos específicos al staging area
git add archivo.html
# Agregar todos los archivos modificados
git add .
# Ver diferencias
git diff # Cambios no staged
git diff --staged # Cambios staged
# Crear commit
git commit -m "Descripción clara de los cambios"
# Ver historial
git log
git log --oneline --graph

Ejercicio práctico 1: primera contribución

Section titled “Ejercicio práctico 1: primera contribución”
Terminal window
# 1. Crear un archivo CSS básico
echo "body { font-family: Arial, sans-serif; }" > css/styles.css
# 2. Ver estado
git status
# 3. Agregar al staging area
git add css/styles.css
# 4. Crear commit
git commit -m "Agregar estilos básicos CSS"
# 5. Ver el historial
git log --oneline

Los branches permiten trabajar en características diferentes sin afectar el código principal.

Terminal window
# Ver branch actual
git branch
# Crear nueva branch
git branch feature/login-form
# Cambiar a la nueva branch
git checkout feature/login-form
# O en una sola línea:
git checkout -b feature/login-form
# Trabajar en la nueva branch
echo "<form><input type='text' placeholder='Usuario'><input type='password' placeholder='Contraseña'><button>Login</button></form>" >> index.html
# Hacer commit en la branch
git add index.html
git commit -m "Agregar formulario de login básico"
Terminal window
# Volver a main
git checkout main
# Ver diferencias entre branches
git diff main feature/login-form
# Ver archivos en main vs feature branch
cat index.html # En main
git checkout feature/login-form
cat index.html # En feature branch

Módulo 6: Trabajo con repositorios remotos

Section titled “Módulo 6: Trabajo con repositorios remotos”
Terminal window
# Subir branch al repositorio remoto
git push origin feature/login-form
# Si es la primera vez
git push -u origin feature/login-form

El profesor debe configurar en GitHub:

  1. Settings → Branches
  2. Add rule para main
  3. Require pull request reviews
  4. Require status checks
  1. Ir a GitHub
  2. Comparar branches
  3. Crear Pull Request con descripción detallada
## Descripción
Agregado formulario de login básico
## Cambios realizados
- Creado formulario HTML con campos usuario/contraseña
- Agregado botón de envío
## Pruebas
- [x] Formulario se muestra correctamente
- [ ] Pendiente: validación JavaScript
Terminal window
# Descargar la branch del alumno para revisar
git fetch origin
git checkout feature/login-form
# Probar los cambios
# Revisar código
# Aprobar o solicitar cambios en GitHub

Terminal window
# Después de aprobar en GitHub, actualizar local
git checkout main
git pull origin main
# El merge se hace automáticamente en GitHub
# O manualmente:
git merge feature/login-form
git push origin main
Terminal window
# Actualizar main local
git checkout main
git pull origin main
# Actualizar tu branch feature
git checkout feature/login-form
git merge main
# O usar rebase (más avanzado)
git rebase main

Terminal window
git checkout main
echo "<h2>Bienvenido al Sistema de Tareas</h2>" >> index.html
git add index.html
git commit -m "Agregar mensaje de bienvenida"
git push origin main
Terminal window
git checkout feature/login-form
echo "<h2>Sistema de Login</h2>" >> index.html
git add index.html
git commit -m "Agregar título para login"
# Al intentar merge con main actualizado
git checkout main
git pull origin main
git checkout feature/login-form
git merge main
# ¡Conflicto!
Terminal window
# Git marca los conflictos en el archivo
cat index.html
# Editar manualmente el archivo
# Remover las marcas de conflicto <<<< ==== >>>>
# Mantener ambos cambios o elegir uno
# Después de resolver
git add index.html
git commit -m "Resolver conflicto: combinar mensajes de bienvenida y login"

Terminal window
# Guardar cambios sin commit
git stash
# Ver stashes guardados
git stash list
# Recuperar el stash
git stash pop
# Crear stash con mensaje
git stash save "WIP: trabajando en validación"
Terminal window
# Deshacer último commit (mantener cambios)
git reset --soft HEAD~1
# Deshacer último commit (descartar cambios)
git reset --hard HEAD~1
# Deshacer cambios en archivo específico
git checkout -- archivo.html
Terminal window
# Aplicar commit específico de otra branch
git cherry-pick <commit-hash>
Terminal window
# Reescribir historia de últimos 3 commitsgit rebase -i HEAD~3
# Opciones: pick, reword, edit, squash, drop

GitHub Flow (recomendado para principiantes)

Section titled “GitHub Flow (recomendado para principiantes)”
Terminal window
# 1. Actualizar main
git checkout main
git pull origin main
# 2. Crear branch para feature
git checkout -b feature/nueva-funcionalidad
# 3. Desarrollar y hacer commitsgit add .
git commit -m "Implementar nueva funcionalidad"
# 4. Push y crear PR
git push origin feature/nueva-funcionalidad
# 5. Code review y merge
# 6. Borrar branch después del merge
git branch -d feature/nueva-funcionalidad
Terminal window
# Inicializar Git Flow
git flow init
# Crear feature
git flow feature start nueva-funcionalidad
# Finalizar feature
git flow feature finish nueva-funcionalidad
# Crear release
git flow release start v1.0.0
git flow release finish v1.0.0

Terminal window
# Alias útiles
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.visual '!gitk'
git config --global alias.lg "log --oneline --decorate --all --graph"
Terminal window
# Ver diferencias visuales
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
# Ver archivos modificados
git diff --name-only
# Ver estadísticas de commits
git shortlog -sn
# Ver quién modificó cada línea
git blame archivo.html

Módulo 12: Ejercicios prácticos completos

Section titled “Módulo 12: Ejercicios prácticos completos”

Ejercicio 1: Implementar sistema de usuarios

Section titled “Ejercicio 1: Implementar sistema de usuarios”
Terminal window
# 1. Crear branch
git checkout main
git pull origin main
git checkout -b feature/user-system
# 2. Crear archivos necesarios
mkdir js
echo "class User { constructor(name, email) { this.name = name; this.email = email; } }" > js/user.js
# 3. Modificar HTML
echo "<div id='user-info'></div>" >> index.html
# 4. Commits incrementales
git add js/user.js
git commit -m "Crear clase User básica"
git add index.html
git commit -m "Agregar contenedor para información de usuario"
# 5. Push y PR
git push origin feature/user-system

Ejercicio 2: Manejo de conflictos complejos

Section titled “Ejercicio 2: Manejo de conflictos complejos”
Terminal window
# Simular trabajo en paralelo con otros compañeros
# Cada alumno trabaja en diferentes archivos del mismo componente

Buenos ejemplos:

Terminal window
git commit -m "Agregar validación de email en formulario registro"
git commit -m "Corregir bug: botón login no funcionaba en IE11"
git commit -m "Refactorizar: extraer lógica de validación a clase separada"

Convención de commits:

Terminal window
# Formato: tipo(alcance): descripción
git commit -m "feat(auth): agregar login con Google"
git commit -m "fix(ui): corregir espaciado en botones"
git commit -m "docs: actualizar README con instrucciones de instalación"
main
|-- develop
|-- feature/user-authentication
|-- feature/task-management
|-- bugfix/login-error
`-- hotfix/security-patch
Terminal window
# Crear archivo .gitignore
cat > .gitignore << EOF
# Dependencies
node_modules/
vendor/
# IDE
.vscode/
.idea/
*.swp
# OS
.DS_Store
Thumbs.db
# Logs
*.log
logs/
# Environment
.env
.env.local
EOF
git add .gitignore
git commit -m "Agregar archivo .gitignore"

Módulo 14: Solución de problemas comunes

Section titled “Módulo 14: Solución de problemas comunes”

Problema 1: “Your branch is ahead/behind”

Section titled “Problema 1: “Your branch is ahead/behind””
Terminal window
# Solución: Sincronizar con remoto
git fetch origin
git status
git pull origin main
Terminal window
# Deshacer último commit sin perder cambios
git reset --soft HEAD~1
# Deshacer y descartar cambios
git reset --hard HEAD~1
Terminal window
# Descartar cambios en archivo específico
git checkout -- archivo.html
# Si ya está en staging
git reset HEAD archivo.html
git checkout -- archivo.html
Terminal window
# Error: Updates were rejected
git pull origin main
# Resolver conflictos si los hay
git push origin main

Antes de empezar a trabajar:

  • git status - verificar estado
  • git pull origin main - actualizar main
  • git checkout mi-branch - cambiar a mi branch
  • git merge main - actualizar mi branch con main

Antes de hacer push:

  • git status - verificar cambios
  • git diff - revisar diferencias
  • Commit con mensaje descriptivo
  • git push origin mi-branch

Configuración inicial:

  • Repositorio creado en GitHub
  • Branch protection configurada en main
  • Colaboradores agregados
  • Issues/Project board configurado

Revisión de PRs:

  • Código funciona correctamente
  • Estilo de código consistente
  • Commits bien estructurados
  • Tests pasan (si aplica)
  • Documentación actualizada

Criterios de evaluación:

  1. Uso correcto de comandos Git (30%)
  2. Calidad de commits y mensajes (20%)
  3. Manejo de branches y merges (25%)
  4. Resolución de conflictos (15%)
  5. Colaboración y code review (10%)

Objetivo: Cada equipo de 3-4 estudiantes desarrollará una característica completa del sistema de tareas.

Equipos sugeridos:

  • Equipo Frontend: Interfaz de usuario
  • Equipo Backend: API y base de datos
  • Equipo Testing: Pruebas automatizadas
  • Equipo DevOps: Deployment y CI/CD

Flujo de trabajo:

Terminal window
# 1. Cada equipo crea su branch principal
git checkout -b team/frontend-ui
# 2. Miembros del equipo crean sub-branches
git checkout -b feature/responsive-design
# 3. Trabajo colaborativo con PRs internas
git checkout -b fix/mobile-navigation
# 4. Integración con main a través de PR del equipo

Terminal window
# Configuración
git config --global user.name "Tu Nombre"
git config --global user.email "email@ejemplo.com"
# Repositorio
git init # Inicializar repo
git clone <url> # Clonar repo
git status # Estado actual
git log # Historial
# Staging y commits
git add <archivo> # Agregar a staging
git add . # Agregar todos
git commit -m "mensaje" # Crear commit
git commit -am "mensaje" # Add + commit
# Branches
git branch # Listar branches
git branch <nombre> # Crear branch
git checkout <nombre> # Cambiar branch
git checkout -b <nombre> # Crear y cambiar
git merge <branch> # Merge branch
git branch -d <nombre> # Borrar branch
# Remoto
git remote -v # Ver remotos
git fetch # Descargar cambios
git pull # Fetch + merge
git push # Subir cambios
git push -u origin <branch> # Primera vez
# Deshacer
git reset --soft HEAD~1 # Deshacer commit
git reset --hard HEAD~1 # Deshacer + descartar
git checkout -- <archivo> # Descartar cambios
git stash # Guardar temporal
git stash pop # Recuperar temporal
  • VS Code: Editor con excelente integración Git
  • GitKraken: Cliente visual Git
  • GitHub Desktop: Cliente oficial GitHub
  • SourceTree: Cliente visual gratuito
  • Git Extensions: Para Windows

Este tutorial está diseñado para ser progresivo. No intentes aprender todo de una vez. La práctica constante es clave para dominar Git.

Recomendaciones:

  1. Practica cada comando varias veces
  2. No tengas miedo de experimentar
  3. Lee los mensajes de error cuidadosamente
  4. Usa git help <comando> cuando tengas dudas
  5. Haz commits frecuentes con mensajes descriptivos

Recordatorio importante: Git es una herramienta poderosa pero compleja. Es normal cometer errores al principio. La mayoría de errores se pueden deshacer, así que experimenta con confianza.


Tutorial creado para el curso de Informática - Actualizado Octubre 2025


Cómo incluir un repositorio dentro del nuestro. Al crear un submódulo se “copian” los archivos dentro de nuestro proyecto y se crean unos archivos para indicar que esos archivos están asociados a otro repositorio:

  1. Añadimos el nuevo submódulo: git submodule add https://github.com/twbs/bootstrap vendor/bootstrap Utilizamos la carpeta vendor para incluir código que no es nuestro.

  2. Se han creado:

Terminal window
ls vendor/bootstrap
git status
new file: .gitmodules # archivo que asocia la ruta con la URL de github
new file: vendor/bootstrap # Trata a esta carpeta como un fichero
git add .
git commit -m "Nuevo submódulo"

¿Cómo actualizar si el submódulo tiene alguna actualización?

Section titled “¿Cómo actualizar si el submódulo tiene alguna actualización?”

Opción 1: entrar en la carpeta del submódulo (por ejemplo vendor/bootstrap) y hacer:

Terminal window
git pull

Opción 2: si tenemos muchos submódulos:

Terminal window
git submodule update --remote --recursive

Opción 3: la más sencilla, pull + fetch + actualización de submódulos, lo deja todo al día:

Terminal window
git pull --recurse-submodules

Inicializar repositorio que tenga un submódulo

Section titled “Inicializar repositorio que tenga un submódulo”
  1. Clonar el repositorio principal
  2. Se crean las carpetas (dentro de vendor) pero están vacías
  3. Inicializar los submódulos:
Terminal window
git submodule init
git submodule update