Git y GitHub¶
Git guarda el historial de cambios en tu equipo. GitHub aloja copias remotas de repositorios Git y añade colaboración, pull requests, incidencias, Codespaces y automatizaciones. No son la misma herramienta: puedes usar Git sin GitHub, aunque en este curso usaremos ambos.
Lo usamos desde VS Code
En el curso trabajamos con Git y GitHub principalmente desde la vista Source Control de VS Code. Los comandos de esta página son la referencia de lo que ocurre por debajo y resultan especialmente útiles para automatizar tareas o resolver incidencias.
Para el flujo visual, consulta también la documentación oficial de Source Control in VS Code y Work with GitHub in VS Code.
Qué aprenderás¶
Al terminar esta guía podrás:
- reconocer el estado de un archivo y consultar qué ha cambiado;
- preparar cambios, guardarlos en commits y revisar el historial;
- clonar un repositorio y sincronizarlo con GitHub;
- trabajar en una rama y abrir una pull request;
- evitar subir entornos virtuales, cachés, metadatos y secretos.
La evidencia mínima de logro es poder explicar qué ocurre en cada paso de este flujo:
archivos -> git add -> staging -> git commit -> historial local -> git push -> GitHub
GitHub -> git pull -> archivos e historial local
El viaje de un cambio. Cada flecha del dibujo es un comando: add elige qué
entra, commit guarda el hito, push lo publica y pull trae lo nuevo. La
fila de círculos del historial es la cadena de commits: instantáneas
encadenadas que solo salen de tu equipo cuando las publicas.
Vocabulario esencial¶
| Concepto | Significado |
|---|---|
| Repositorio | Carpeta cuyo historial administra Git, incluida la carpeta oculta .git/ |
| Working tree | Archivos que tienes ahora mismo en la carpeta del proyecto |
| Staging | Selección de cambios que entrarán en el próximo commit |
| Commit | Instantánea identificada por un mensaje y un identificador |
| Rama | Línea de trabajo que permite avanzar sin modificar otra rama |
| Remoto | Otro repositorio, normalmente alojado en GitHub |
| Pull request | Propuesta para revisar e integrar cambios de una rama |
Un commit no sube nada a GitHub: guarda un hito en el repositorio local.
git push publica commits locales en un remoto y git pull trae cambios del
remoto e intenta integrarlos en tu rama.
Instalación y configuración¶
Git se instala una sola vez por equipo. GitHub no se instala: es un servicio web. Crea una cuenta gratuita en github.com si aún no la tienes; en VS Code iniciarás sesión con ella cuando el editor lo solicite.
Instala las herramientas de línea de comandos de Apple, que incluyen Git.
Si usas Homebrew, también sirve brew install git.
Descarga el instalador de git-scm.com y sigue el asistente. También puedes usar winget:
Comprueba la instalación:
Salida esperada: una línea como git version 2.43.0. El número depende de
la versión instalada. En Windows, si el comando no aparece, cierra y vuelve a
abrir la terminal después de instalar.
Configura la identidad que Git escribirá en tus commits:
Comprueba los valores guardados:
El correo debe ser uno que reconozcas en GitHub, o el correo privado que GitHub te proporcione. Esta configuración identifica los commits; no autentica el acceso a GitHub.
Qué hace uv init
Si Git está disponible, uv init puede crear también la carpeta .git/ y
un .gitignore inicial. Esa ayuda no sustituye a aprender Git: en una
carpeta existente comprueba primero git status, y si no es un repositorio
puedes inicializarlo explícitamente con git init.
Crear o clonar un repositorio¶
Proyecto local nuevo¶
Si la carpeta todavía no es un repositorio:
Efecto observable: Git muestra la rama actual y los archivos no seguidos o
modificados. Aparece una carpeta oculta .git/; no debes editarla ni subir su
contenido por separado.
Si el proyecto usa uv, prepara después sus dependencias con uv sync. Consulta
la guía de uv para distinguir pyproject.toml, uv.lock y .venv.
Repositorio que ya existe en GitHub¶
Clona el repositorio y entra en la carpeta creada:
Si es un proyecto Python gestionado por uv, ejecuta después uv sync --locked
antes de abrir cuadernos o scripts. No hagas git init después de clonar: la
carpeta ya contiene su historial y su remoto.
El ciclo local: revisar, preparar y guardar¶
Consultar cambios¶
git status resume el estado; git diff muestra cambios todavía no preparados
y git diff --staged muestra lo que ya está preparado para el próximo commit.
La salida depende de lo que hayas editado, por lo que el resultado importante
es identificar cada archivo como modificado, no seguido o preparado.
Crear un commit¶
Cada línea siguiente representa un paso consciente:
git addlleva una versión concreta del cambio al staging;- revisar
git diff --stagedevita guardar accidentalmente otro archivo; git commitcrea un hito local;git log --oneline -5permite comprobar que el hito aparece en el historial.
Escribe mensajes breves y concretos, por ejemplo Explica validación cruzada.
Un commit debería representar una unidad que se pueda revisar o recuperar.
Commit no significa publicar
git commit solo modifica tu repositorio local. Para publicar el commit en
GitHub todavía necesitas git push.
Quitar algo del staging o descartar cambios¶
Si preparaste un archivo por error, puedes devolverlo al estado no preparado:
git restore archivo.py descarta los cambios no guardados de ese archivo. Es
una operación destructiva: úsala solo después de comprobar git diff y cuando
estés seguro de que no necesitas recuperar esas modificaciones.
.gitignore: qué no debe entrar en el repositorio¶
.gitignore contiene patrones para archivos locales, generados o sensibles que
Git no debe proponer para seguimiento. uv init crea uno básico; para los
proyectos del curso conviene que incluya al menos esto:
# Código compilado por Python
__pycache__/
*.py[oc]
# Entorno virtual: se recrea con uv sync
.venv/
# Sesiones y cachés de marimo
__marimo__/
# Secretos (claves de API); la plantilla sin valores sí se versiona
.env
.env.*
!.env.example
Cada línea es un patrón: una carpeta termina en /, * significa «cualquier
texto» y ! crea una excepción a un patrón anterior. No ignores el código,
pyproject.toml, uv.lock ni .python-version: son parte de la información
necesaria para reproducir el entorno. .venv se recrea con uv sync.
Un secreto ya publicado requiere rotación
Añadir .env a .gitignore evita nuevas incorporaciones, pero no borra un
secreto que ya esté en el historial. Si ocurre, revoca o rota primero la
clave en el servicio correspondiente y comunica la incidencia; después
limpia el historial con un procedimiento revisado.
Trabajar con GitHub¶
Consulta el remoto antes de sincronizar:
Para conectar un repositorio local que todavía no tiene remoto:
-u asocia la rama local con su rama remota; en los siguientes envíos suele
bastar git push. Usa la URL real del repositorio y el nombre que muestre
git branch --show-current.
El ciclo habitual después de tener commits:
Antes de git pull, confirma tus cambios locales en un commit o descártalos. Si el remoto ha
avanzado y tienes cambios sin publicar, Git puede pedirte que resuelvas una
integración. No fuerces git push para ocultar el problema.
Autenticación
VS Code puede abrir el navegador para iniciar sesión en GitHub. No guardes
tokens ni contraseñas en una URL, en un script ni en un archivo versionado.
gh, la interfaz oficial de GitHub para terminal, es opcional; el flujo
equivalente está disponible desde la web y desde VS Code.
Ramas y pull requests¶
La rama principal suele llamarse main, aunque en repositorios antiguos es
frecuente master. No adivines el nombre: compruébalo con git branch o en
GitHub.
Una rama (tema) parte de main, avanza con sus propios commits y se
integra con un merge después de que la pull request haya pasado revisión. Así
el trabajo aislado no toca la rama principal hasta que está listo y revisado.
Para trabajar en una tarea aislada:
git switch -c tema
git branch --show-current
git add archivo.py
git commit -m "Implementa el tema"
git push -u origin tema
Después, abre en GitHub una pull request desde tema hacia la rama principal.
La revisión permite discutir el cambio antes de integrarlo. Cuando termine el
trabajo, actualiza tu copia local y cambia de rama:
Resolver un conflicto¶
Un conflicto aparece cuando Git no puede elegir automáticamente entre dos versiones. El procedimiento básico es:
- Ejecuta
git statuspara localizar los archivos afectados. - Abre cada archivo y decide qué contenido debe conservarse entre los
marcadores
<<<<<<<,=======y>>>>>>>. - Elimina los marcadores, guarda el archivo y comprueba que el código sigue funcionando.
- Ejecuta
git add archivoy termina la integración con el comando que Git indique.
No borres los marcadores sin revisar el código: resolver un conflicto es una decisión sobre contenido, no solo una operación mecánica.
GitHub, Codespaces y Actions¶
GitHub es un servicio con tres piezas que conviene no confundir: una es obligatoria para este curso y las otras dos son opcionales.
| Pieza | Qué es | ¿Hace falta en este curso? |
|---|---|---|
| Repositorio | Alojamiento del código, el historial, las ramas, las incidencias y los pull requests | Sí, para el control de versiones |
| Codespaces | Un VS Code completo en el navegador, sobre una máquina remota de GitHub | No: es una alternativa para quien no quiera instalar nada |
| Actions | Ejecuta automatizaciones definidas en .github/workflows/, como validaciones o publicación |
No en tus entregas; se explica en la Unidad 2 de Programación de IA |
Repositorio. Es lo que se usa en el curso: git, las ramas, los merges y
los conflictos. Todo lo anterior de esta página trabaja contra el repositorio,
y funciona igual con un remoto local o con uno en GitHub.
Codespaces. Abre el proyecto en un editor completo dentro del navegador,
sin instalar VS Code ni Python en tu equipo. Al abrirlo hay que sincronizar
las dependencias con uv sync, porque la máquina remota llega vacía. Es
opcional: si ya tienes VS Code y Python funcionando, ignóralo sin
consecuencias. Se menciona en la página del editor.
Actions. Se explica en el capítulo 2.1 · Entorno de desarrollo profesional de Programación de IA, junto con la integración continua (CI): comprobaciones automáticas que se ejecutan en cada cambio. Tus prácticas no la necesitan, pero en un proyecto profesional es lo habitual; por eso se enseña.
Obligatorio frente a opcional
En todo el curso, git y el repositorio son obligatorios: aparecen en
todas las prácticas. Codespaces y Actions son opcionales: puedes hacer
el curso completo sin ninguno de los dos. Si algo del material te obliga a
usarlos, es un descuido de estas páginas, no una parte del temario.
Problemas habituales¶
| Síntoma | Causa probable | Solución inicial |
|---|---|---|
not a git repository |
La terminal no está dentro del repositorio | Entra en la carpeta correcta con cd y ejecuta git status |
nothing to commit |
No hay cambios preparados o ya están guardados | Revisa git status y git diff |
rejected al hacer push |
El remoto tiene commits que no tienes | Ejecuta git pull, resuelve conflictos y vuelve a revisar antes de publicar |
Un archivo no aparece en status |
Un patrón de .gitignore lo excluye |
Comprueba el patrón y usa git check-ignore -v archivo |
| Aparece un conflicto | Dos versiones modificaron la misma zona | Lee los marcadores, decide el contenido y prepara el archivo resuelto |
| El commit tiene una identidad incorrecta | user.name o user.email no están configurados |
Comprueba git config --get user.name y git config --get user.email |
Comandos de referencia rápida¶
| Necesidad | Comando |
|---|---|
| Verificar Git | git --version |
| Iniciar un repositorio local | git init |
| Clonar un repositorio | git clone URL |
| Ver el estado | git status |
| Ver cambios no preparados | git diff |
| Preparar un archivo | git add archivo |
| Guardar un commit | git commit -m "Mensaje" |
| Ver el historial breve | git log --oneline |
| Ver remotos | git remote -v |
| Traer e integrar cambios | git pull |
| Publicar commits | git push |
| Crear una rama | git switch -c nombre |
| Cambiar de rama | git switch nombre |
| Comprobar por qué se ignora un archivo | git check-ignore -v archivo |
Comprobación final¶
Desde la raíz del repositorio, ejecuta:
Salida esperada: Git muestra el estado y la rama sin errores, el historial
contiene al menos un commit y git diff --check no imprime nada cuando no hay
errores de espacios en los cambios no preparados. La salida concreta depende
del trabajo que haya hecho cada persona.
Siguiente paso¶
Sigue con uv para dominar el gestor de dependencias; con eso cierras las herramientas y empiezas el contenido.