¡Hola gente!
Hoy es el día. Hoy, aprovechando que cambiamos de mes, hablaremos de Pull requests. Esto es lo que muchos estábais esperando. Vamos a juntar todo lo aprendido en posts anteriores, echar algún ingrediente más, agitar la mezcla, y ver qué sale. ¡Comenzamos!
Gestión de orígenes remotos
Los orígenes remotos son lugares a los que se envían los cambios (comando push) o se descargan (comando pull) en un repositorio concreto. Un repositorio Git puede tener varios orígenes remotos, o incluso ninguno. Los repositorios que utilizamos en los primeros capítulos de este tutorial tienen 0 orígenes remotos. Los repositorios que clonamos de otro lugar, como GitHub, tienen un origen remoto, llamado origin. Para ver la lista de orígenes remotos, simplemente escribe git remote. Este comando devolverá los nombres de los orígenes, y sólo los nombres. Si, además, queremos las URLs asociadas a cada origen, escribiremos git remote -v. El comando git remote admite varios subcomandos y parámetros. Veamos los más importantes:
- git remote add nombre URL: añade un nuevo origen remoto con el nombre y la URL especificados.
- git remote remove nombre: elimina el origen remoto cuyo nombre hemos pasado.
- git remote rename nombre_viejo nombre_nuevo: renombra un origen remoto.
- git remote update: actualiza todos los orígenes remotos, descargándose sus cambios.
En el siguiente ejercicio, vamos a crear un repositorio completamente vacío en GitHub, y vamos a enviar el reglamento de la sala allí, para que esté bien seguro y no se pierda.
Ejercicio: importar un repositorio externo en GitHub
- Accede a la página web de GitHub.
- Crea un nuevo repositorio. En el campo nombre, escribe Reglas. En la descripción, escribe "Reglamento de la sala de juegos". Haz que el repositorio sea privado, y no marques la casilla de inicializar con un archivo readme, ni ninguna de las que tiene alrededor.
- Cuando termines de crearlo, abre la consola Git Bash. Navega al repositorio reglas, con el que trabajamos en los primeros capítulos.
- Añade como origen remoto el repositorio recién creado en GitHub: git remote add origin git@github.com:usuario/reglas.git
- Envía la rama al origen remoto. Como es la primera vez que lo hacemos, hay que asociarla: git push -u origin master
- Introduce la contraseña de tu clave ssh y espera a que terminen de subirse los cambios.
- Vuelve a la web de GitHub. Pulsa f5 para refrescarla, y observa lo que ha ocurrido. Deberías ver el fichero de reglas allí.
Ahora que hemos terminado de afianzar este concepto, es momento de hablar de pull requests.
Introducción a las pull requests
Una pull request (o solicitud de cambios) es una excelente forma de contribuir con el trabajo de otro autor. A grandes rasgos, el proceso que se realiza es el siguiente:
- Comprobar las pull requests existentes.
- Bifurcar el repositorio en nuestra cuenta.
- Clonar el repositorio.
- Crear una rama temática.
- Realizar cambios en esa rama.
- Enviar los cambios a GitHub.
- Abrir la pull request.
- Participar en la conversación hasta que el autor la fusione o la cierre.
- Estar pendiente de nuestra bifurcación por si hubiera que preparar más pull requests.
Veamos ahora todos los pasos en detalle.
Comprobar las pull requests existentes
Es posible que alguien haya intentado solucionar el problema que nosotros queremos corregir. Por ello, antes de hacer cualquier otra cosa, debemos echar un vistazo a las pull requests abiertas y cerradas que existen en el repositorio. Para llegar hasta allí, se puede pulsar el enlace "Pull requests" que hay en la página del repositorio, o utilizar el formato https://github.com/usuario/repositorio/pulls en la barra de direcciones.
La página con la lista de pull requests es similar a la de incidencias. De hecho, se parecen tanto que podemos buscar las pull requests abiertas y las cerradas igual que hacíamos con las incidencias.
Una pull request es similar a una incidencia. Tiene un comentario inicial explicando qué se ha hecho, varios comentarios de los colaboradores, y puede estar abierta o cerrada. Si está cerrada, puede ser por dos motivos: se ha fusionado o se ha rechazado. Las pull requests aceptadas tienen la palabra "merged" por algún sitio. Aparte de todo lo que comparten con las incidencias, en la página de cada pull request se puede encontrar un breve resumen indicando cuántos commits tiene y cuántos archivos han cambiado.
Si se añade el sufijo .patch a la barra de direcciones, aparecerán en texto plano todas las diferencias. El formato es el mismo que vimos con git show: las líneas precedidas con un guión se han eliminado, y las que llevan el signo + delante se han añadido.
Si no encontramos a nadie que haya hecho algo parecido a lo que pretendemos hacer, continuamos.
Bifurcar el repositorio en nuestra cuenta
Una bifurcación es un proceso que nos permite hacer una copia íntegra de un repositorio, con todas sus ramas y etiquetas, en nuestra cuenta. De esa forma, podemos tratarlo como si fuera nuestro. GitHub identifica los repositorios bifurcados con el texto "Forked from", seguido de la ruta al repositorio original. De esta manera, se sabe su lugar de procedencia. Para bifurcar un repositorio, accede a su página principal y busca un botón llamado "Fork". Cuando lo pulses y confirmes la acción, el repositorio aparecerá en tu cuenta de usuario y la página se actualizará para dirigirte allí.
Clonar el repositorio
Ahora que tenemos el repositorio alojado en nuestra cuenta, vamos a clonarlo para hacer modificaciones sobre él. Como nuestro objetivo es enviar cambios al servidor, lo clonaremos por ssh:
git clone git@github.com:nuestracuenta/repositorio.git
Crear una rama temática
Por defecto, el repositorio clonado estará en la rama master o main. Podríamos lanzar la pull request desde aquí, pero es algo que no interesa por varios motivos:
- El autor puede mezclar cambios en master y hacer que nuestra copia quede obsoleta.
- Sólo podríamos hacer una pull request, y no podríamos seguir hasta que quedase cerrada o fusionada.
Por ello, conviene crear una rama adicional y trabajar sobre ella.
La creamos con un comando como este. La llamaremos micambio: git branch micambio
Ahora, nos movemos hacia ella: git checkout micambio
Realizar cambios en esa rama
A la hora de hacer cambios, debemos buscar un objetivo concreto. No podemos ir corrigiendo cosas aquí y allá. Debemos evitar eso de "Ya que estoy, voy a arreglar esto también". Si queremos realizar varios cambios no relacionados entre sí, emplearemos varias ramas y pull requests. Si realizamos un mismo cambio que afecta a varias zonas del repositorio (por ejemplo en código, traducciones y documentación), haremos varios commits, uno por área afectada.
Como siempre, al acabar, añadimos los archivos modificados para hacer commit: git add --all
Finalmente, los confirmamos: git commit -m "Corregido un problema que impedía ajustar la cuadratura del círculo"
Enviar los cambios a GitHub
En el apartado anterior vimos una versión extendida del comando git push, que debemos usar siempre con las ramas nuevas. Este caso no será una excepción. Para enviar las modificaciones de la rama micambio, ejecutaremos un comando como este: git push -u origin micambio
GitHub creará la rama micambio en el servidor, y nos devolverá por consola la URL a la que debemos dirigirnos desde el navegador para hacer la pull request. Será algo similar a esto: https://github.com/micuenta/repositorio/pull/new/micambio
Abrir la pull request
Al visitar la URL devuelta en el apartado anterior, aterrizaremos en una página similar a la de creación de incidencias. Si la pull request contiene un sólo commit, GitHub intentará rellenar el título y la descripción con los contenidos del mensaje del commit, algo que no nos interesa el 99% de las veces. Al igual que sucedía con las incidencias, podemos encontrarnos campos de descripción que vienen previamente rellenos con una plantilla a la que nos tendremos que ajustar.
El título debe ser breve y descriptivo, transmitiendo lo necesario para que el autor sepa de qué trata la pull request que le estamos enviando. En la descripción podemos extendernos más, indicando qué se ha hecho en cada commit, por qué se ha hecho, qué beneficios aporta, si tiene alguna desventaja, etc. Se puede usar tanto texto plano como sintaxis Markdown, y mencionar a otros usuarios anteponiendo el signo arroba (@).
Cuando terminemos, pulsamos el botón "Create pull request". A partir de este momento, sólo nos queda esperar y prestar atención.
Participar en la conversación hasta que el autor la fusione o la cierre
Esta etapa es opcional. Dependiendo del autor, la importancia del cambio y las dudas de los colaboradores, puede no existir o durar mucho. El autor puede pedirnos que justifiquemos algún cambio, para lo que contestaremos por correo electrónico o en un comentario. También puede pedirnos que hagamos algún cambio, ya sea para corregir un fallo potencial, ajustar el código al estilo propuesto, o cualquier otra cosa. En este último caso, podremos hacer commit en nuestro repositorio local y ejecutar git push. Los cambios que hagamos en la rama de la pull request (en este caso, micambio) se reflejarán en la solicitud abierta.
La pull request puede finalizar de dos maneras, como ya hemos explicado antes:
- Closed: el autor no la acepta.
- Merged: el autor la acepta. Lógicamente, este es el mejor resultado posible, ya que habremos logrado colaborar con el proyecto.
En esta fase, el receptor de la pull request tiene dos botones a su disposición: uno para cerrarla, muy similar al que vimos en las incidencias, y otro para fusionarla, llamado "Merge pull request". Tras pulsarlo, aparecerá un diálogo de confirmación. Para finalizar la fusión, se debe pulsar el botón "Confirm merge".
Estar pendiente de nuestra bifurcación por si hubiera que preparar más pull requests
Aunque el repositorio del proyecto se actualice y reciba nuevos cambios, la bifurcación que hemos hecho en nuestra cuenta no lo hará. Debemos prestar atención y ocuparnos nosotros. De esa forma, al abrir una nueva pull request, estará basada en los cambios más recientes. Para mantener actualizado el repositorio, sigue estos pasos:
- Vuelve a la rama master o main, según sea el caso: git checkout master
- Añade como origen remoto el repositorio del autor. Como no podemos manipularlo, puede ser más práctico usar https, ya que así nos ahorramos la contraseña de la clave ssh. Podemos llamar al nuevo origen como queramos, por ejemplo upstream: git remote add upstream https://github.com/usuario/repositorio.git
- Cada cierto tiempo, actualiza la rama master desde el nuevo origen. Para ello, se puede usar una versión extendida del comando git pull: git pull upstream master
- Envía los cambios a tu copia bifurcada: git push
¡Esto es todo por hoy! Espero que os haya gustado. Ya nos falta poco para acabar la serie de tutoriales introductorios. En el próximo capítulo, hablaremos de releases y del archivo .gitignore. A partir de ahí, vosotros decidiréis por dónde continuar.
¡Hasta la próxima!