====== Pull Requests ====== Sección perteneciente al curso [[informatica:programacion:cursos:control_version_git_avanzado|Control de versiones con Git Avanzado]]. ===== Introducción ===== Las //pull requests// son un sistema de revisión del código que se utiliza en equipos muy grandes o donde cualquier persona puede colaborar. Se basa en que, como desarrollador, yo no voy a poder hacer un //merge// a develop sino que abriremos una solicitud al equipo de revisión para que mire el código de mi rama y, si todo va bien, la vuelquen a develop. ===== Creación de pull request y discusión del código ===== En equipos pequeños, la metodología es, como desarrollador, vamos contribuyendo al proyecto a través de la rama //develop//. Sin embargo, en equipos más grandes o proyectos //open source//, se suele utilizar el método de las //pull requests//. El código no se sube directamente a //develop// sino que alguien tiene que revisarlo y luego hacer //merge// a //develop//. El repositorio remoto se configura de manera que los desarrolladores pueden descargarse la rama //develop//, pero no subirla (hacer el //merge//), es decir, tiene permiso de solo lectura. Las //pull requests// existen en el servidor, no en nuestros equipos locales. Hay un encargado (o varios) de revisar las peticiones PR (//pull request//) y de realizar el merge de las ramas a develop. Cuando abrimos una //pull request//, subimos nuestra rama de //feature// e indicamos que esa rama la queremos fusionar con develop. Puede abrirse un espacio de discusión sobre el código. Cuando se haya aceptado y fusionado nuestra //pull requests//, se nos notificará y nosotros, en nuestro repositorio local tendremos que actualizar: git pull develop Entonces, podremos borrar nuestra rama local //feature//. ===== Pull Requests: caso práctico ===== Creamos un repositorio remoto. Si somos nosotros los encargados de los //pull request//, vamos a nuestro repositorio local, iniciamos un repositorio git y añadimos el repositorio remoto: git init git remote add origin Creamos una rama y la subimos: git checkout master git push -u origin master Ahora creamos y vamos a la rama //develop//: git checkout develop La subimos y pedimos que la //trackee//: git push -u origin develop Ahora que en el repositorio remoto hay ramas, hay que irse a las opciones y buscar los permisos de las ramas. Entonces, estableceremos que la rama //develop// tendrá permisos de escritura para el administrador y que los usuarios que seleccionemos tendrán permiso para fusionar a través de //pull requests//. La rama //master// debería quedar configurada para que no permita //pull requests// y que solo un administrador pueda hacer cambios en ella. En nuestro repositorio local, trabajamos sobre una rama, por ejemplo ''feature/titulo'' y la subo al repositorio remoto: git push -u origin feature/titulo En el repositorio remoto abriremos una pull request. Lo primero es indicar la rama origen (''feature/titulo'') y la rama destino (''develop'') y luego completar información como el commit y quién la va a revisar. Al revisor le llegará la //pull request// y podrá revisar los cambios. Si está todo correcto, puede aprobarla y finalmente hacer la fusión. Se avisará al desarrollador que pidió la //pull request//, así que podrá actualizar en local: git checkout develop git pull Y podremos borrar la rama local: git branch -d feature/titulo ===== Pull Requests con conflictos ===== Cuando una //pull request// pueda generar algún conflicto, este no se puede solucionar en el repositorio remoto. No será posible hacer el //merge// en remoto. Hay que resolver en local. El desarrollador se descargará la rama que crea el conflicto y hará un //rebase// de su rama a //develop//. Este //rebase// encontrará el conflicto, el desarrollador lo resolvería y luego subiría la rama. ===== Conclusión ===== En un equipo que trabaje con //pull request// debemos tener claro el flujo de trabajo: creamos una rama local temporal, la subimos, creamos la pull request en el servidor indicando de qué rama a qué rama queremos la fusión. Al cerrarse la pull request, podremos descargarnos la rama develop y borrar mi rama temporal. ===== Recursos ===== * Capítulo del libro Pro Git sobre contribuciones a proyectos en GitHub: * [[https://git-scm.com/book/en/v2/GitHub-Contributing-to-a-Project|Inglés]] * [[https://git-scm.com/book/es/v2/GitHub-Participando-en-Proyectos|Castellano]] * [[https://www.atlassian.com/git/tutorials/making-a-pull-request|Artículo "Making a Pull Request"]] * [[https://docs.gitlab.com/ee/gitlab-basics/add-merge-request.html|Artículo "How to create a merge request"]] * [[https://hackernoon.com/understanding-git-2-81feb12b8b26|Artículo "Understanding Git (part 2) — Contributing to a Team"]]