मेरे कांटे में अन्य कांटे से अनमर्ज़ अपस्ट्रीम पुल अनुरोध कैसे लागू करें?


464

GitHub पर एक परियोजना है कि मेरे पास एक कांटा है एक नया पुल अनुरोध है जो मैं अपने कांटे में खींचना चाहता हूं कि लेखक ने अभी तक नहीं खींचा है।

क्या मेरे कांटे में अन्य कांटे से पुल अनुरोध लागू करने का एक सरल तरीका है? क्या यहाँ कुछ और है जो मुझे याद आ रहा है?


8
एक निर्देश है: gist.github.com/piscisaureus/3342247
Piotr Migdal

यदि आप इसे करने के लिए git कमांड का उपयोग करते हैं तो क्या यह GitHub पर नेटवर्क ग्राफ पर प्रतिबिंबित करता है?
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
टेककुब

3
@ टेककुब: सहमत हैं, नए बनाए गए कमिटमेंट के साथ भ्रम से बचने के लिए बेहतर हो सकता है। मर्ज मेरे दिमाग में कम सुरुचिपूर्ण है क्योंकि आप जिस शाखा में विलय कर रहे हैं
उससे

8
ऐ, लेकिन इस मामले में उन्होंने विशेष रूप से पूछा कि पुल अनुरोध को अपने कांटे में कैसे खींचना है। खींच == मर्ज।
Tekkub

1
@CharlesB, क्योंकि GitHub स्वचालित रूप से एक पुल अनुरोध पर एक ही शाखा में नए कमिट जोड़ता है, यह किसी भी "अन्य परिवर्तन" प्राप्त करने के लिए कठिन नहीं होगा (आवश्यक मानकर सर्वोत्तम प्रथाओं का पालन करता है और निरंतर विकास से एक अलग शाखा पर परिवर्तन डालता है। जब तक आप क्या कर रहे हैं, तब तक सभी कमिट प्रासंगिक हैं), जब आप एक पुल अनुरोध का केवल एक हिस्सा चाहते हैं?
20

4
जो लोग मेरी मानसिक गड़बड़ को साझा करते हैं, उनके लिए "अन्यफ़ॉर्क्स" मूल रेपो का संदर्भ नहीं दे रहा है, यह कांटा से प्रतिबद्ध का उल्लेख कर रहा है जिसने मूल रेपो के लिए पुल अनुरोध जारी किया है। मूल रेपो को अनदेखा करें और सीधे उस कांटे पर जाएं जिसने पुल अनुरोध किया था। आप मैन्युअल रूप से उस पुल को खींचना चाहते हैं जिसे पुल संदर्भित कर रहा था और इसे अपने स्वयं के साथ मर्ज करें।
माइकल खलीली

282

अपडेट: वाया वेबपेज

आप इसे github वेबपेज के माध्यम से भी कर सकते हैं।

मुझे लगता है, आपके पास पहले से ही MyForkसामान्य रेपो ( ) का एक कांटा ( ) होना चाहिए BaseRepoजिसमें एक कांटा से लंबित पुल अनुरोध ( ) है जिसमें OtherForkआप रुचि रखते हैं।

  1. कांटा पर नेविगेट करें ( OtherFork) जिसने पुल अनुरोध शुरू किया है जिसे आप अपने कांटे में लाना चाहते हैं ( MyFork)
  2. के पुल अनुरोध पृष्ठ पर जाएं OtherFork
  3. नए पुल अनुरोध पर क्लिक करें
  4. लंबित पुल अनुरोध (ओं) की पेशकश की जानी चाहिए। उचित OtherForkशाखा का चयन करना भी याद रखें । अपने कांटे ( MyFork) ( महत्वपूर्ण ) आधार कांटा के रूप में बाईं ओर का चयन करें ।
  5. अब के विकल्प View pull requestको बदलना चाहिए Create pull request। इसे क्लिक करें।

अब आपके पास अपने कांटे ( MyFork) में लंबित पुल अनुरोध होना चाहिए , जिसे आप बस स्वीकार कर सकते हैं।


6
खूबसूरती से काम करता है। सीएमडी लाइन की तुलना में बहुत सरल, और परिवर्तनों की समीक्षा करना आसान है। धन्यवाद।
एल्वियोली

3
मुझे UI पर "OtherFork" प्राप्त करने का तरीका खोजने में परेशानी हुई। आसानी से वहां पहुंचने के लिए सिर्फ जीथब यूजरनेम के साथ यूआरएल को संशोधित करें। यानी github.com/userName/repoName
चार्ल्स

2
मैं चरण 4 में उल्लिखित लंबित पुल अनुरोधों को देखने में सक्षम नहीं था। इसके बजाय, मैंने उस शाखा का चयन किया OtherFork, जो दाहिने हाथ से किए गए पुल अनुरोध के अनुरूप थी , 'तुलना' ड्रॉपडाउन से। मैंने तब बाईं ओर का चयन किया, जैसा कि ऊपर वर्णित आधार कांटा है, जो पुल अनुरोध बनाने में सक्षम था।
राजद्रोह

तब तक काम करता है जब तक कोई कांटा न हो। उदाहरण के लिए: github.com/OculusVR/RakNet/pull/61/files
मिलान बाबूसकोव

1
जीथबब्स साइट के सटीक शब्द पुराने हो सकते हैं, लेकिन प्रक्रिया चालू है। सुपर सरल - धन्यवाद!
केवकर्क

73

जैसे कि टेककुब ने पहले कहा था, आप सीधे शाखा को खींच सकते हैं। GitHub के साथ ज्यादातर समय, शाखा परियोजना के उपयोगकर्ता के कांटे का अनुरोध करने पर "मास्टर" है।

उदाहरण: git pull https://github.com/USER/PROJECT/ BRANCH

और एक व्यावहारिक उदाहरण के रूप में:

मान लीजिए कि आपने सफारीबूक नामक एक गितुब परियोजना को कांटा है और मूल परियोजना में निम्नलिखित पुल अनुरोध है, जिसे आप अपने कांटे में रखना चाहते हैं:

यहाँ छवि विवरण दर्ज करें

फिर, आपके फोर्क के क्लोन प्रोजेक्ट फ़ोल्डर में, रन करें:

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

मैं रिबासिंग के बारे में कैसे जाऊंगा, इसलिए पुल अनुरोध सिर पर है और मैं मर्ज बबल से बच सकता हूं?
माइकल जॉनसन

1
यह मेरे लिए आवश्यक समाधान था, क्योंकि पुल अनुरोध लेखक ने अपने रेपो को हटा दिया था।
jswetzen

20

कुछ और विस्तृत जानकारी जो मेरे लिए काम की है।

कांटा रेपो के लिए मेरी .it / 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" चलाएँ, जिसने तब forked repo से सभी पुल अनुरोधों को सूचीबद्ध किया था।

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

और फिर एक विशिष्ट पुल अनुरोध में विलय करने के लिए "गिट मर्ज मास्टर मूल / पीआर / 67"


1
मैंने अपने .it / config को संपादित किया और [दूरस्थ "स्रोत"] लाइनों को जोड़ा, लेकिन उस परियोजना के लिए जिसमें मुझे दिलचस्पी थी, और निर्देशों ने निर्दोष रूप से काम किया। मुझे यह जवाब पसंद है।
फिलो विवरो

3
उत्कृष्ट संबंधित सलाह news.ycombinator.com/item?id=9051220 और help.github.com/articles/checking-out-pull-requests-locally संकेत पर इस (भयानक) विशेष-केवल पढ़ने योग्य दूरस्थ refs/pull/नाम स्थान पर देखी जा सकती है ।
फिलिप डर्बिन

यदि आप स्मार्टजीट का उपयोग करते हैं, तो आप लॉग ग्राफ में इन पुल अनुरोधों (और बंद वाले) को देख सकते हैं यदि आप smartgit.branch.otherRefs=notes;pullsyntevo.com/doc/display/SG/System+Properties के अनुसार smartgit.properties को जोड़ते हैं - तो आप उन्हें वहां से मर्ज भी कर सकते हैं ।
CAD

btw, आप इसे git fetch source + 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.