| # | Sección |
|---|---|
| 1 | Colaborar: dos modelos |
| 2 | Fork y clone |
| 3 | Sincronizar su fork (upstream) |
| 4 | Las issues |
| 5 | Buenas prácticas de equipo |
| 6 | Quiz — El flujo de trabajo colaborativo |
| 7 | Práctica — Contribuir vía un fork |
| 8 | Síntesis |
Para trabajar entre varios en un repositorio, existen dos grandes modelos de colaboración. La elección depende sobre todo de quién tiene derecho a escribir en el repositorio.
| Modelo | Principio | Caso típico |
|---|---|---|
| Rama compartida | Todos los miembros tienen acceso de escritura; cada uno crea sus ramas en el mismo repositorio | Equipo interno, empresa |
| Fork & pull | Se copia el repositorio en la propia cuenta, se trabaja ahí y luego se propone una PR hacia el original | Open source, contribuidores externos |
En empresa, se usa casi siempre la rama compartida (visto en las lecciones 01–03). Para contribuir a un proyecto open source del que no se es miembro, se pasa por el fork.
Un fork es una copia personal de un repositorio en tu cuenta GitHub. Ahí tienes todos los derechos, sin tocar el original. El clone, por su parte, descarga un repositorio en tu máquina local.
No confundir:
| Término | ¿Dónde? | Acción |
|---|---|---|
| Fork | En GitHub | Copia el repositorio en tu cuenta |
| Clone | De GitHub a tu PC | Descarga el repositorio en local |
| origin | Tu fork remoto | Adonde empujas |
| upstream | El repositorio original | La fuente que sigues |
# 1. El fork se hace con el botón "Fork" en GitHub (o la CLI)
gh repo fork projet/app --clone
# Equivalente manual tras un fork:
# 2. Clonar SU fork
git clone https://github.com/vous/app.git
cd app
# 3. Verificar el remote
git remote -v
# origin https://github.com/vous/app.git (fetch/push)El fork es tu «caja de arena»: puedes romperlo todo sin riesgo para el proyecto original. Cuando tu trabajo está listo, una pull request lo propone al mantenedor, que decide aceptarlo.
🔧 Mini-ejercicio — Con gh, haz fork del repositorio projet/app y clónalo en tu máquina en un solo comando.
gh repo fork projet/app --clone
Mientras trabajas, el repositorio original evoluciona. Tu fork no se actualiza solo. Hay que añadir un remote upstream que apunte al original, y luego recuperar sus cambios con regularidad.
# 1. Declarar el repositorio original como 'upstream'
git remote add upstream https://github.com/projet/app.git
# 2. Recuperar sus últimos cambios
git fetch upstream
# 3. Actualizar su main local
git switch main
git merge upstream/main
# 4. Empujar a su propio fork
git push origin main| Remote | Rol | Sentido de uso |
|---|---|---|
origin | Tu fork | push tu trabajo |
upstream | Repositorio original | fetch las actualizaciones de los demás |
Sincronizar pronto y a menudo con
upstreamevita que tu fork «derive» del proyecto. Cuanto más esperas, más conflictos habrá el día de la PR.
🔧 Mini-ejercicio — Escribe el comando para declarar el repositorio original https://github.com/projet/app.git como remote upstream.
git remote add upstream https://github.com/projet/app.git
Una issue es un ticket: un lugar para señalar un bug, proponer una funcionalidad o hacer una pregunta. Es el sistema de seguimiento de un proyecto GitHub.
Lo que se pone en una buena issue de bug:
| Elemento | Ejemplo |
|---|---|
| Título claro | «Crash al clic en Exporter» |
| Etapas para reproducir | 1. Abrir X, 2. hacer clic en Y… |
| Comportamiento esperado | «El archivo se descarga» |
| Comportamiento observado | «La aplicación se cierra» |
| Entorno | OS, navegador, versión |
# Crear una issue desde el terminal
gh issue create --title "Crash au clic sur Exporter" \
--body "Étapes : 1) ouvrir X 2) cliquer Exporter → l'app se ferme."
# Listar las issues abiertas
gh issue list
# Ligar una PR a una issue: en la descripción de la PR
# Closes #42 → cierra automáticamente la issue #42 al fusionarLos labels organizan las issues: bug, enhancement, documentation, good first issue, help wanted…
Las issues transforman el «habría que corregir esto un día» en tareas trazables y discutibles. Ligar una PR con
Closes #Ncierra la issue automáticamente al fusionar: cero olvidos.
🔧 Mini-ejercicio — Con gh, crea una issue titulada «Crash au clic sur Exporter».
gh issue create --title "Crash au clic sur Exporter" --body "L'app se ferme au clic sur Exporter."
Más allá de los comandos, colaborar con eficacia se apoya en convenciones compartidas. Estas son las que marcan la diferencia.
| Buena práctica | En concreto |
|---|---|
| Mensajes de commit claros | «Corrige el cálculo del IVA», no «update» |
| Convención de nombres | feature/, fix/, docs/ para las ramas |
| Ramas cortas | Integrar pronto para limitar los conflictos |
| PR pequeñas y releídas | Relectura seria, menos bugs |
main siempre desplegable | Nunca se rompe la rama principal |
Un archivo README + CONTRIBUTING | Documenta cómo contribuir |
El estándar de los «Conventional Commits», muy extendido:
git commit -m "feat: ajout de l'export CSV"
git commit -m "fix: corrige le crash au login"
git commit -m "docs: mise à jour du README"
git commit -m "refactor: simplifie le service de paiement"| Prefijo | Significado |
|---|---|
feat: | Nueva funcionalidad |
fix: | Corrección de bug |
docs: | Documentación |
refactor: | Reescritura sin cambiar el comportamiento |
test: | Añadido o modificación de tests |
Un equipo que comparte convenciones no necesita concertarse sin cesar: el código, los commits y las ramas «hablan» la misma lengua. Eso es la fluidez colaborativa.
🔧 Mini-ejercicio — Acabas de añadir el export CSV. Escribe el mensaje de commit en formato Conventional Commits.
git commit -m "feat: ajout de l'export CSV" (prefijo feat: para una funcionalidad nueva).
¿Qué es un fork?
a) Una fusión de dos ramas
b) Una copia personal de un repositorio en tu cuenta GitHub
c) Un tipo de conflicto
d) Un borrado del historial
✅ Respuesta: b) — Un fork copia el repositorio en tu cuenta; trabajas ahí con libertad sin tocar el original.
¿Cuál es la diferencia entre origin y upstream en el modelo fork & pull?
a) Ninguna, son sinónimos
b) origin es tu fork, upstream es el repositorio original
c) origin es local, upstream está en tu disco
d) upstream sirve para borrar ramas
✅ Respuesta: b) — Se empuja hacia origin (su fork) y se recuperan las actualizaciones desde upstream (el original).
¿Para qué sirve una issue?
a) Para compilar el código
b) Para señalar un bug, proponer una funcionalidad o discutir una tarea
c) Para fusionar automáticamente las ramas
d) Para clonar un repositorio
✅ Respuesta: b) — Una issue es un ticket de seguimiento: bug, idea, pregunta, organizada por labels.
¿Qué hace Closes #42 en la descripción de una pull request?
a) Borra el commit 42
b) Cierra automáticamente la issue #42 cuando se fusiona la PR
c) Abre una issue nueva
d) Cancela la PR
✅ Respuesta: b) — La palabra clave Closes (o Fixes) liga la PR a la issue y la cierra al fusionar.
¿Qué significa el prefijo de commit fix: en los Conventional Commits?
a) Una funcionalidad nueva
b) Una corrección de bug
c) Documentación
d) Un test
✅ Respuesta: b) — fix: indica una corrección de bug; feat: una funcionalidad, docs: documentación.
origin es tu fork; upstream es el repositorio original.Closes #42 cierra la issue #42 al fusionar la PR.fix: = corrección de bug; feat: = funcionalidad; docs: = documentación.Quieres contribuir a un proyecto open source projet/app del que no eres miembro. Realiza el ciclo completo del modelo fork & pull:
upstream y sincroniza tu main.# 1. Fork + clone
gh repo fork projet/app --clone
cd app
# 2. Añadir upstream y sincronizar
git remote add upstream https://github.com/projet/app.git
git fetch upstream
git switch main
git merge upstream/main
git push origin main
# 3. Ramificar, commit, empujar
git switch -c fix/correction-typo-readme
# ... corrección del archivo README ...
git commit -am "fix: corrige une faute dans le README"
git push -u origin fix/correction-typo-readme
# 4. Abrir la PR hacia el repositorio ORIGINAL
gh pr create --repo projet/app \
--base main --head vous:fix/correction-typo-readme \
--title "fix: faute de frappe dans le README" \
--body "Corrige une coquille. Closes #8"Resultado esperado:
| Etapa | Verificación |
|---|---|
| Fork creado | El repositorio aparece bajo github.com/vous/app |
upstream añadido | git remote -v lista origin y upstream |
| Rama empujada | La rama existe en tu fork (origin) |
| PR abierta | La PR apunta a projet/app:main desde vous:fix/... |
| Issue ligada | Closes #8 cerrará la issue al fusionar el mantenedor |
$ git remote -v
origin https://github.com/vous/app.git (push)
upstream https://github.com/projet/app.git (fetch)La PR parte de tu rama (
vous:fix/...) hacia elmaindel repositorio original. El mantenedor la relee y decide fusionar: acabas de contribuir al open source sin haber tenido nunca derecho de escritura en el proyecto.
Closes #N liga y cierra al fusionar.main estable.feat:, fix:, docs:…) estandarizan los mensajes.Este módulo 02 ha terminado: ya sabes ramificar, fusionar, abrir pull requests y colaborar a gran escala. El módulo 03 sigue el recorrido DevOps con la integración continua (CI/CD), que automatizará tests y despliegues a partir de esas mismas pull requests.
Todos los derechos reservados. Toda reproducción, difusión, uso o adaptación de este curso, en todo o en parte, está estrictamente prohibida sin la autorización escrita previa del Dr. Haythem REHOUMA.
Curso creado por Dr. Haythem REHOUMA — Desarrollo y despliegue de soluciones de datos