Как я могу получить незаполненный пул-запрос для ветки, которой я не владею?

Мне нужно получить конкретный запрос на извлечение (который еще не был обработан в основной поток) в репозитории NServiceBus:

https://github.com/johnsimons/NServiceBus/commit/d8524d53094e8181716e771c1023e968132abc15

Это, очевидно, не мое репо, но мне нужны изменения, которые существуют в этом запросе.

Каков наилучший способ сделать это?

9 ответов

git pull origin pull/28/head

Или же

git fetch origin pull/28/head:28
git checkout 28

Могу ли я получить еще не слитый запрос на удаление?

Чтобы получить тягу в ваш репозиторий:

git fetch git@github.com:jboss/jboss-common-beans.git refs/pull/4/head

Затем делайте что хотите с FETCH_HEAD:

git checkout -b new-branch FETCH_HEAD

Вы можете сделать это:

1) Добавьте вышестоящий пульт:

git remote add upstream git@github.com:Particular/NServiceBus.git

2) После этого вы можете оформить любой пул-запрос в новую ветку по его ID:

git fetch upstream pull/PULL_REQUEST_ID/head:NEW_BRANCH_NAME

Тогда у вас будет ветка с именем NEW_BRANCH_NAME содержащий PR-код.

Добавление псевдонима:

Если вы делаете это так же часто, как я, вы можете установить для него псевдонимы. У меня есть это в моем.gitconfig:

[alias]
    fetch-pr = "!f(){\
        [ -z \"$1\" ] && { echo Usage: git fetch-pr PULL_REQUEST_ID [REMOTE_NAME] [NEW_BRANCH_NAME]; exit 1; }; \
        remote=${2:-origin}; \
        branch=${3:-pr-$1}; \
        git fetch $remote \"pull/$1/head:$branch\"; \
        }; f "
    pr = "!f(){\
        branch=${3:-pr-$1}; \
        git fetch-pr \"$@\"; \
        git switch $branch; \
        }; f "

С вышеизложенным я могу сделать:

git fetch-pr 123              # fetch PR #123 into branch pr-123
git fetch-pr 123 some-branch  # fetch PR #123 into some-branch
git pr 123                    # fetch and switch to the branch

Для сложных ситуаций (особенно если у вас нет проверенного git-repo), я думаю, что самый простой способ - это применить патч. Для этого просто откройте pull-запрос на github и добавьте ".patch" к URL, скачайте его и примените патч.

Пример:

cd cordova-plugin-media
wget https://github.com/apache/cordova-plugin-media/pull/120.patch
patch -p1 < 120.patch

Смотрите эту справочную статью от GitHub: https://help.github.com/articles/checking-out-pull-requests-locally

GitHub / концентратору

https://github.com/github/hub - это помощник GitHub CLI, который прекрасно справляется с этим и другими вариантами использования, используя дополнительную информацию из API GitHub. Например:

git clone https://github.com/github/hub
# Just copy paste the URL.
hub checkout https://github.com/github/hub/pull/970

Результат:

  • мы сейчас находимся на ветке под названием <USERID>-<BRANCH_NAME> который содержит пиар.

    Обратите внимание на хорошее название ветки, которое было автоматически установлено для нас.

  • эта ветка установлена ​​для отслеживания оригинальной ветки на вилке, т.е. .git/config содержит:

    [branch "<USERID>-<BRANCH_NAME>"]
        remote = retronym
        merge = refs/heads/ticket/969
        rebase = true
    

    Так что, если дальнейшие коммиты будут выдвинуты, мы можем git fetch их напрямую.

Установка hub на Linux в настоящее время боль, если вы не знакомы с Go, но оно того стоит. В Ubuntu 14.04 Go в репозиториях слишком стар, поэтому GVM - лучший вариант:

bash < <(curl -LSs 'https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer')
. "$HOME/.gvm/scripts/gvm"
gvm install 'go1.4'
gvm use 'go1.4' --default
go get github.com/github/hub

Я также попросил GitHub предоставить нам листок с копией вставки в веб-интерфейсе по адресу: https://github.com/isaacs/github/issues/449

Как только вы добавили репозиторий в восходящем направлении как удаленный в апстриме (как указывал @elias):

$ git remote add upstream git@github.com:Particular/NServiceBus

Вы можете настроить git для получения запросов на получение по умолчанию:

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

Итак, давайте возьмем это:

$ git fetch upstream
Fetching upstream
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/Particular/NServiceBus
 * [new ref]         refs/pull/1/head -> upstream/pr/1
 * [new ref]         refs/pull/2/head -> upstream/pr/2

И проверить это:

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

Вот команды, которые работали для меня.

Я предполагаю, что один уже клонировал репо (например, pytorch) в свою систему локально. После этого некоторые добровольцы / энтузиасты внесли некоторый код и выпустили PR в удаленный репозиторий, но он еще не был объединен с ведущим или любым другим филиалом. Так,

Сначала мы должны сделать git remote add в удаленный репозиторий github:

# I've given the name `original`; you can give some other name as per your liking
$ git remote add original https://github.com/pytorch/pytorch

затем cd в хранилище pytorch а затем просто сделайте:

# after this, the unmerged PR should be pulled to your local repo
$ git fetch original pull/<pull_number>/head    # 23, 123 etc.,

Теперь ожидающий PR был загружен в ваш локальный репозиторий, и кончик вашей выборки будет в FETCH_HEAD. Если вы хотите объединить этот ожидающий PR локально, просто выполните:

$ git merge FETCH_HEAD

После этого, если вы делаете:

$ git status

Вы должны быть в состоянии увидеть, что местное репо впереди n коммиты, которые были частью ожидающего PR (т. е. возможно выпустить более 1 коммита в одном PR). Таким образом, количество коммитов зависит от коммитов, содержащихся в ожидающем PR.

Это решение из документов GitHub:

В репозитории проекта откройте новую ветку и проверьте изменения.

git checkout -b GithubUserID-branchName branchName
git pull https://github.com/GithubUserID/reponame.git branchName

Куда:

  1. GithubUserID - имя пользователя, открывшего запрос на перенос.
  2. branchName это название ветки например master
  3. reponame имя репозитория, например demo-todo

Пример:

git checkout -b felix123-master master
git pull https://github.com/felix123/demo-todo.git master

Если вы просто хотите добавить один необработанный запрос на извлечение из какого-либо другого репозитория, вам не нужно будет никаких сложностей (как в основном показано в других ответах).

Вместо этого просто зайдите в свой репозиторий и извлеките коммит (из PR-источника), используя его хэш коммита.

git pull https://bitbucket.org/SomeUser/SomeProjectRepo/commits/c15...db2

Делая это таким образом, у вас просто будет куча новых отредактированных файлов, как если бы вы редактировали их самостоятельно. Тогда вам решать, хотите ли вы зафиксировать их с помощью какого-либо тега / метки.

Если вы хотите отправить все новости в свое репозиторий GitHub, просто сделайте как всегда:

git commit -m "Added something by Anonymous"
git push -u origin master

Ниже приведена команда 'git fetch' для получения всех запросов извлечения при запуске "git fetch"

добавить ниже в ~/.gitconfig

[remote "origin"]
fetch = +refs/pull-requests/*/from:refs/remotes/origin/pr/*

обратите внимание, что ссылка "refs/pull-запросы /" имеет соглашение о присвоении имен в stash, для git hub вам может понадобиться другой формат

У Github есть понятный документ для объединения запроса извлечения в локальный репозиторий:

https://help.github.com/en/articles/checking-out-pull-requests-locally

Это сводится к знанию, что пул-запрос в GitHub - это просто ветвь в базовом репо, где имя ветки представляет собой порядковый номер. В приведенной выше статье показано, как найти это число и магию командной строки git, чтобы перетащить его в локальный репозиторий с любым именем ветви, которое вы захотите.

Я не мог найти такой же простой способ объединить запрос на получение в форк, который я создал на GitHub.

Я нашел решение этой проблемы - извлекая изменения из несвязанного PR на другой машине, я сделал следующее на git bash 1. Вы должны были взять клон удаленного репозитория на машине 2 2. выполнить git checkout (ветка, на которой был создан PR) 3. Сделайте git pull и готово!!!!!!!!!!!!!!

Другие вопросы по тегам