Fusionar la solicitud de extracción en una rama diferente a la predeterminada, en Github

122

Una solicitud de extracción entra en mi repositorio alojado en Github. De forma predeterminada, se fusiona con la masterrama.

¿Hay alguna forma de cambiar en qué rama se fusionarían los cambios?

eoinoc
fuente

Respuestas:

86

A partir del 15.08.2016, GitHub permite cambiar la rama de destino de una solicitud de extracción a través de la GUI. Haga clic en Editjunto al título, luego seleccione la rama del menú desplegable.

captura de pantalla

Ahora puede cambiar la rama base de una solicitud de extracción abierta. Después de haber creado una solicitud de extracción, puede modificar la rama base para que los cambios en la solicitud de extracción se comparen con una rama diferente. Al cambiar la rama base de su solicitud de extracción original en lugar de abrir una nueva con la rama base correcta, podrá mantener un trabajo y una discusión valiosos.

maliayas
fuente
1
Esta debería ser la respuesta correcta a esta pregunta (después de la actualización a GitHub, es decir).
stuxnetting
Esta característica ya no parece existir (a partir del 2018-02-15), ¿verdad? En una solicitud de extracción reciente, la rama de destino se muestra con la misma fuente azul sobre fondo azul claro que el repositorio / rama de origen y ya no es un botón.
cgogolin
12
¡Ah! ¡Lo hace! Primero hay que hacer clic en "Editar" (lo cual no es obvio en la captura de pantalla anterior). Pasé por alto esto. Lo siento.
cgogolin
@cgogolin Gracias por señalar eso. Yo también estaba confundido, hasta que leí tu comentario e hice clic en el botón Editar.
mhucka
Github advierte que "cuando cambias la rama base de tu solicitud de extracción, algunas confirmaciones pueden eliminarse de la línea de tiempo". y "Algunas confirmaciones de la rama base antigua pueden eliminarse de la línea de tiempo". Alguna idea de lo que esto significa?
Matthias Fripp
55

El remitente puede cambiar eso cuando emite la solicitud de extracción, pero una vez que la emite, no puede cambiarla.

Por otro lado, puede fusionar manualmente su rama y empujar, lo que hago con regularidad para las solicitudes de extracción erróneas.

Puede encontrar la hubgema útil para trabajar con los componentes de la solicitud de extracción.

Esa joya concluye el proceso manual, que es:

  1. Agregue un control remoto para la bifurcación a su pago local.
  2. Busca ese control remoto.
  3. git checkout ${target_branch} && git merge ${remote}/${branch}
  4. git push origin ...
Daniel Pittman
fuente
1
Si fusiono y envío manualmente, ¿se dará cuenta Github de que la solicitud de extracción se completó de manera efectiva? ¿Algún consejo sobre cómo fusionar desde un repositorio separado remoto (la bifurcación)?
Eoinoc
3
No estoy seguro, pero no directamente, porque el cambio no se fusionó con la rama de destino, por lo que la solicitud de extracción no se completa como se define. Necesita cerrarlo manualmente. En cuanto a los punteros, consulte el comentario editado.
Daniel Pittman
Recomendaría usar git merge --no-ff ...como menciona @GuillermoMansilla en su respuesta.
jjmontes
3
"Una vez que lo emiten, no se puede cambiar" - ¡Ya no es el caso a partir de agosto de 2016! Vea la respuesta de @maliayas a continuación: stackoverflow.com/a/38985999/12484
Jon Schneider
1
Seguí este procedimiento hoy (3 de marzo de 2017). Descargué la solicitud de extracción en otra rama e hice algunas correcciones adicionales, luego me fusioné con master. Una vez que las confirmaciones de la solicitud de extracción terminaron en maestro, GitHub cerró automáticamente la solicitud de extracción.
Ivan Krivyakov
14

Una alternativa al uso de la gema central mencionada en otras respuestas es usar la línea de comando para fusionar solicitudes de extracción localmente , lo que le permite hacer:

$ git fetch origin
$ git checkout *target_branch*
$ git merge pr/XXX
$ git push origin *target_branch*

Los comandos anteriores solo funcionan directamente si primero agrega la siguiente línea a su .git/configarchivo:

fetch = +refs/pull/*/head:refs/remotes/symbolic_name_origin_or_upstream/pr/*

Lo que hace es permitirle descargar TODAS las solicitudes de extracción. Dado que eso puede no ser deseable para repositorios grandes, GitHub modificó las instrucciones para incluir la git fetch origin pull/ID/head:BRANCHNAMEsintaxis, lo que evita la modificación del archivo de configuración y solo descarga esa única solicitud de extracción.

Grzegorz Adam Hankiewicz
fuente
8

Aunque no puede cambiar la solicitud de extracción existente ya que no es suya, puede crear fácilmente una nueva si el repositorio de origen relacionado aún existe, sí, incluso si es de otra persona.

Vaya al repositorio del remitente y luego cree una nueva solicitud de extracción en su repositorio utilizando las mismas confirmaciones, pero asegúrese de configurar correctamente la rama de destino correcta.

Luego, regrese a su propio repositorio y acepte la nueva solicitud de extracción. ¡Voila!

Deckard
fuente
¿Funciona esto si han cambiado su repositorio? ¿Cómo se asegura que sea "el mismo compromiso"?
ragerdl
@ragerdl: si estás desarrollando usando un modelo de 'característica por rama', entonces puedes crear un PR con una rama contra una rama ascendente, y debe contener las mismas confirmaciones.
geerlingguy
2
La única forma de hacerlo directamente en GitHub, sin acceso a un repositorio local.
kopischke
8

No hay nada de malo en la solución de Daniel Pittman, sin embargo, trataría esas fusiones como "sin avance rápido", es decir, cambiando el paso número 3 por:

git checkout ${target_branch} && git merge --no-ff ${remote}/${branch}

Al usarlo --no-ff, el historial será más fácil de leer. Dirá claramente de $ndónde provienen las confirmaciones $branch, y también te facilitará la vida si necesitas revertir algo hecho en esa rama.

Para responder también a la pregunta de eoinoc y dar un consejo adicional:

Después de hacer la fusión, su git cli le pedirá que escriba un mensaje, generalmente aparecerá un mensaje genérico diciendo algo como

Fusionar la rama de seguimiento remoto 'usuario / su-rama' en su rama

Asegúrese de editar ese mensaje e incluir una referencia al número de solicitud de extracción. Es decir: (asumiendo que el número de solicitud de extracción es 123)

Fusionar la rama de seguimiento remoto 'usuario / su-rama' en su rama

refs # 123 resolviendo lo que sea ...

Entonces, la próxima vez que visite su página de problemas / solicitudes de extracción de github y verifique esa solicitud de extracción en particular, verá su mensaje con un enlace para confirmar dónde realizó la fusión.

Aquí hay una captura de pantalla de lo que quiero decir.

ingrese la descripción de la imagen aquí

Guillermo Mansilla
fuente
6

Para hacer eso, vaya a la página de inicio de su repositorio, haga clic en las ramas y cambie la rama predeterminada de maestra a otra, en mi caso "dev".

Después de eso, cada vez que alguien crea una solicitud de extracción, el mergebotón fusionará automáticamente la solicitud en "dev" en lugar de master.

ingrese la descripción de la imagen aquí

abbood
fuente
gracias por la corrección de errores tipográficos @ the Tin Man Lo aprecio
abbood
4
No es necesario agradecernos por ajustar / editar. Es algo que hacemos por el sitio. Sigue escribiendo buenas respuestas, eso es suficiente.
The Tin Man