Как применить к моей вилке не объединенные восходящие запросы на вытягивание из других форков?

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

Есть ли простой способ применить запрос на перенос из других вилок в мою вилку? Есть ли здесь что-то еще, чего мне не хватает?


person leek    schedule 16.05.2011    source источник
comment
Есть инструкция: gist.github.com/piscisaureus/3342247   -  person Piotr Migdal    schedule 04.11.2013
comment
Отражается ли это на сетевом графике на GitHub, если вы используете для этого команды git?   -  person ADTC    schedule 01.08.2014
comment
Также может быть интересно найти все ветки: stackoverflow.com/q/47798937/10245   -  person Tim Abell    schedule 07.08.2018


Ответы (7)


Сделать это вручную довольно просто:

  • добавьте другую вилку как удаленную от вашего репо:

    git remote add otherfork git://github.com/request-author/project.git
    
  • получить коммиты его репо

    git fetch otherfork
    
  • У вас есть два варианта применения запроса на перенос (если вы не хотите выбирать вариант 1.)

    1. Если вы не заботитесь о применении также возможных коммитов, которые были добавлены между источником и запросом на перенос, вы можете просто перебазировать ветку, на которой был сформирован запрос на перенос.

      git rebase master otherfork/pullrequest-branch
      
    2. Если вам нужны только коммиты в запросе на перенос, укажите их SHA1 и выполните

      git cherry-pick <first-SHA1> <second-SHA1> <etc.>
      
person CharlesB    schedule 16.05.2011
comment
На самом деле, вам не следует использовать cherry-pick, он создает новые коммиты ... что, в свою очередь, вызовет путаницу, если вы отправите запрос на перенос вверх по течению. Вместо этого вы должны выполнить слияние, как того требует пул-реквест. Вам также не нужно добавлять пульт. git pull URL branchname - person Tekkub; 17.05.2011
comment
@Tekkub: согласен, может быть лучше избегать путаницы с вновь созданными коммитами. На мой взгляд, слияние менее элегантно, так как вы можете вносить другие изменения из ветки, с которой объединяетесь. - person CharlesB; 17.05.2011
comment
Да, но в этом случае он специально спросил, как вставить запрос на вытягивание в его вилку. Вытяните == слияние. - person Tekkub; 17.05.2011
comment
@CharlesB, поскольку GitHub автоматически добавляет новые коммиты в той же ветке к запросу на перенос, не будет ли сложно получить какие-либо другие изменения (при условии, что запрашивающий следует передовым практикам и помещает изменения в отдельную ветку из продолжающейся разработки, чтобы все коммитов актуальны), если только вы не получите только часть пул-реквеста? - person neverfox; 04.06.2013
comment
@ Neverfox абсолютно, я отредактировал ответ, чтобы отразить эту возможность - person CharlesB; 04.06.2013
comment
Вы должны указать хотя бы самую важную из возможностей: git merge. - person JonnyJD; 07.08.2013
comment
Вот как настроить ветку запроса на вытягивание. - person Tamlyn; 10.06.2014
comment
возможные коммиты, которые были добавлены между источником и запросом на перенос, вы имеете в виду, когда автор запроса на перенос должен был внести дополнительные изменения в эту ветвь / запрос на перенос? - person AaronLS; 25.07.2014
comment
Для тех, кто разделяет мой умственный сбой, otherfork не ссылается на исходное репо, он ссылается на фиксацию из вилки, которая отправила запрос на перенос в исходное репо. Игнорируйте исходное репо и переходите непосредственно к вилке, которая выполнила запрос на вытягивание. Вы хотите вручную вытащить фиксацию, на которую ссылается извлечение, и объединить ее со своим собственным. - person Michael Khalili; 19.10.2014
comment
@Tekkub Спасибо. Я бы упомянул параметры --edit и --no-commit, так как они тоже могут быть полезны. - person crissdev; 23.10.2014

Обновление: через веб-страницу

Вы также можете сделать это через веб-страницу github.

Я предполагаю, что у вас уже должен быть форк (MyFork) общего репо (BaseRepo), который имеет ожидающий запрос на вытягивание из интересующего вас форка (OtherFork).

  1. Перейдите к вилке (OtherFork), которая инициировала запрос на перенос, который вы хотите поместить в вилку (MyFork).
  2. Перейдите на страницу запросов на вытягивание OtherFork
  3. Нажмите новый запрос на вытягивание
  4. Должны быть предложены отложенные запросы на вытягивание. Не забудьте также выбрать правильную ветку OtherFork. Выберите с левой стороны в качестве базовой вилки вилку (MyFork) (ВАЖНО).
  5. Теперь параметр View pull request должен измениться на Create pull request. Щелкните здесь.

Теперь у вас должен быть ожидающий пул-реквест в вашей вилке (MyFork), который вы можете просто принять.

person Hotschke    schedule 25.02.2015
comment
Красиво работает. Намного проще, чем строка cmd, и легко просматривать изменения. Спасибо. - person Alveoli; 02.12.2015
comment
У меня возникли проблемы с поиском доступа к OtherFork в пользовательском интерфейсе. Чтобы легко попасть туда, просто измените URL-адрес, указав имя пользователя github. т.е. github.com/userName/repoName - person Charles; 17.12.2015
comment
Мне не удалось увидеть отложенные запросы на вытягивание, упомянутые в шаге 4. Вместо этого я выбрал ветку, соответствующую запросу на вытягивание, сделанному OtherFork, из правого раскрывающегося списка «сравнить». Затем я выбрал левую сторону в качестве базовой вилки, как описано выше, чтобы создать запрос на вытягивание. - person seddonym; 30.12.2015
comment
Работает, если нет вилки. Например: github.com/OculusVR/RakNet/pull/61/files. - person Milan Babuškov; 11.04.2016
comment
Точные слова с сайта githubs могут быть устаревшими, но процесс идет правильно. Супер просто - спасибо! - person kevnk; 13.04.2016
comment
Для протокола, если кто-то открыл PR в одном из моих проектов, у которого был результат этого в своей истории, я бы отклонил его, потому что это затрудняет отслеживание истории, если она впоследствии будет объединена с моим репо. Я не говорю, что не делайте этого, но просто будьте готовы сделать небольшую очистку истории, если вы получите суетливое репо в восходящем направлении. - person Tim Abell; 07.08.2018
comment
Это должен был быть принятый ответ, не только более простой, но и более логичный, чем решение с командной строкой и выбором вишни. - person leo; 22.09.2019
comment
Если вы пропустили кнопку Create pull request, убедитесь, что вы вошли в систему :) - person MartinM; 21.11.2020
comment
но он говорит, что я не могу одобрить свои собственные коммиты - person Tanishq Banyal; 08.04.2021

Как Tekkub сказал ранее, вы можете просто потянуть ветку напрямую. Большую часть времени с GitHub ветвь является просто «ведущей» для запрашивающей пользовательской вилки проекта.

Пример: git pull https://github.com/USER/PROJECT/ BRANCH

И в качестве практического примера:

Предположим, вы разделили проект на github под названием safaribooks, и в исходном проекте есть следующий запрос на перенос, который вы хотите поместить в свою вилку:

введите описание изображения здесь

Затем в папке клонированного проекта вашей вилки запустите:

git pull https://github.com/fermionic/safaribooks.git fix-str-decode
person SciPhi    schedule 26.07.2012
comment
Обратной стороной этого является то, что в ветке могут быть другие вещи, помимо запроса на перенос. Кроме того, вам необходимо найти правильный URL-адрес вилки автора запроса на вытягивание. Если вы хотите использовать однострочник, лучше вместо него использовать git pull https://github.com/{upstream/project} refs/pull/{id}/head. - person jbyler; 21.10.2014
comment
@jbyler Если в ветке есть другие вещи, я почти уверен, что GitHub все равно обновит запрос на перенос с их помощью. - person Tim Malone; 11.07.2018

Запросы на вытягивание для проекта могут исходить от многих разных авторов (форков), и вам, вероятно, не нужен отдельный пульт для каждой вилки. Кроме того, вы не хотите делать никаких предположений о ветке, которую автор использовал при отправке запроса на перенос, или о том, что еще может быть в основной ветке автора. Поэтому лучше ссылаться на пул-реквест в том виде, в котором он отображается в вышестоящем репозитории, а не в других форках.

Шаг 1:

git remote add upstream <url>

Вероятно, вы уже выполнили этот шаг, но если нет, вам понадобится пульт, определенный для восходящего проекта. URL-адрес - это URL-адрес клона созданного вами проекта. Подробнее см. Настройка пульта ДУ для вилки и Синхронизация вилки. upstream - это имя, которое вы даете пульту дистанционного управления, и хотя это может быть что угодно, upstream - это обычное имя.

Шаг 2:

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

... где {id} - номер запроса на вытягивание. upstream - это имя пульта дистанционного управления, с которого требуется извлечь, то есть просто «восходящий поток», если вы точно выполнили шаг 1. Это также может быть URL-адрес, и в этом случае вы можете пропустить шаг 1.

Шаг 3:

Введите сообщение фиксации для фиксации слияния. Вы можете оставить значение по умолчанию, хотя я рекомендую дать красивую однострочную сводку с номером запроса на вытягивание, проблемой, которую он устраняет, и кратким описанием:

Merge PR#42, fixing VIM-652, support for mapping arbitrary IDEA actions
person jbyler    schedule 20.10.2014
comment
Также см. связанный ответ с вариантом, который создает локальную ветвь с запросом на перенос в ней. И последний вариант: вы можете использовать git pull upstream refs/pull/{id}/head, чтобы поместить коммиты в ваше локальное репо, а затем ссылаться на них как на FETCH_HEAD (например, git log ..FETCH_HEAD, чтобы увидеть, что в нем, затем git merge FETCH_HEAD) - person jbyler; 21.10.2014
comment
как мне сделать перебазирование, чтобы запрос на перенос был во главе, и я мог избежать пузыря слияния? - person Michael Johnston; 25.04.2017
comment
Это было то решение, которое мне было нужно, потому что автор запроса на перенос удалил свое репо. - person jswetzen; 25.12.2017
comment
Да, это также работает для слияния открытого PR из репозитория, который больше не является общедоступным. - person James; 17.01.2021

Более подробная информация, которая сработала для меня.

Мой файл .git / config для разветвленного репо выглядит так:

[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/*

Затем запустите «git fetch source», который затем перечислит все запросы на вытягивание из разветвленного репо.

 * [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

А затем для слияния в конкретном запросе на перенос выполните команду "git merge master origin / pr / 67"

person Brian Litzinger    schedule 18.11.2013
comment
Я отредактировал свой .git / config и добавил строки [удаленный источник], но для интересующего меня проекта инструкции работали безупречно. Мне нравится этот ответ. - person philo vivero; 13.08.2014
comment
Отличные советы по теме можно найти на странице news.ycombinator.com/item?id=9051220 и help.github.com/articles/checking-out-pull- request-locally намекает на это (потрясающее) предназначенное только для чтения удаленное refs/pull/ пространство имен для GitHub. - person Philip Durbin; 15.02.2015
comment
Если вы используете Smartgit, вы можете увидеть эти запросы на вытягивание (и закрытые) в графике журнала, если вы добавите smartgit.branch.otherRefs=notes;pull в smartgit.properties согласно syntevo.com/doc/display/SG/System+Properties - вы также можете объединить их оттуда. - person CAD bloke; 19.01.2016
comment
кстати, вы также можете попробовать его в командной строке с помощью git fetch source + refs / Heads / *: refs / remotes / upstream / * + refs / pull / * / head: refs / remotes / origin / pr / * - person lib; 12.01.2017

Я бы сделал следующее;

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

Теперь я объединил изменения в тестовую ветку с именем test_fork. Чтобы никакие изменения не испачкали мое дерево.

При желании вы можете использовать вишневый выбор, как описано выше, чтобы выбрать конкретную фиксацию, если это более предпочтительно.

Счастливых путешествий :)

person MindTooth    schedule 17.05.2011

Я использую для этого удобный сценарий денди. Я запускаю сценарий, набирая:

git prfetch upstream

и он получает все запросы на вытягивание из восходящей ветки.

Для создания скрипта создайте файл ~/bin/git-prfetch.

Файл должен содержать следующее:

#!/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/\*

Убедитесь, что ваш путь включает сценарий, установив:

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

Вы можете добавить этот файл в ~/.bashrc, чтобы изменения были постоянными.

Теперь убедитесь, что вы добавили вилку, от которой хотите получать запросы на вытягивание:

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

А потом

git prfetch upstream
person Richard    schedule 01.08.2019