¿Cómo aplicar solicitudes de extracción ascendentes no fusionadas de otros tenedores en mi tenedor?

466

Un proyecto en GitHub del que tengo una bifurcación tiene una nueva solicitud de extracción que quiero incluir en mi bifurcación que el autor aún no ha incluido.

¿Hay una manera simple de aplicar la solicitud de extracción de otros tenedores en mi tenedor? ¿Hay algo más aquí que me estoy perdiendo?

Puerro
fuente
8
Hay una instrucción: gist.github.com/piscisaureus/3342247
Piotr Migdal
¿Esto se refleja en el gráfico de red en GitHub si usa comandos git para hacerlo?
ADTC
También podría ser interesante encontrar todas las ramas: stackoverflow.com/q/47798937/10245
Tim Abell

Respuestas:

276

Puede hacerlo manualmente con bastante facilidad:

  • agregue la otra bifurcación como control remoto de su repositorio:

    git remote add otherfork git://github.com/request-author/project.git
    
  • buscar los compromisos de su repositorio

    git fetch otherfork
    
  • Entonces tiene dos opciones para aplicar la solicitud de extracción (si no desea elegir la selección 1.)

    1. Si no le importa aplicar también las confirmaciones eventuales que se han agregado entre el origen y la solicitud de extracción, puede cambiar el nombre de la rama en la que se formó la solicitud de extracción

      git rebase master otherfork/pullrequest-branch
      
    2. Si solo desea las confirmaciones en la solicitud de extracción, identifique su SHA1 y haga

      git cherry-pick <first-SHA1> <second-SHA1> <etc.>
      
CharlesB
fuente
166
En realidad, no debe usar cherry-pick, crea nuevas confirmaciones ... que a su vez causará confusión si envía una solicitud de extracción en sentido ascendente. En su lugar, debe fusionarse tal como lo solicita la solicitud de extracción. No necesita agregar un control remoto tampoco. git pull URL branchname
Tekkub
3
@Tekkub: de acuerdo, puede ser mejor evitar la confusión con los commits recién creados. Merge es menos elegante en mi mente ya que se puede traer otros cambios con respecto a la rama que estés fusión con
charlesb
8
Sí, pero en este caso preguntó específicamente cómo introducir la solicitud de extracción en su tenedor. Tire == fusión.
Tekkub
1
@CharlesB, dado que GitHub agrega automáticamente nuevas confirmaciones en la misma rama a una solicitud de extracción, no sería difícil obtener "otros cambios" (suponiendo que el solicitante siga las mejores prácticas y coloque los cambios en una rama separada del desarrollo continuo, por lo que que todas las confirmaciones son relevantes), ¿a menos que se trate de cuando solo desea una parte de una solicitud de extracción?
neverfox
44
Para aquellos que comparten mi problema mental, "otherfork" no está haciendo referencia al repositorio original, está haciendo referencia a la confirmación de la bifurcación que emitió la solicitud de extracción al repositorio original. Ignore el repositorio original y vaya directamente al tenedor que realizó la solicitud de extracción. Desea extraer manualmente la confirmación que hace referencia a la extracción y fusionarla con la suya.
Michael Khalili
282

Actualización: a través de la página web

También puede hacerlo a través de la página web de github.

Supongo que ya debería tener una bifurcación ( MyFork) del repositorio común ( BaseRepo) que tiene la solicitud de extracción pendiente de una bifurcación ( OtherFork) que le interesa.

  1. Navegue a la bifurcación ( OtherFork) que ha iniciado la solicitud de extracción que desea ingresar a su bifurcación ( MyFork)
  2. Vaya a la página de solicitudes de extracción de OtherFork
  3. Haga clic en nueva solicitud de extracción
  4. Se deben ofrecer las solicitudes de extracción pendientes. Recuerde seleccionar la OtherForkrama adecuada también. Seleccione en el lado izquierdo como la horquilla base su horquilla ( MyFork) ( IMPORTANTE ).
  5. Ahora la opción de View pull requestdebería cambiar a Create pull request. Haz clic aquí.

Ahora debe tener una solicitud de extracción pendiente en su fork ( MyFork), que simplemente puede aceptar.

Hotschke
fuente
66
Funciona muy bien Mucho más simple que la línea cmd, y fácil de revisar los cambios. Gracias.
Alvéolos
3
Tuve problemas para encontrar cómo llegar al "OtherFork" en la interfaz de usuario. Para llegar fácilmente, simplemente modifique la url con el nombre de usuario de github. es decir github.com/userName/repoName
Charles
2
No pude ver las solicitudes de extracción pendientes mencionadas en el paso 4. En su lugar, seleccioné la rama que correspondía a la solicitud de extracción realizada en OtherForkel menú desplegable "comparar" de la derecha. Luego seleccioné el lado izquierdo como la horquilla base como se describió anteriormente, ya que pude crear la solicitud de extracción.
seddonym
Funciona a menos que no haya tenedor. Por ejemplo: github.com/OculusVR/RakNet/pull/61/files
Milan Babuškov
1
Las palabras exactas del sitio githubs pueden estar desactualizadas, pero el proceso es perfecto. Super simple - gracias!
kevnk
73

Como dijo Tekkub anteriormente, solo puede tirar de la rama directamente. La mayoría de las veces con GitHub, la rama es simplemente "maestra" en la bifurcación del proyecto del usuario solicitante.

Ejemplo: git pull https://github.com/USER/PROJECT/ BRANCH

Y como ejemplo práctico:

Digamos que bifurcó un proyecto github llamado safaribooks y existe la siguiente solicitud de extracción, en el proyecto de origen, que desea poner en su tenedor:

ingrese la descripción de la imagen aquí

Luego, en la carpeta del proyecto clonado de tu fork, ejecuta:

git pull https://github.com/fermionic/safaribooks.git fix-str-decode
SciPhi
fuente
20
La desventaja de esto es que la rama puede tener otras cosas además de la solicitud de extracción. Además, debe buscar la URL adecuada para la bifurcación del autor de la solicitud de extracción. Si desea usar un trazador de líneas, mejor usar git pull https://github.com/{upstream/project} refs/pull/{id}/headen su lugar.
jbyler
1
@jbyler Si la rama tiene otras cosas, estoy bastante seguro de que GitHub habrá actualizado la solicitud de extracción con ellos de todos modos.
Tim Malone
22

Las solicitudes de extracción para el proyecto pueden provenir de muchos autores diferentes (tenedores), y probablemente no desee un control remoto separado para cada tenedor. Además, no desea hacer suposiciones sobre la rama que el autor usó al enviar la solicitud de extracción, o qué más podría estar en la rama maestra del autor. Por lo tanto, es mejor hacer referencia a la solicitud de extracción como aparece en el repositorio ascendente, en lugar de como aparece en los otros tenedores.

Paso 1:

git remote add upstream <url>

Probablemente ya haya realizado este paso, pero si no, querrá un control remoto definido para el proyecto ascendente. La URL es la URL de clonación del proyecto que bifurcó. Más información en Configuración de un control remoto para una bifurcación y Sincronización de una bifurcación . upstreames el nombre que le está dando al control remoto, y si bien puede ser cualquier cosa, upstreames el nombre convencional.

Paso 2:

git pull upstream refs/pull/{id}/head

... donde {id}está el número de solicitud de extracción. upstreames el nombre del control remoto desde el cual extraer, es decir, simplemente "aguas arriba" si siguió exactamente el paso 1 También puede ser una URL, en cuyo caso puede omitir el paso 1.

Paso 3:

Escriba un mensaje de confirmación para la confirmación de fusión. Puede mantener el valor predeterminado, aunque le recomiendo dar un buen resumen de una línea con el número de solicitud de extracción, el problema que soluciona y una breve descripción:

Merge PR#42, fixing VIM-652, support for mapping arbitrary IDEA actions
jbyler
fuente
También vea una respuesta relacionada con una variante que crea una rama local con la solicitud de extracción. Y una variante final: puede usar git pull upstream refs/pull/{id}/headpara obtener los commits en su repositorio local, luego hacer referencia a ellos como FETCH_HEAD(por ejemplo, git log ..FETCH_HEADpara ver qué hay en él git merge FETCH_HEAD)
jbyler
¿Cómo haría para rebasear, de modo que la solicitud de extracción esté al frente y pueda evitar una burbuja de fusión?
Michael Johnston el
1
Esta era la solución que necesitaba, porque el autor de la solicitud de extracción había eliminado su repositorio.
jswetzen
20

Alguna información más detallada que funcionó para mí.

Mi archivo .git / config para el repositorio bifurcado se ve así:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = false
[remote "origin"]
        url = [email protected]:litzinger/angular-carousel.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
        rebase = true
[remote "source"]
        url = git://github.com/revolunet/angular-carousel.git
        fetch = +refs/heads/*:refs/remotes/source/*
        fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

Luego ejecute "git fetch source", que luego enumeró todas las solicitudes de extracción del repositorio bifurcado.

 * [new ref]         refs/pull/54/head -> origin/pr/54
 * [new ref]         refs/pull/67/head -> origin/pr/67
 * [new ref]         refs/pull/69/head -> origin/pr/69
 * [new ref]         refs/pull/71/head -> origin/pr/71

Y luego para combinar en una solicitud de extracción específica, ejecute "git merge master origin / pr / 67"

Brian Litzinger
fuente
1
Edité mi .git / config y agregué las líneas [remotas "fuente"] pero para el proyecto que me interesaba, y las instrucciones funcionaron perfectamente. Me encanta esta respuesta
philo vivero
3
Se pueden encontrar excelentes consejos relacionados en news.ycombinator.com/item?id=9051220 y help.github.com/articles/checking-out-pull-requests-locally insinúa este (impresionante) refs/pull/espacio de nombres remoto de solo lectura específico de GitHub .
Philip Durbin
Si usa Smartgit, puede ver estas solicitudes de extracción (y las cerradas) en el gráfico de registro si agrega smartgit.branch.otherRefs=notes;pulla smartgit.properties según syntevo.com/doc/display/SG/System+Properties ; también puede combinarlas desde allí .
Bloke CAD el
por cierto, también puedes probarlo en la línea de comandos con git fetch source + refs / heads / *: refs / remotes / upstream / * + refs / pull / * / head: refs / remotes / origin / pr / *
lib
9

Lo que haría es lo siguiente;

git checkout master
git remote add #NAME# #ADDRESS TO REPO#
git fetch #USERNAME#
git checkout -b test_fork
git rebase #NAME#/#BRANCH#

Ahora he fusionado los cambios en una rama de prueba, llamada test_fork. Para que cualquier cambio no ensucie mi árbol.

Opcionalmente, puede usar cherry-pick como se describió anteriormente para elegir un commit particular si eso es más preferible.

Viajes felices :)

MindTooth
fuente
0

Utilizo un útil script dandy para esto. Ejecuto el script escribiendo:

git prfetch upstream

y obtiene todas las solicitudes de extracción de la bifurcación aguas arriba.

Para crear el script, haga un archivo ~/bin/git-prfetch.

El archivo debe contener lo siguiente:

#!/bin/bash

if [ -z "$1" ]; then
    echo "Please supply the name of a remote to get pull requests from."
    exit 1
fi

git fetch $1 +refs/heads/\*:refs/remotes/$1/\* +refs/pull/\*/head:refs/remotes/$1/pr/\*

Asegúrese de que su ruta incluya el script configurando:

export PATH="$HOME/bin:$PATH"

Puede agregar este archivo ~/.bashrcpara que el cambio sea permanente.

Ahora, asegúrese de agregar la bifurcación de la que desea obtener las solicitudes de extracción:

git remote add upstream https://github.com/user/repo.git

Y entonces

git prfetch upstream
Ricardo
fuente