Як застосувати запити про витягнення з інших вил до моєї вилки?


465

Проект на GitHub, який у мене є fork of, має нові запити на потяг, які я хочу втягнути у свою вилку, яку автор ще не втягнув.

Чи є простий спосіб застосувати запит на тягу з інших вил до моєї вилки? Чи є ще щось, чого я пропускаю?


8
Є інструкція: gist.github.com/piscisaureus/3342247
Piotr

Чи відображається це на графіку мережі в GitHub, якщо ви використовуєте для цього команди git?
ADTC

Можливо, також буде цікаво знайти усі гілки: stackoverflow.com/q/47798937/10245
Тім Абел

Відповіді:


276

Ви можете зробити це вручну досить легко:

  • додайте іншу вилку як віддалену частину репо:

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

166
Насправді, ви не повинні використовувати вишеньку, це створює нові коміти ... що, в свою чергу, спричинить плутанину, якщо ви надішлете запит на витяг вище. Натомість вам слід злитись так, як просить зробити запит на витяг. Вам також не потрібно додавати пульт. git pull URL branchname
Tekkub

3
@Tekkub: погодьтеся, може бути краще уникнути плутанини з новоствореними комітетами. Злиття є менш елегантним на мою думку, оскільки ви можете внести інші зміни з гілки, з якою ви зливаєтесь
CharlesB

8
Так, але в цьому випадку він спеціально запитав, як затягнути запит на тягу до вилки. Потягніть == злиття.
Tekkub

1
@CharlesB, оскільки GitHub автоматично додає нові зобов’язання в ту ж гілку до запиту на виклик, чи не буде важко отримати будь-які "інші зміни" (якщо припускати, що запитувач дотримується кращих практик і змінює зміни в окрему гілку від подальшого розвитку, так що всі комісії є актуальними), якщо ви не отримуєте лише частину запиту на виклик?
neverfox

4
Для тих, хто поділяє мій ментальний глюк, "otherfork" не посилається на оригінал repo, він посилається на комісію з вилки, яка видала запит на тягу, до оригінального репо. Проігноруйте оригінал репо і перейдіть безпосередньо до вилки, яка зробила запит на тягу. Ви хочете вручну витягнути фільтр, на який посилався, і об'єднати його з власним.
Майкл Халілі

282

Оновлення: через веб-сторінку

Ви також можете це зробити на веб-сторінці github.

Я припускаю, ви вже повинні мати fork ( MyFork) загальної репо ( BaseRepo), який має очікуваний запит на витяг з вилки ( OtherFork), який вас цікавить.

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

Тепер у вашого fork ( MyFork) має бути відкладений запит на витяг , який ви можете просто прийняти.


6
Працює прекрасно. Набагато простіший, ніж cmd-рядок, і легко переглядати зміни. Дякую.
Альвеоли

3
У мене були проблеми з пошуком того, як потрапити на "OtherFork" в інтерфейсі. Щоб легко потрапити туди, просто змініть URL-адресу з ім'ям користувача github. тобто github.com/userName/repoName
Чарльз

2
Мені не вдалося побачити очікувані запити на виклик, згадані на кроці 4. Натомість я вибрав гілку, що відповідає запиту на виклик, зробленому OtherForkправою рукою спадне меню "Порівняти". Потім я вибрав ліву частину як базову виделку, як описано вище, як міг створити запит на тягу.
седонім

Працює, якщо немає виделки. Наприклад: github.com/OculusVR/RakNet/pull/61/files
Мілан Бабушков

1
Точні слова з сайту githubs можуть бути застарілими, але процес не вказується. Супер просто - спасибі!
кевнк

73

Як раніше говорив Tekkub, ви можете просто потягнути гілку безпосередньо. Більшу частину часу з GitHub, відділення просто "майстер" на запиті вилки користувача проекту.

Приклад: git pull https://github.com/USER/PROJECT/ BRANCH

І як прикладний приклад:

Скажіть, що ви розіграли проект github, який називається сафарікниги, і в початковому проекті є наступний запит на тягу, який ви хочете помістити у вашу вилку:

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

Потім у папці клонованого проекту вашої вилки запустіть:

git pull https://github.com/fermionic/safaribooks.git fix-str-decode

20
Недоліком цього є те, що у філії можуть бути інші речі, крім запиту на витяг. Крім того, ви повинні знайти належну URL-адресу для виделки автора запиту на витягування. Якщо ви хочете скористатися однолінійкою, краще скористайтеся git pull https://github.com/{upstream/project} refs/pull/{id}/headнатомість.
jbyler

1
@jbyler Якщо у філії є інші речі, я майже впевнений, що GitHub все одно оновить запит на виклик.
Тім Малоун

22

Запити на проект можуть надходити від багатьох авторів (вилок), і ви, мабуть, не хочете окремого дистанційного для кожного вила. Крім того, ви не хочете робити жодних припущень щодо гілки, яку автор використовував під час подання запиту на виклик, або що ще може бути у головній гілці автора. Тому краще посилатися на запит на витяг, як він відображається у сховищі вище, ніж як в інших виделках.

Крок 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

Також дивіться відповідна відповідь з варіантом, який створює локальну гілку із запитом на витяг. І остаточний варіант: ви можете скористатись git pull upstream refs/pull/{id}/headкомісіями у вашому місцевому репо, а потім посилатися на них як FETCH_HEAD(наприклад, git log ..FETCH_HEADщоб побачити, що тут, то git merge FETCH_HEAD)
jbyler

як би я пішов про повторне звільнення, щоб запит на виклик був на чолі, і я можу уникнути міхура злиття?
Майкл Джонстон

1
Це рішення було мені потрібне, оскільки автор запиту на вилучення видалив його репо.
jswetzen

20

Деякі детальніші відомості, які працювали на мене.

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

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = false
[remote "origin"]
        url = git@github.com: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"


1
Я відредагував свій .git / config та додав рядки [віддаленого "джерела"], але для проекту, який мене зацікавив, і інструкції працювали бездоганно. Я люблю цю відповідь.
philo vivero

3
Відмінні пов'язані поради можна знайти на news.ycombinator.com/item?id=9051220 та help.github.com/articles/checking-out-pull-requests-помітно натякає на це (дивовижне) специфічне для GitHub віддалене refs/pull/простору імен .
Філіп Дурбін

Якщо ви використовуєте Smartgit, ви можете бачити ці запити на витягнення (і закриті) в графі журналу, якщо ви додасте smartgit.branch.otherRefs=notes;pullдо smartgit.properties відповідно до syntevo.com/doc/display/SG/System+Properties - ви також можете об'єднати їх звідти .
CAD заблокували

btw, ви також можете спробувати його в командному рядку з джерелом git fetch + refs / heads / *: refs / Remotes / upstream / * + refs / pull / * / head: refs / Remotes / origin / pr / *
lib

9

Що я б робив, це наступне;

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

Зараз я об'єднав зміни в тестову гілку, названу test_fork. Так що будь-які зміни не забруднить моє дерево.

За бажанням ви можете використовувати вишню, як описано вище, для вибору конкретного комітету, якщо це є більш кращим.

Щасливих подорожей :)


0

Для цього я використовую зручний сценарій денді. Я запускаю сценарій, ввівши:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.