Tabla de Contenidos
¡Esta es una revisión vieja del documento!
2. Git en el proyecto
Objetivo del tema: que nadie vuelva a escribir a mano un comando de git del día a día. Al acabar, todo lo de git pasa por la skill /git-flow.
Lo que ya sabéis y aquí no se repite:
- Ramas, los tipos de merge, conflictos y, sobre todo, worktrees y por qué uno por rama cuando se trabaja con agentes: Despliegue 2.
- Scrum y los tableros de GitHub: Proyecto 4.
Issues y tablero
Todo trabajo empieza por un issue. El issue es la unidad: de él sale la rama, su número va en los commits y al fusionar se cierra solo.
El tablero es un GitHub Project del repositorio con tres columnas: Todo, In progress y Done. De sus automatizaciones (Workflows del proyecto) solo hace falta una, que viene activada de serie: issue cerrado → Done. El resto se hace a mano: al crear el issue se añade al tablero, y al empezar a trabajarlo se arrastra a In progress. Automatizar eso por línea de comandos no compensa.
Etiquetas: feature y bug. No hacen falta más.
Los issues se crean desde la web o con gh:
gh issue create --title "Alta de clientes" --label feature --body "Formulario de alta con nombre, NIF y email." gh issue list gh issue view 12
Las ramas de este proyecto
El modelo de ramas de Despliegue 2 tiene develop, release y master. Aquí, al ser un proyecto individual con un solo entorno, se recorta a dos:
develop: la integración. Solo existe de verdad en local, en la carpeta principal del repositorio; en GitHub está porque es la rama por defecto y es donde se cierran los issues. Nunca se despliega.main: producción. Cada push amaindespliega en el servidor (tema 6). Nunca se trabaja en ella.
Y por cada issue, una rama de trabajo en su propio worktree:
| Cosa | Nombre | Ejemplo |
|---|---|---|
| Rama | <alumno>-<N>-<slug> | lorenzo-12-alta-clientes |
| Worktree | ../<repo>-wt-<N>-<slug> | ../mi-proyecto-wt-12-alta-clientes |
El número del issue en el nombre de la rama hace que la skill sepa siempre a qué issue pertenece, sin preguntarlo.
Sin pull requests. En un proyecto individual nadie va a revisar el PR, así que es un trámite que no aporta nada: la rama se fusiona en develop en local y se hace push. La revisión del código la hará la IA antes de fusionar (tema 5).
El ciclo de una rama
- Iniciar: desde la carpeta principal (siempre en
develop, actualizada), crear la rama y su worktree. - Trabajar en el worktree. Commits pequeños con
type(#N):título. - Actualizar: si
developha avanzado (otro issue que se ha terminado antes), traerdevelopa la rama congit merge develop. Los conflictos se resuelven en la rama, nunca endevelop. - Finalizar: fusionar en
developcon–squash: todos los commits de la rama se funden en uno con el mensajefeat(#N): título. Push dedevelop. Borrar el worktree y la rama. - Publicar: cuando hay algo que sacar,
develop→maincon–ff-onlyy push.
Por qué –squash hacia develop y –ff-only hacia main está en Usos de merge.
El commit que cierra el issue
GitHub cierra un issue automáticamente cuando llega a la rama por defecto un commit cuyo mensaje contiene Closes #N. Por eso develop es la rama por defecto, y por eso el commit de la fusión lleva el Closes en el cuerpo:
feat(#12): Alta de clientes Closes #12
Al hacer push de develop, el issue 12 se cierra y el tablero lo pasa a Done. No hay que tocar nada en la web.
Reglas para que la IA toque git
Una skill que ejecuta git puede hacer daño si improvisa. Estas reglas van en la skill y no se negocian:
- Nunca
git pull. Siempregit fetch –pruneygit merge –ff-only origin/<rama>. Así, si las historias han divergido, falla en vez de hacer un merge sorpresa. - Nunca
–force, ni–no-verify, nistash, ni borrar worktrees con–force. - Nunca resolver un conflicto. Si un merge da conflicto, la skill se para, enseña
git statusy dice qué comandos tiene que ejecutar el alumno. Resolver conflictos es trabajo humano. - La carpeta principal siempre en
developy limpia. Si no lo está, la skill se para antes de hacer nada. - Una operación por invocación:
/git-flow iniciar 12, no «inicia y luego finaliza». allowed-toolscomo lista blanca: sologitygh. Nada derm, nada de escribir ficheros del proyecto.
Práctica: la skill /git-flow
Se parte de la skill que ya enlaza Despliegue 2, git-flow-skill.md, que es casi lo que hace falta. Pedir al agente que la adapte con estos cambios:
- Quitar
release,bajarysubir. Quedan cinco operaciones:
| Operación | Qué hace |
|---|---|
iniciar N | Lee el issue N con gh issue view, deriva el slug del título, crea la rama <alumno>-<N>-<slug> desde develop actualizada y su worktree hermano, y hace push de la rama |
commit | Mira git status y git diff del worktree actual y agrupa los cambios por intención, no por fichero: un commit por cosa hecha, cada uno con type(#N):título. El N lo saca del nombre de la rama. Enseña los commits que va a hacer antes de hacerlos |
actualizar | Trae develop a la rama del worktree actual |
finalizar | actualizar, –squash en develop con el mensaje feat(#N): <título del issue> y Closes #N en el cuerpo, push de develop, borrar rama remota, worktree y rama local |
publicar | develop → main con –ff-only y push de main |
- El nombre del alumno para las ramas se lee de
AGENTS.md(una línea: «las ramas empiezan porlorenzo-»). - Añadir
Bash(gh issue view:*)aallowed-tools. finalizaryactualizardeducen la rama del worktree en el que se ejecutan, como ya hace la skill original.
En el tema 3 iniciar y finalizar crecen para levantar y parar los contenedores, y en el tema 5 finalizar lanza antes la revisión por IA.
Prueba: crear dos issues pequeños (por ejemplo, «Página de inicio con el nombre del proyecto» y «README con cómo arrancar»), iniciarlos los dos, trabajarlos en paralelo en sus dos worktrees, hacer sus commits con /git-flow commit, finalizarlos y comprobar en GitHub que los issues se han cerrado y están en Done. Después /git-flow publicar: main avanza, aunque todavía no despliega nada.
AGENTS.md tiene que decir desde ahora: «git se maneja solo con /git-flow; no ejecutes comandos de git que cambien el repositorio fuera de esa skill». Si no, el agente hará git commit por su cuenta a mitad de una tarea.
