El flujo de solicitud de cambios


Has estado trabajando en una función en tu propia rama, y está lista. El proyecto es compartido: otras personas también hacen commits en él, así que no envías directamente a main con los dedos cruzados. Quieres que el cambio sea revisado, discutido si es necesario, y fusionado de una manera que todo el equipo pueda ver. Todo ese camino, desde una rama en tu máquina hasta que el código llegue a main, es el flujo de solicitud de cambios, y es cómo casi todos los equipos en GitHub introducen cambios. La parte de Git utiliza solo comandos de capítulos anteriores, una rama, un commit y un envío:
$ git switch -c add-five-day-forecast
Switched to a new branch 'add-five-day-forecast'
$ git add src/forecast.js
$ git commit -m "Add five-day forecast panel"
$ git push -u origin add-five-day-forecast
Branch 'add-five-day-forecast' set up to track 'origin/add-five-day-forecast'.Ese envío coloca tu rama en GitHub. Nada se ha fusionado aún, y ni siquiera se ha propuesto nada para revisión. El siguiente paso, abrir la solicitud de cambios, ocurre en el sitio web de GitHub.
Qué sucede cuando abres una solicitud de cambios
En GitHub, después de un envío como el anterior, normalmente verás un banner ofreciendo comparar tu rama nueva contra main. Haz clic en él, escribe un título y una breve descripción de qué cambió y por qué, y abre la página que crea. Esa página es una solicitud de cambios, a menudo abreviada como PR: una solicitud para fusionar una rama en otra, con una conversación continua adjunta.
Una solicitud de cambios propone una fusión y espera aprobación. Alguien, quizás tú, quizás un compañero de equipo, lee el cambio, deja comentarios, y solo lo fusiona una vez que se ve bien. Hasta que eso suceda, tu rama y main permanecen exactamente como estaban antes de abrir la página.
Fork vs rama
Abrir una solicitud de cambios desde una rama funciona cuando tienes acceso de escritura al repositorio, que es el caso normal en los proyectos de tu propio equipo. Contribuir a un proyecto al que no tienes acceso de escritura requiere un paso extra: un fork, tu propia copia del repositorio bajo tu propia cuenta de GitHub.
Creas ramas y haces commits dentro de tu fork exactamente como lo harías en un proyecto que posees, envías a tu fork, y luego abres la solicitud de cambios desde la rama de tu fork de vuelta al repositorio original. GitHub compara entre los dos repositorios de la misma manera que compara dos ramas dentro de un repositorio, así que el flujo de revisión y fusión se ve idéntico de cualquier forma.
Haciendo que tu solicitud de cambios pase revisión
Una vez que una PR está abierta, se convierte en una conversación continua sobre el diff. Un revisor lee el cambio, deja comentarios en líneas específicas, y aprueba o solicita cambios. Cuando se solicitan cambios, sigue haciendo commits y envíos a la misma rama: cada envío actualiza la misma PR en lugar de crear una nueva. Una vez que un revisor aprueba y cualquier verificación requerida pasa, la PR está lista para fusionarse.
Por qué una solicitud de cambios no se fusionará
A veces el botón de fusión en una PR está atenuado, y GitHub muestra un mensaje en su lugar: "Esta rama tiene conflictos que deben resolverse" o "Esta rama está desactualizada con respecto a la rama base." Ambos mensajes describen un estado normal y solucionable: main ha avanzado desde que creaste la rama, normalmente porque la PR de otro se fusionó mientras tanto, y tu rama necesita ponerse al día antes de que GitHub pueda combinar las dos limpiamente. Esto sucede en cualquier proyecto con más de un contribuidor, así que espéralo en lugar de temerlo.
Soluciónalo localmente de la misma manera que traerías cualquiera de dos ramas juntas:
$ git switch add-five-day-forecast
$ git fetch origin
From github.com:carlos-mendez/weather-app
9f8e7d6..b7c9e21 main -> origin/main
$ git merge origin/mainSi nada se superpone, la fusión se completa por sí sola y haces un envío, y la PR se actualiza y el botón se desbloquea. Si las mismas líneas cambiaron en ambos lados, Git marca el conflicto en el archivo para que lo resuelvas exactamente como se cubre en Fusión y conflictos: abre el archivo, edita los marcadores de conflicto al resultado que quieres, luego git add y git commit para terminar la fusión, y envía de nuevo.
Una solicitud de cambios atascada necesita ponerse al día o resolver su conflicto.
main o tiene un conflicto con ella. Nada está roto. Cambia a tu rama, obtén, y fusiona main, resolviendo cualquier conflicto de la misma manera que lo harías en cualquier lugar, luego envía de nuevo. Qué es una solicitud de cambios, bajo el capó
Una solicitud de cambios no es un objeto de Git, y no hay un comando git que la cree. Git y GitHub no son la misma cosa: Git solo sabe sobre commits, ramas, y otras refs (una ref es un nombre que apunta a un commit). GitHub construye toda la página de PR, los comentarios, y el botón de fusión encima de dos refs que compara: tu rama (el head) y la rama en la que estás fusionando (la base, normalmente main). Esa comparación es por qué abres una solicitud de cambios en el sitio web de GitHub (o a través de la herramienta de línea de comandos de GitHub o API), y nunca con un comando plano git.

