Close

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

Primer plano de Nicola Paolucci
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)

Logotipo de Git
Material relacionado

Instalar Git

Logotipo de Bitbucket
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 o merge, 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 o merge, 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 Server) 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 Server), 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 nombres pr local. Puedes hacerlo con un comando config:
git config --add remote.origin.fetch '+refs/pull-requests/*/from:refs/remotes/origin/pr/*'
  • Si echas un vistazo a .git/config, las entradas fetch 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:

Conclusiones


¡Espero que te haya resultado útil! Al final, 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. Responderé con gusto a cualquier duda que puedas tener en Twitter en @durdn o @AtlDevtools.

Nicola Paolucci

Nicola is an all-round hacker who loves exploring and teaching bleeding edge technologies. He writes and talks about Git, development workflows, code collaboration and more recently about Docker. Prior to his current role as Developer Instigator at Atlassian he led software teams, built crowd sourcing applications for geo-spacial data, worked on huge e-commerce deployments. Little known facts about Nicola: he gesticulates a lot while speaking (being Italian), lives in Amsterdam and rides a Ducati.


Compartir este artículo

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.

Gente que colabora utilizando un muro lleno de herramientas

Blog de Bitbucket

Ilustración de Devops

Ruta de aprendizaje de DevOps

Demostraciones de funciones con expertos de Atlassian del Centro de demostraciones

Cómo funciona Bitbucket Cloud con Atlassian Open DevOps

Suscríbete para recibir el boletín de DevOps

Thank you for signing up