Solicitud de incorporación de datos de Git Fetch: competencia desbloqueada

Hoy en día, aplicar una corrección a un proyecto es tan fácil como crear una bifurcación, que genera una copia remota completa del proyecto para que realices modificaciones, seleccionando el archivo que quieres cambiar, pulsando Editar y confirmando las correcciones.
¿Pero qué pasa si estás en el extremo receptor de una solicitud de incorporación de cambios (abreviada como RP en el siguiente ejemplo)? Usar una interfaz de usuario web sofisticada es genial y, a menudo, eso es todo lo que necesitas. Basta con hacer clic en un botón para Aprobar, hacer clic en un botón para Fusionar y listo.
¡Pero no siempre es así! Es común tener que descargar los cambios incluidos en una solicitud de incorporación de cambios (PR) localmente, ejecutar algunas pruebas y ver qué aspecto tienen en tu IDE para entender lo que se ha hecho.
Los pasos para descargar (más explícitamente fetch y checkout) las solicitudes de incorporación de cambios de tu compañero o colaborador son conceptualmente sencillos, y aún son más fáciles si conoces un par de detalles y consejos importantes.
Así que déjame guiarte para que entiendas mejor las facilidades de la línea de comandos que git te proporciona para que gestiones las solicitudes de incorporación de cambios con soltura.
Antes de empezar: mejora el símbolo del shell con el nombre y el estado de la rama
Siempre me sorprende la cantidad de personas que tienen un símbolo del sistema vacío que no muestra la rama git en la que se encuentran o si tienen archivos modificados o sin confirmar en su directorio de trabajo. Si has pensado "¡Yo soy uno de esos!", déjame que te ayude. ¡Te quedarás boquiabierto!
Hazte un favor e instala algo tan impresionante como el símbolo líquido, que te proporcionará excelentes anotaciones sobre el estado de tu directorio de trabajo de git (y también admitirá cualquier otro VCS):

(En la captura de pantalla anterior, mi símbolo me alerta de que estoy en la rama newbranch, he añadido 5 líneas a los archivos que rastreo en mi directorio de trabajo y he eliminado 0)
Todo el equipo trabaja en el mismo repositorio
Si trabajas en el mismo repositorio con tu equipo, el proceso de extraer una solicitud de incorporación de cambios es muy sencillo: simplemente ejecuta fetch y checkout para recuperar y extraer la rama desde la que se creó la solicitud:
Obtén todas las ramas que se publicaron en tu repositorio compartido:
git fetch originCrea una rama local que haga un seguimiento de la rama remota que te interesa:
git checkout -b PRJ-1234 origin/PRJ-1234Ahora puedes ejecutar
diffomerge, o poner a prueba tu corazón con esto:
git diff main ./run-tests.shCuando estés satisfecho, vuelve a la interfaz de usuario web y deja tus comentarios o aprueba el cambio directamente.
Colaboradores que trabajan en sus propias bifurcaciones
El proceso cambia un poco cuando algunos de los colaboradores trabajan en bifurcaciones separadas. En este caso, puedes ejecutar fetch para recuperar la rama remota en la que se ha confirmado la contribución o la función:
Añade primero la rama remota del colaborador:
git remote add jsmith http://bitbucket.org/jsmith/coolproject.gitRecopila primero todas las actualizaciones más recientes de
originen tu repositorio principal:
git checkout main git fetch origin git merge mainObtén todas las ramas que se han publicado en la bifurcación del colaborador:
git fetch jsmithCrea una rama local que haga un seguimiento de la rama remota que te interesa:
git checkout -b jsmith-PRJ-1234 jsmith/PRJ-1234Ahora puedes ejecutar
diffomerge, o poner a prueba tu corazón con esto:
git diff main ./run-tests.shReducir el trabajo mediante referencias de solicitud de incorporación de cambios
Aunque lo anterior funciona, hay varias cosas que pueden empeorarlo todo:
¿Qué pasa si tienes muchos colaboradores y cada uno de ellos tiene sus propias bifurcaciones? Añadir todas las bifurcaciones y gestionarlas por separado es muy poco práctico.
¿Qué pasa si ni siquiera tienes acceso a algunas de las bifurcaciones y no puedes extraer la rama de origen?
La solución a las dos incidencias anteriores es usar referencias de solicitudes de incorporación de cambios que algunos servidores git proporcionan. El procedimiento que mostraré es compatible con algunos servidores git y varía ligeramente según el que utilices. A continuación, explicaré cómo ejecutar fetch para recuperar todas las solicitudes de incorporación de cambios en Stash (ahora llamado "Bitbucket Data Center") y GitHub.
No temas a las referencias de especificaciones
El primer requisito previo es familiarizarse con las referencias de especificaciones. Las referencias de especificaciones son geniales y no deberías temerlas. Consisten en asignaciones simples desde ramas remotas a referencias locales, en otras palabras, una forma sencilla de decirle a git que "esta rama remota (o este conjunto de ramas remotas) debe asignarse a estos nombres localmente en este espacio de nombres".
Por ejemplo, un comando como:
git fetch +refs/heads/main:refs/remotes/origin/mainAsignará la rama remota main de tu rama remota origin a una rama origin/main local para que puedas escribir:
git checkout origin/mainY además hará referencia a esa rama remota. El signo más (+) de la definición indica que queremos que git actualice la referencia incluso si no es de avance rápido.
La forma en que usamos esto para descargar todas las solicitudes de incorporación de cambios consiste en asignar el modo en que el repositorio remoto almacena los HEAD de dichas solicitudes y los asigna a un espacio de nombres local para facilitar su consulta.
Por lo tanto, siempre que tengas un repositorio remoto origin (o upstream) definido, esto es lo que debes hacer.
Nota: Como han señalado con razón varios desarrolladores de Stash (ahora llamado "Bitbucket Data Center"), las referencias que mostraré a continuación se consideranundocumented y private, y podrían cambiar en cualquier momento.
Descargar todas las solicitudes de incorporación de cambios: Stash
Bifurca un repositorio.
Clona la bifurcación localmente:
git clone git@stash.atlassian.com:durdn/tis.gitAñade el repositorio original upstream como
upstream.
git remote add upstream git@stash.atlassian.com:tpettersen/tis.gitObtén los heads más recientes del mantenedor "upstream":
git fetch upstreamAñade la
refspec(referencia de especificación) que asignará los HEAD de solicitudes de incorporación de cambios a un espacio de nombresprlocal. Puedes hacerlo con un comandoconfig:
git config --add remote.origin.fetch '+refs/pull-requests/*/from:refs/remotes/origin/pr/*'Si echas un vistazo a
.git/config, las entradasfetchtienen este aspecto:
[remote "upstream"]
url = git@stash.atlassian.com:docker/libswarm.git
fetch = +refs/heads/*:refs/remotes/upstream/*
fetch = +refs/pull-requests/*/from:refs/remotes/upstream/pr/*Ahora puedes ejecutar
fetchpara recuperar todas las ramas de solicitudes de incorporación de cambios fácilmente:
$ git fetch upstream
remote: Counting objects: 417, done.
remote: Compressing objects: 100% (274/274), done.
remote: Total 417 (delta 226), reused 277 (delta 128)
Receiving objects: 100% (417/417), 105.28 KiB | 0 bytes/s, done.
Resolving deltas: 100% (226/226), done.
From stash.atlassian.com:docker/libswarm
* [new ref] refs/pull-requests/10/from-> upstream/pr/10
[...]
* [new ref] refs/pull-requests/100/from -> upstream/pr/100
* [new ref] refs/pull-requests/101/from -> upstream/pr/101
[...]
* [new ref] refs/pull-requests/109/from -> upstream/pr/109
* [new ref] refs/pull-requests/110/from -> upstream/pr/110
[...]Ahora, para cambiar a una solicitud de incorporación de cambios concreta, basta con hacer lo siguiente:
git checkout pr/102Descargar todas las solicitudes de incorporación de cambios: GitHub
Si las bifurcaciones o los repositorios upstream están en GitHub, funciona exactamente igual que en el ejemplo anterior, pero el comando config cambia a:
git config --add remote.origin.fetch '+refs/pull//head:refs/remotes/origin/pr/'Y la rama remota de .git/config cambiará para incluir una configuración de fetch adicional para asignar los HEAD de solicitudes de incorporación de cambios a un espacio de nombres local llamado pr:
[remote "upstream"] url = git@github.com:docker/libswarm.git fetch = +refs/heads/*:refs/remotes/upstream/* fetch = +refs/pull/*/head:refs/remotes/upstream/pr/*Obtener una sola solicitud de incorporación de cambios mediante referencias
Si no quieres configurar las entradas de fetch en tu .git/config y solo quieres acceder rápidamente a una solicitud de incorporación de cambios, basta con un solo comando:
Extrae una sola solicitud de incorporación de cambios en Stash:
git fetch refs/pull-requests/your-pr-number/from:local-branch-nameExtrae una sola solicitud de incorporación de cambios en GitHub:
git fetch refs/pull/your-pr-number/head:local-branch-nameY si terminas usando mucho lo anterior, puedes agilizar el proceso creando un alias de git:
# For Stash
git config alias.spr '!sh -c "git fetch origin pull-requests/${1}/from:pr/${1}" -'
# For Github
git config alias.gpr '!sh -c "git fetch origin pull/${1}/head:pr/${1}" -'Con ese alias configurado, se puede recuperar una solicitud de incorporación de cambios (gracias a inuit) con un sencillo:
Conclusión
Controlar el trabajo de tus compañeros o colaboradores es fácil una vez que has creado un par de alias sencillos o has añadido las especificaciones de referencia adecuadas a tu .git/config.