Cómo abrir múltiples solicitudes de extracción en GitHub

139

Cuando abro una solicitud de extracción en GitHub .
Todos los commits desde mi última solicitud y todos los nuevos se agregan automáticamente a esta solicitud .

Parece que no puedo controlar qué commits se agregan y cuáles no.
Cuando intento abrir otra solicitud de extracción, aparece el error "¡Vaya! Ya hay una solicitud de extracción".

¿Hay alguna manera fácil de abrir múltiples solicitudes de extracción sin tener que perder el tiempo con la línea de comando?

torourke
fuente

Respuestas:

116

Las solicitudes de extracción se basan en una rama.
La única forma de abrir una solicitud de extracción para múltiples confirmaciones es:

  1. Aislarlos en su propia rama .
  2. Abra las solicitudes de extracción desde allí.
mipadi
fuente
3
Ok, eso es genial, pensé que era solo con el maestro. Entonces, lo que quieres decir es que puedo crear muchas ramas (es decir: características de flujo de git) y hacer solicitudes de extracción para cada una de ellas ... ¡Voy a probar!
Ziyan Junaideen
8
Acabo de descubrir que la rama conserva el historial de las confirmaciones anteriores, por lo que una solicitud de extracción contra la cadena ascendente todavía incluye todas las confirmaciones.
anguila ghEEz 01 de
2
Hola @ anguila, ¿te diste cuenta de qué hacer al respecto? ¿Cómo crear relaciones públicas aisladas sin que se muestren los cambios de otras ramas?
Jonathan Cross
3
Esto no resuelve el problema: cuando trato de crear un RP, se comparan ambas ramas (con al menos una confirmación cada una). ¿Qué estoy haciendo mal?
MERose
1
@eelghEEz Debe crear una nueva rama, seleccione todas las confirmaciones que desee para esta rama y luego haga una solicitud de extracción desde esta rama. Es una característica de diseño muy importante de git que cada confirmación depende de su confirmación anterior, y las confirmaciones en git no deben considerarse solo como un parche, sino como un parche que sabe qué parche se aplicó antes. Entonces, esta es la razón por la que uno debería crear una nueva rama con nuevos commits, cuyas diferencias quizás sean las mismas, pero cuyos enlaces a los commits anteriores son diferentes.
MD
11

La forma más fácil que he encontrado para hacer esto es con el comando hub ( https://github.com/defunkt/hub ).

Desde su rama de tema ("característica" en este ejemplo) para el que desea crear una solicitud de extracción, puede ejecutar:

git pull-request

(¡recuerda empujar tu rama primero!)

Y abrirá una nueva solicitud de extracción en GitHub para "YOUR_USER: feature".

Si ya ha creado un problema en GitHub, incluso puede adjuntar una solicitud de extracción a ese problema existente (algo que no puede hacer desde la interfaz de usuario web):

$ git pull-request -i 123
[ attached pull request to issue #123 ]
Tyler Rick
fuente
2

En realidad PUEDES hacer esto sin crear otra rama, pero se necesita un poco de tiempo para jugar.
Aquí están los pasos:

  1. Identifique los dos rangos de confirmación que desea extraer. Esto es lo que usaré para un ejemplo:
    (otro / maestro) A -> B -> C -> D -> E (tuyo / maestro)
    Digamos que quieres extraer B y C en una solicitud, y D & E en otro.
  2. Haga una solicitud de extracción. Haga que el lado izquierdo ("Base") sea commit A. Para el lado derecho ("head"), escriba el número de compromiso de C.
  3. Escriba la descripción para su primera solicitud.
  4. Haz otra solicitud. Para la base, escriba el número de confirmación de C y para la cabeza, escriba E (el suyo / maestro).
  5. Escribe la descripción.

Tal como lo veo, la solicitud de extracción ve el compromiso C como un punto de ramificación. O algo.

Riking
fuente
Debe dejar otro / maestro como el lado izquierdo, incluso si está agregando un número de confirmación del suyo / maestro. Además, este método no le permite agregar nuevas confirmaciones a la solicitud de fusión, en caso de que se necesiten más cambios.
frisco
Publiqué una especie de seguimiento de esta respuesta, en contraste con alguna información sobre Github, consulte stackoverflow.com/questions/23159860
Mark Bennett
Puedo ver que esto crearía dos relaciones públicas que parecen correctas, ya que cada una contenía exactamente las confirmaciones deseadas. Pero, para ser explícitos, ¿hace lo correcto cuando se fusionan? Como en, puedo ver que el primer PR combinaría correctamente B & C en otro / maestro. Pero cuando se fusiona el 2º RP, ¿cómo sabe en qué rama fusionarse? (Dado que se creó en commit 'C', no en otro / master) ¿Importa en qué orden se fusionan los RP? (presumiblemente)
Jonathan Hartley
1

Cuando inicialmente va a crear la solicitud de extracción, si abre dos formularios separados para una nueva solicitud de extracción, le permitirá crearlos siempre que apunten a diferentes ramas para fusionar. Por ejemplo, podría hacer dos solicitudes separadas, una para fusionar en master y otra para fusionar en test.

BeanyTheSane
fuente
1

Soy nuevo en Git y GitHub y tenía la misma pregunta que el OP.

He encontrado una solución, que probablemente no estaba disponible en el momento del OP.

Situación: tiene 3 cambios y desea que cada uno se base en el anterior y que cada uno tenga su propia solicitud de extracción (PR).

Problema: cuando crea el primer RP que intenta convertir el desarrollo en maestro, todo se ve bien, pero luego de realizar los cambios para el segundo RP y fusionarlos (usando la misma rama) todos los cambios están en el mismo RP .

Mini solución: crear una nueva sucursal

git branch mini_change_2
git checkout mini_change_2

Ahora inserta el código en GitHub y crea el PR, pero el valor predeterminado es Pull de mini_change_2 a master, excepto que master aún no tiene los cambios del primer PR, por lo que incluye todos los cambios de PR1 y PR2.

La mejor solución: especifique a qué rama se está fusionando en PR2.

No solo acepte los valores predeterminados al crear el segundo PR, digamos que va a tirar mini_chnage_2 para desarrollar, esto solo mostrará los cambios en mini_change_2

Ahora cree una nueva rama mini_change_3 y PR que mini_change_3.

El problema surge una vez que comienzas a fusionarlos ... pero ese es un ejercicio diferente.

markwusinich
fuente