PR (Pull Request)
- Solicitud de incorporación de cambios
- Contribuir a proyectos
- Hacer los cambios mínimos necesarios (ej., arreglar un bug, modificar comentarios, agregar características, etc.) y preferiblemente no hacer todo en un mismo PR
- Si existe otro problema, lo mejor es crear otra PR
- Es posible realizar varios commits (uno arreglando pequeños errores, otro haciendo pequeños cambios, etc.) que se enviarán en un único PR
- GitHub Flow es una estrategia de hacer pequeñas PR pero frecuentes para que se haga merge rápidamente
1. Fork - Bifurcación
- Se realiza en GitHub
- Crea una copia personal de todo el proyecto a contribuir o editar
- Ya que es personal, se pueden hacer todos los cambios necesarios sin que solicite permisos
- Sin el fork y al hacer
git clone, trae el repositorio original y no se puede enviar los cambios porque solicita los permisos para editar ese repositorio
info
Cuando se trabaja en equipo, a veces, no es necesario hacer el fork porque se tiene acceso al repositorio. En cambio, para un proyecto open-source o cualquier otro, generalmente si es necesario.
2. Clonar fork
- Clonar proyecto
git clone xxxxxxx [op-nuevo-nombre-carpeta] --depth=1
depthpara no traer todo el historial de las ramas y commits
- Verificar o agregar el upstream
Upstream es un nombre simbólico para referenciar al proyecto principal, pero puede ser cualquier nombre, y pueden haber varios, por ejemplo si se está trabajando con más compañeros en una misma funcionalidad, hacer un add por cada uno
Verificar o añadir upstream
git remote --verbose
# Si solo muestra el origin y no el upstream, entonces añadirlo
git remote add upstream <url-ssh-o-https-repo>
- origin es el fork
- upstream es el proyecto original
HTTPS
- Pide usuario y contraseña para hacer los cambios
- No configura el
remote --verboseupstream
SSH
- Se deben tener configuradas las keys
- No configura el
remote --verboseupstream
GitHub CLI
- Añade el
remote --verbosede origin y upstream
Sincronizar cambios del upstream
git fetch upstream # Verificar y comparar repositorios
# Trae cambios y los manda a la rama especificada del fork
git pull upstream main
3. Trabajar cambios
Leer documentación para contribuir, ejemplo:
- Archivo CONTRIBUTING.md
- Ver qué gestor de paquetes utiliza e instalar dependencias
- Crear archivos .env
- Testing
- Etc.
4. Commits y PR
1. Crear y moverse a una nueva rama
- No se trabaja sobre la rama principal por seguridad y también porque es necesario actualizar siempre el proyecto para tener los cambios más recientes del upstream
git switch -c "fix-xxxx-issue"
2. Commits
- Verificar si existe script de commits o pre-commits, leer la documentación del proyecto o guardar cambios manualmente si no hay un script o guía para los commits
- Es posible realizar varios commits (uno arreglando pequeños errores, otro haciendo pequeños cambios, etc.) que se enviarán en un único PR
3. Subir rama al fork
git push -u origin "fix-xxxx-issue"
- Si se hace por medio de VSC y la UI entonces puede pregunta si el push es hacia origin (el fork donde sí se tiene acceso) o upstream (el proyecto original donde no se tiene acceso)
4. Crear PR o pull request
VSC
- Después de subir los cambios a GH, VSC puede mostrar una ventana para realizar la solicitud de incorporación (PR) al upstream automáticamente
GitHub
Compare & pull request, compara con el repositorio upstream (muestra el código con las diferencias) y hace una petición de cambios- Agregar titulo y pequeña descripción de los cambios
| repo upstream | main | <== | fork repo | nueva-rama |
|---|---|---|---|---|
| Proyecto principal | Rama a donde se mandan los cambios | Proyecto personal | Rama con los nuevos cambios |
Create pull request, manda los cambiosCrear draft pull requestse crea la PR pero el upstream no puede hacer merge o unir las ramas porque es como un "borrador" hasta que se hayan hecho todos los cambios necesarios
5. Sincronizar repositorios
- Si el upstream acepta los cambios, GitHub muestra un mensaje opcional para borrar la rama que ahora ya se ha unido al proyecto principal
- Sincronizar upstream con el fork. En GitHub con el botón de Sync fork y de forma manual:
Manual
git pull upstream main
git pull otro-user main
# "upstream", es el repositorio remoto principal
# main es la rama donde estan los cambios
git push -u origin main # Subir los cambios al repo
- Si la sincronización si hizo en GitHub entonces se debe actualizar el repositorio local para que coincida con el que está en GH donde ya no existe la rama donde estaban los commits y ya tiene los cambios del upstream
git fetch
git pull