Как я могу проверить GitHub pull-запрос с помощью git?


251

Я хотел бы проверить ранее созданный пул-запрос (созданный через веб-интерфейс GitHub). Я искал и нашел разные места, где refs / pull или refs / pull / pr

Но когда я добавляю fetch = +refs/pull/*/head:refs/remotes/origin/pr/*в файл git config и делаю git fetch

Что я делаю не так? Должен ли GitHub автоматически создавать файлы pull / xyz или мне нужно что-то настраивать?


Как выглядит полный удаленный раздел вашего конфигурационного файла?


возможный дубликат клона github из запроса
BuZZ-DEE

Я закончил с этим вопросом, но на самом деле мне был нужен stackoverflow.com/q/1783405/2413303
EpicPandaForce

1
Второй абзац не является полным предложением. «Но когда я добавляю ... и делаю мерзкий выбор», - когда вы делаете эти вещи, что происходит?
cp.engr

Ответы:


385

Чтобы получить удаленный пиар в вашем локальном репо,

git fetch origin pull/ID/head:BRANCHNAME

где IDid запроса на получение и BRANCHNAMEимя новой ветви, которую вы хотите создать. После того как вы создали ветку, просто

git checkout BRANCHNAME

Смотрите официальную документацию GitHub для получения дополнительной информации.


11
Я использовал это для извлечения pr из репозитория upstream в мой локальный разветвленный репо, вы также можете заменить origin на upstream.
Jngai1297

18
Моя команда в итоге выглядела не так git fetch origin pull/1/head:githubusername, как я ожидал
Энтони

1
как вернуть?
fico7489

8
@ Антуан BRANCHNAME- это то, что вы хотите назвать веткой. Я предполагаю, что вы пытались использовать имя, которое уже существовало (например, master) и которое не работало, поэтому вы попытались использовать свое имя пользователя, которое сработало, потому что они не были ветвью с этим именем. Возможно, я неправильно понимаю, что вы говорили.
Натеовами

1
Возможно, вы настроили локальное репо так, originчтобы оно указывало на ваш форк и upstream- на исходный репозиторий (например, следуя help.github.com/articles/configuring-a-remote-for-a-fork ). Обязательно измените originзначение upstreamв упомянутой команде, если вы хотите получить запрос на извлечение из исходного репо.
Мвлабат

127

Это принесет вам без необходимости называть ветку:

git pull origin pull/939/head

Как получить конкретный запрос на извлечение на моей машине?


Этого действительно достаточно, tks
rll

Это сработало для меня, метод извлечения Тимбо сделал что-то, но это не правильно
Малхал

30
Обратите внимание, что если вы сделаете это, например, в своей основной ветке, она будет зафиксирована непосредственно в этой ветви. Если вы хотите перенести пулл-запрос в отдельную ветку для подготовки, попробуйте ответ @ timbo.
Феникс

3
То же самое сказал @phoenix. Я хочу, чтобы ветвь запроса на получение дублировалась на моей машине под собственной ветвью, а не с master
Павел Чернох

Это также работает, если позже вы захотите перенести изменения из запроса извлечения в вашу локальную ветку.
Луатор

52

Эта суть описывает, что происходит, когда вы делаете git fetch:

Очевидно, измените URL-адрес github, чтобы он соответствовал URL вашего проекта. В итоге это выглядит так:

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

Теперь получите все запросы на извлечение:

$ 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
...

Чтобы проверить конкретный пул-запрос:

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

У вас есть различные сценарии, перечисленные в выпусках 259, для автоматизации этой задачи.
Проект git-extras предлагает команду git-pr(реализовано в PR 262 )

git-pr(1) - проверяет локальный запрос

СИНТАКСИС

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

ОПИСАНИЕ

Создает локальную ветвь на основе номера запроса GitHub и затем переключается на эту ветвь.

Название пульта, из которого можно выбрать. Значения по умолчанию для origin.

ПРИМЕРЫ

Это проверяет запрос на получение 226от 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

Я предпочитаю получать и извлекать, не создавая локальную ветку и находясь в отключенном состоянии HEAD . Это позволяет мне быстро проверить запрос на загрузку, не загрязняя мою локальную машину ненужными локальными ветвями.

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

где IDидентификатор запроса на получение и upstreamгде был создан исходный запрос на получение (например, это может быть origin).

Я надеюсь, что это помогает.


1
Мне нравится это решение. Одним из преимуществ является то, что если PR обновляется с большим количеством коммитов, то вы можете просто запустить его снова, и он получит новые коммиты.
Алекс Джонсон

14

Ссылаясь на ответ Стивена Пенни, лучше всего создать тестовую ветку и протестировать PR. Так вот, что бы вы сделали.

  1. Создайте тестовую ветку, чтобы объединить PR в локально. Предполагая, что вы находитесь на главной ветке:

git checkout -b test

  1. Получить изменения PR в тестовую ветку

git pull origin pull/939/head:test

Теперь вы можете безопасно проверить изменения в этой локальной тестовой ветви (в данном случае с именем test ) и, как только вы будете удовлетворены, можете как обычно объединить их с GitHub.


1
Я бы пошел еще лучше - я бы создал рабочее дерево, установил его на новую testветвь и, затем, включил PR - таким образом, мне не нужно восстанавливать ветки локально после завершения; Я просто распоряжаться рабочим деревом. На самом деле я НИКОГДА просто checkout -bбольше - я всегда создаю рабочее дерево, а затем разветвляюсь. Диск дешевый. Конечно, у меня есть сценарий, который делает это; Я не набираю всю команду, необходимую по отдельности.
mpersico

11

Если вы используете Github.com, перейдите в раздел «Запросы на извлечение», щелкните соответствующий запрос на извлечение и затем нажмите ссылку «Инструкции для командной строки»: инструкции командной строки на Github.com


Скажите, действительно ли есть способ - когда вы смотрите на github.com, я имею в виду - загружать новые / измененные файлы PR? Таким образом, когда вы просматриваете репозиторий на github, вы можете нажать удобную кнопку «скачать как zip», или, на самом деле, вы можете просто щелкнуть и просмотреть каждый (весь) файл проекта. Что касается PR, я не могу понять, как просто нажать на «посмотреть файл» - понимаете, о чем я? Я что-то упускаю? Ура!
Толстяк

9

Вы можете использовать git configкоманду, чтобы написать новое правило .git/configдля извлечения запросов извлечения из хранилища:

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

А потом просто:

$ 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

Проблема с некоторыми из вышеперечисленных опций заключается в том, что если кто-то выдвигает больше коммитов в PR после открытия PR, он не даст вам самую последнюю версию. Для меня то, что сработало лучше всего - перейти к PR и нажать «Commits», прокрутить до конца, чтобы увидеть самый последний хеш коммита, введите описание изображения здесь а затем просто использовать git checkout, т.е.

git checkout <commit number>

в приведенном выше примере

git checkout 0ba1a50


2
Я столкнулся именно с этой проблемой с помощью git fetch origin pull/ID/head:BRANCHNAMEподхода, упомянутого в stackoverflow.com/a/30584951/659732 . Спасибо за решение!
Joewiz


5

Для Bitbucket вам нужно заменить слово pullна pull-requests.

Во-первых, вы можете подтвердить стиль URL-адреса запроса на получение по git ls-remote originкоманде.

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

Как видите, это refs/pull-requests/1503/fromвместоrefs/pull/1503/from

Тогда вы можете использовать команды любого из ответов.


4

Я случайно закончил тем, что написал почти то же самое, что и git-extras. Так что, если вы предпочитаете одну пользовательскую команду вместо установки множества других дополнительных команд, просто поместите этот git-prфайл где-нибудь в вашем, $PATHи тогда вы можете просто написать:

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

4

Если вы следуете рабочему процессу "github fork", где вы создаете форк и добавляете удаленный репозиторий upstream:

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)

чтобы перетащить в вашу текущую ветку ваша команда будет выглядеть так:

git pull upstream pull/<pull_request_number>/head

чтобы вытащить в новую ветку код будет выглядеть так:

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

3

Github недавно выпустил утилиту cli под названием github-cli . После его установки вы можете оформить ветвь запроса извлечения локально, используя его идентификатор.

например: gh pr checkout 2267

Обратите внимание, что этот пакет все еще находится в бета-версии


1

Получите удаленный PR-филиал в локальный филиал:

git fetch origin ‘remote_branch’:‘local_branch_name’

Установите восходящий поток локальной ветки на удаленную ветку.

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

Когда вы хотите снова поместить локальные изменения в ветку PR

git push origin HEAD:remote_PR_Branch_name


0

Предположим, ваше происхождение и информация выше по течению, как показано ниже

   $ 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)

и ваша ветка называется

   <repo_owner>:<BranchName>

затем

   git pull origin <BranchName>

должен делать работу


Когда вы поделитесь кодом, пожалуйста, попробуйте объяснить свой код
Юнус Темурленк
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.