Solicitud de incorporación de datos de Git Fetch: competencia desbloqueada
Nicola Paolucci
Experto en desarrollo
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
)
Material relacionado
Instalar Git
VER LA SOLUCIÓN
Aprende a usar Git con Bitbucket Cloud
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 origin
- Crea una rama local que haga un seguimiento de la rama remota que te interesa:
git checkout -b PRJ-1234 origin/PRJ-1234
- Ahora puedes ejecutar
diff
omerge
, o poner a prueba tu corazón con esto:
git diff main ./run-tests.sh
- Cuando 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.git
- Recopila primero todas las actualizaciones más recientes de
origin
en tu repositorio principal:
git checkout main git fetch origin git merge main
- Obtén todas las ramas que se han publicado en la bifurcación del colaborador:
git fetch jsmith
- Crea una rama local que haga un seguimiento de la rama remota que te interesa:
git checkout -b jsmith-PRJ-1234 jsmith/PRJ-1234
- Ahora puedes ejecutar
diff
omerge
, o poner a prueba tu corazón con esto:
git diff main ./run-tests.sh
Reducir 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/main
Asignará la rama remota main
de tu rama remota origin
a una rama origin/main
local para que puedas escribir:
git checkout origin/main
Y 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 consideran undocumented
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.git
- Añade el repositorio original upstream como
upstream
.
git remote add upstream git@stash.atlassian.com:tpettersen/tis.git
- Obtén los heads más recientes del mantenedor "upstream":
git fetch upstream
- Añade la
refspec
(referencia de especificación) que asignará los HEAD de solicitudes de incorporación de cambios a un espacio de nombrespr
local. 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 entradasfetch
tienen 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
fetch
para 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/102
Descargar 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-name
- Extrae una sola solicitud de incorporación de cambios en GitHub:
git fetch refs/pull/your-pr-number/head:local-branch-name
Y 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
.
Compartir este artículo
Tema siguiente
Lecturas recomendadas
Consulta estos recursos para conocer los tipos de equipos de DevOps o para estar al tanto de las novedades sobre DevOps en Atlassian.