¿Cómo puedo consultar una solicitud de extracción de GitHub con git?


251

Me gustaría consultar una solicitud de extracción creada anteriormente (creada a través de la interfaz web de GitHub). Busqué y encontré diferentes lugares donde un refs / pull o refs / pull / pr

Pero cuando agrego fetch = +refs/pull/*/head:refs/remotes/origin/pr/*al archivo de configuración de git y hago una búsqueda de git

¿Qué estoy haciendo mal? ¿Debería GitHub crear automáticamente el material pull / xyz, o tengo que configurar algo?


¿Cómo se ve la sección remota completa de su archivo de configuración?



Terminé con esta pregunta, pero realmente necesitaba stackoverflow.com/q/1783405/2413303
EpicPandaForce

1
El segundo párrafo no es una oración completa. "Pero cuando agrego ... y hago una búsqueda", cuando haces estas cosas, ¿qué sucede?
cp.engr

Respuestas:


385

Para buscar un PR remoto en su repositorio local,

git fetch origin pull/ID/head:BRANCHNAME

donde IDestá el id de solicitud de extracción y BRANCHNAMEes el nombre de la nueva rama que desea crear. Una vez que haya creado la rama, simplemente

git checkout BRANCHNAME

Consulte la documentación oficial de GitHub para obtener más información.


11
Utilicé esto para obtener un PR de un repositorio ascendente en mi repositorio bifurcado local, también puede reemplazar el origen con el ascendente.
Jngai1297

18
Mi orden terminó pareciéndose a git fetch origin pull/1/head:githubusernamelo que esperaba
Anthony

1
¿Cómo revertir?
fico7489

8
@Antoine BRANCHNAMEes lo que quieras nombrar a la sucursal. Supongo que trató de usar un nombre que ya existía (por ejemplo master) y que no funcionó, por lo que probó su nombre de usuario, que funcionó, porque no era una rama con ese nombre. Quizás no entiendo lo que estabas diciendo.
Nateowami

1
Es posible que haya configurado su repositorio local de la manera que originapunta a su bifurcación y upstream, al repositorio original (siguiendo help.github.com/articles/configuring-a-remote-for-a-fork , por ejemplo). Asegúrese de cambiar origina upstreamen el comando mencionado, si desea obtener la solicitud de extracción del repositorio original.
mvlabat

126

Esto se obtendrá sin que tenga que nombrar una rama:

git pull origin pull/939/head

¿Cómo obtengo una solicitud de extracción específica en mi máquina?


Esto es suficiente,
tks

Este funcionó para mí, el método de búsqueda de timbo hizo algo pero no fue lo correcto
malhal

30
Tenga en cuenta que si hace esto mientras está en su rama maestra, por ejemplo, se comprometerá directamente en esta rama. Si desea llevar la solicitud de extracción a una rama separada para la puesta en escena, pruebe la respuesta de @ timbo.
Phoenix

3
Lo mismo dice @phoenix. Quiero que la rama de solicitud de extracción esté duplicada en mi máquina bajo su propia rama, no maestra.
Paul Chernoch

Esto también funciona si luego desea extraer cambios de la solicitud de extracción en su sucursal local.
luator

52

Esa esencia describe lo que sucedió cuando haces una búsqueda de git:

Obviamente, cambie la URL de Github para que coincida con la URL de su proyecto. Termina luciendo así:

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git@github.com:joyent/node.git
    fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

Ahora busque todas las solicitudes de extracción:

$ git fetch origin
From github.com:joyent/node
 * [new ref]         refs/pull/1000/head -> origin/pr/1000
 * [new ref]         refs/pull/1002/head -> origin/pr/1002
 * [new ref]         refs/pull/1004/head -> origin/pr/1004
 * [new ref]         refs/pull/1009/head -> origin/pr/1009
...

Para consultar una solicitud de extracción particular:

$ git checkout pr/999
Branch pr/999 set up to track remote branch pr/999 from origin.
Switched to a new branch 'pr/999'

Tiene varios scripts enumerados en los problemas 259 para automatizar esa tarea.
Los git-extras proyecto propone el comando git-pr(implementado en PR 262 )

git-pr(1) - Comprueba una solicitud de extracción localmente

SINOPSIS

git-pr <number> [<remote>]
git-pr clean

DESCRIPCIÓN

Crea una sucursal local basada en un número de solicitud de extracción de GitHub, y luego cambia a esa sucursal.

El nombre del control remoto para buscar. Por defecto esorigin .

EJEMPLOS

Esto verifica la solicitud de extracción 226de origin:

$ git pr 226

remote: Counting objects: 12, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 12 (delta 3), reused 9 (delta 3)
Unpacking objects: 100% (12/12), done.
From https://github.com/visionmedia/git-extras
  * [new ref] refs/pull/226/head -> pr/226
Switched to branch 'pr/226'

38

Prefiero buscar y pagar sin crear una sucursal local y estar en estado HEAD separado . Me permite verificar rápidamente la solicitud de extracción sin contaminar mi máquina local con ramas locales innecesarias.

git fetch upstream pull/ID/head && git checkout FETCH_HEAD

dónde IDse upstreamha creado una ID de solicitud de extracción y dónde se ha creado la solicitud de extracción original (podría ser origin, por ejemplo).

Espero que ayude.


1
Me gusta esta solución Uno de los beneficios es que si el RP se actualiza con más confirmaciones, puede ejecutar esto nuevamente y obtendrá las nuevas confirmaciones.
Alex Johnson

14

Haciendo referencia a la respuesta de Steven Penny, es mejor crear una rama de prueba y probar el PR. Así que esto es lo que harías.

  1. Cree una rama de prueba para fusionar el PR localmente. Asumiendo que estás en la rama maestra:

git checkout -b test

  1. Obtenga los cambios de PR en la rama de prueba

git pull origin pull/939/head:test

Ahora, puede probar de forma segura los cambios en esta rama de prueba local (en este caso, prueba con nombre ) y una vez que esté satisfecho, puede fusionarlo como siempre desde GitHub.


1
Incluso iría uno mejor: crearía un árbol de trabajo, lo establecería en una nueva testsucursal y ENTONCES tiraría del PR, de esa manera no necesito restaurar las sucursales localmente cuando haya terminado; Acabo de deshacerme del árbol de trabajo. De hecho, NUNCA solo checkout -bmás: siempre creo un árbol de trabajo y luego me ramifico. El disco es barato. Por supuesto, tengo un script que hace esto; No escribo todos los comandos necesarios individualmente.
mpersico

11

Si está utilizando Github.com, vaya a "Solicitudes de extracción", haga clic en la solicitud de extracción correspondiente y luego haga clic en el enlace "instrucciones de la línea de comandos": instrucciones de línea de comando en Github.com


Digamos, ¿hay realmente una manera, cuando miras en github.com, quiero decir, de descargar los archivos nuevos / modificados del PR? Por lo tanto, cuando esté mirando un repositorio en github, puede hacer clic en el práctico botón "descargar como zip" o, de hecho, puede simplemente hacer clic y mirar cada archivo (completo) del proyecto. Para relaciones públicas, no puedo ver cómo, simplemente, haga clic para "mirar el archivo", ¿sabe a qué me refiero? ¿Me estoy perdiendo de algo? ¡Salud!
Fattie

9

Puede usar el git configcomando para escribir una nueva regla .git/configpara obtener solicitudes de extracción del repositorio:

$ git config --local --add remote.origin.fetch '+refs/pull/*/head:refs/remotes/origin/pr/*'

Y luego solo:

$ git fetch origin
Fetching origin
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 2), reused 4 (delta 2), pack-reused 0
Unpacking objects: 100% (4/4), done.
From https://github.com/container-images/memcached
 * [new ref]         refs/pull/2/head -> origin/pr/2
 * [new ref]         refs/pull/3/head -> origin/pr/3

8

El problema con algunas de las opciones anteriores es que si alguien empuja más confirmaciones al RP después de abrir el RP, no le darán la versión más actualizada. Para mí, lo que funcionó mejor es ir al RP y presionar 'Comprometerse', desplazarse hacia abajo para ver el hash de confirmación más reciente ingrese la descripción de la imagen aquí y luego simplemente usar git checkout, es decir

git checkout <commit number>

en el ejemplo anterior

git checkout 0ba1a50


2
Llegué exactamente a este problema con el git fetch origin pull/ID/head:BRANCHNAMEenfoque mencionado en stackoverflow.com/a/30584951/659732 . Gracias por la solucion!
joewiz

6

Estoy usando hub, una herramienta de github: https://github.com/github/hub

Con el hub verificar una solicitud de extracción localmente es un poco fácil:

hub checkout https://github.com/owner/repo/pull/1234
or
hub pr checkout 1234

5

Para Bitbucket, debe reemplazar la palabra pulla pull-requests.

Primero, puede confirmar el estilo de URL de solicitud de extracción mediante un git ls-remote origincomando.

$ git ls-remote origin |grep pull
f3f40f2ca9509368c959b0b13729dc0ae2fbf2ae    refs/pull-requests/1503/from
da4666bd91eabcc6f2c214e0bbd99d543d94767e    refs/pull-requests/1503/merge
...

Como puede ver, es en refs/pull-requests/1503/fromlugar derefs/pull/1503/from

Luego puede usar los comandos de cualquiera de las respuestas.


4

Accidentalmente terminé escribiendo casi lo mismo provisto por git-extras. Entonces, si prefiere un solo comando personalizado en lugar de instalar un montón de otros comandos adicionales, simplemente coloque este git-prarchivo en algún lugar de su $PATHy luego simplemente puede escribir:

git pr 42
// or
git pr upstream 42
// or
git pr https://github.com/peerigon/phridge/pull/1

4

Si sigue el flujo de trabajo "bifurcación github", donde crea una bifurcación y agrega el repositorio remoto ascendente:

14:47 $ git remote -v
origin  git@github.com:<yourname>/<repo_name>.git (fetch)
origin  git@github.com:<yourname>/<repo_name>.git (push)
upstream        git@github.com:<repo_owrer>/<repo_name>.git (fetch)
upstream        git@github.com:<repo_owner>/<repo_name>.git (push)

para ingresar a su rama actual, su comando se vería así:

git pull upstream pull/<pull_request_number>/head

para ingresar a una nueva rama, el código se vería así:

git fetch upstream pull/<pull_request_number>/head:newbranch

3

Github lanzó recientemente una utilidad cli llamada github-cli . Después de instalarlo, puede pagar localmente la rama de una solicitud de extracción utilizando su ID

p.ej: gh pr checkout 2267

Tenga en cuenta que este paquete todavía está en beta


1

Obtenga la sucursal de relaciones públicas remota en la sucursal local:

git fetch origin ‘remote_branch’:‘local_branch_name’

Establezca el flujo ascendente de la sucursal local en la sucursal remota.

git branch --set-upstream-to=origin/PR_Branch_Name local_branch

Cuando desee impulsar los cambios locales a la rama PR nuevamente

git push origin HEAD:remote_PR_Branch_name


0

Supongamos que su origen y la información aguas arriba son como a continuación

   $ git remote -v
   origin  git@github.com:<yourname>/<repo_name>.git (fetch)
   origin  git@github.com:<yourname>/<repo_name>.git (push)
   upstream   git@github.com:<repo_owner>/<repo_name>.git (fetch)
   upstream   git@github.com:<repo_owner>/<repo_name>.git (push)

y el nombre de tu sucursal es como

   <repo_owner>:<BranchName>

luego

   git pull origin <BranchName>

hará el trabajo


Cuando compartió código, intente explicar su código
Yunus Temurlenk

-2

Si sus confirmaciones están en la rama maestra de su repositorio bifurcado, entonces podría hacer lo siguiente.

git fetch git@github.com:<repo_owner>/<repo_name>.git
git checkout FETCH_HEAD
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.