केवल नवीनतम प्रतिबद्ध के लिए GitHub पर एक पुल अनुरोध भेजें


280

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

मैं यह समझने की कोशिश कर रहा था कि क्या मुझे एक नई स्थानीय शाखा बनानी चाहिए, यह देख लें कि किसी भी तरह से रीसेट करें या अपस्ट्रीम को रीबेस करें? फिर अपने स्थानीय स्वामी से मेरे नए स्थानीय शाखा में आईडी के लिए अंतिम अनुरोध लागू करें और पुल अनुरोध के लिए उपयोग करें?

मैं अवधारणाओं को सही पाने की कोशिश कर रहा हूं और मुझे जो करना है उसके लिए सही कमांड लाइनों का पता लगाना है।


और अगर आप अन्य सभी कमिट्स के साथ पुल अनुरोध करते हैं तो क्या होगा? मैंने सोचा था कि कमिट को अनदेखा करना (या पास करना) काफी चतुर है, जो पहले से ही इसमें खींचा हुआ है?
जयरोजो

3
संभवत: अपस्ट्रीम को अभी तक स्वीकार नहीं किया गया है, या नहीं चाहता है, हस्तक्षेप करना शुरू करता है।
माइकल स्कॉट कथबर्ट

@ Ajarjo उदाहरण के लिए मैंने अन्य बदलाव किए जो मैं ऊपर नहीं भेजना चाहता। मुख्य रिपॉजिटरी को नजरअंदाज करने के लिए परिवर्तन के उदाहरण की जरूरत नहीं होगी। कुछ भी आसान नहीं है।
मार्टिन

संबंधित: Git (सॉफ़्टवेयर) और GitHub (वेब ​​सेवा) में पुल अनुरोध कैसे भिन्न हैं, इसके बारे में कुछ अच्छे विवरण
RBT

जवाबों:


302

आप मूल रूप से बनाने के लिए एक नई शाखा और जरूरत चेरी लेने करता आप इसे में जोड़ना चाहते हैं।

नोट: चेकआउट / चेरी-पिक कमांड से पहले आपको इनकी आवश्यकता हो सकती है

git remote add upstream <git repository>

git remote update

git checkout -b <new-branch-name> upstream/master

git cherry-pick <SHA hash of commit>

git push origin <new-branch-name>

बाद में, आप <new-branch-name>जीथब पर शाखा देखेंगे , इसे स्विच कर सकते हैं और अपने इच्छित परिवर्तनों के साथ पुल अनुरोध सबमिट कर सकते हैं।


32
मुझे git चेकआउट चलाने से पहले git remote add upstream <git repository>और git remote updateउससे पहले अपस्ट्रीम / मास्टर की आवश्यकता है।
प्लेनजिमो

6
यह काम करता है, लेकिन ऐसा नहीं है कि आप इसे कैसे करने वाले हैं, क्योंकि अब आपकी अपस्ट्रीम शाखा और अपस्ट्रीम / मास्टर अलग हैं और हमेशा अलग रहेंगे यदि आपके पुल अनुरोध को मर्ज करना पहली बात नहीं है। उस कारण से आपको stackoverflow.com/a/5256304/1904815 करना पसंद करना चाहिए ।
जॉनीजेड

2
विस्तृत करने के लिए: यह एक तकनीकी समस्या नहीं है, लेकिन एक तार्किक है। जब आप अपस्ट्रीम के साथ कुछ भी करना चाहते हैं (जैसे वहां से विलय करना) तो आपको एक शाखा "वास्तविक-अपस्ट्रीम" जोड़ने या अपने अपस्ट्रीम को रीसेट करने की आवश्यकता है (अतिरिक्त परिवर्तनों के लिए आपके पुल अनुरोध के लिए कोई स्थानीय शाखा नहीं छोड़ना)।
जॉनीजेड

15
पृथ्वी पर मुझे एक अतिरिक्त शाखा की आवश्यकता क्यों है, केवल कोड की एक एकल परिवर्तित लाइन के लिए पीआर बनाने के लिए ?! क्या गितुब में किसी ने यह सोचा था?
CodeManX

2
@JonHanna नहीं ... आपको एक शाखा का विलय क्यों करना है? आप केवल एक मर्ज क्यों नहीं कर सकते?
केविन क्रुमविडे

57

नवीनतम प्रतिबद्ध से शुरू होने वाली एक नई शाखा बनाएं, जो मूल भंडार में भी है:

git branch new-branch origin/master
git checkout new-branch

तब git cherry-pickआप जिस एकल के लिए पुल अनुरोध चाहते हैं उसे प्राप्त करने के लिए उपयोग करें। अगर इस कमेटी के साथ ब्रांच को बुलाया जाता है featureऔर आप जो कमिटमेंट चाहते हैं वह इस ब्रांच की लेटेस्ट कमेटी है

git cherry-pick feature

इस पैच को बिना संघर्ष के लागू करने पर, आपको अब एक शाखा मिल गई है, जिसके लिए आप अपना पुल अनुरोध कर सकते हैं।

एक दूसरे चरण में, अब आपको यह तय करने की आवश्यकता है कि आपकी featureशाखा का क्या करना है । यदि आपने अभी तक इस शाखा पर अपने परिवर्तन प्रकाशित नहीं किए हैं, तो सबसे अच्छी प्रक्रिया संभवतः नई-शाखा पर इस शाखा को पुन: पेश कर रही है (और अंतिम प्रतिबद्ध को हटा रहा है, यदि यह स्वचालित रूप से नहीं किया जाता है git rebase)।


मुझे यह संदेश चेरी-पिक के बाद मिला है। कुछ भी शामिल नहीं है लेकिन मौजूद फ़ाइलों को अनट्रैक करने के लिए (ट्रैक करने के लिए "गिट ऐड" का उपयोग करें)। सब कुछ मेरे स्वामी में है, लेकिन मुझे अपनी शाखा ऊपर से बनाने की आवश्यकता है।
केविन हेकसन

5
यदि featureपहले से ही प्रतिबद्ध है origin/master, के दौरान कुछ भी नहीं होता है cherry-pick। नई शाखा से होना चाहिए upstream/master(यानी, केविन
हैकन

26

मैं एक ऐसी स्थिति में समाप्त हो गया, जहां मैंने एक कांटा लिया था और मूल परियोजना के लिए वापस अनुरोध सबमिट करना चाहता था।

मैं था:

  • orignal_project
  • forked_project (SHA: 9685770 पर मूल परियोजना से निर्मित)
  • my_fork (SHA: 207e29b पर कांटे की परियोजना से निर्मित)
  • मेरे कांटे में एक प्रतिबद्धता (SHA: b67627b) जिसे मैं मूल परियोजना में वापस प्रस्तुत करना चाहता था

ऐसा करने के लिए, मैं:

  1. SHA से एक नई शाखा बनाई गई जहां मूल परियोजना को कांटा गया था
  2. मूल परियोजना से सभी को खींच लिया
  3. चेरी ने उस कमिट को उठाया जिसे मैं एक पुल अनुरोध के रूप में प्रस्तुत करना चाहता था
  4. यह सब github तक धकेल दिया

Git कमांड कुछ इस तरह थे:

  1. git Branch my-feature-request-9685770
  2. git चेकआउट माय-फीचर-रिक्वेस्ट
  3. git pull https://github.com/original_project/original_project.it
  4. git चेरी-पिक b67627b
  5. git पुश ओरिजिन माय-फीचर-रिक्वेस्ट

फिर मैंने मूल परियोजना के लिए अपने पुल अनुरोध के लिए शाखा के रूप में अपना फ़ीचर-अनुरोध प्राप्त किया।


6

यह लगभग मेरे लिए काम किया:

git checkout -b upstream upstream/master

git cherry-pick <SHA hash of commit>

git push origin upstream

एकमात्र अंतर यह था:

git push origin upstream:upstream

मुझे उस अंतिम पंक्ति को बदलने की आवश्यकता थी ताकि गिट पुश मेरे गिटहब रेपो में अपस्ट्रीम शाखा बना सके ताकि मैं इससे पीआर बना सकूं।


5

मैंने पहले ही कमिट कर दिया था, जिसे मैं वर्तमान ब्रांच में एक पुल अनुरोध के रूप में अलग करना चाहता था।

इसलिए मैंने एक नई शाखा की जाँच की

git checkout -b isolated-pull

और यहाँ जहाँ मेरा समाधान @ केविन हैकन्सन से भिन्न है , क्योंकि मुझे इस शाखा को इतिहास में उस स्थान पर स्थापित करने की आवश्यकता है जहाँ से मैं अलग होना चाहता हूँ

git reset --hard [sha-to-diff-by]

और चेरी-उस कमिट को चुनें, जिसमें से मैं एक पृथक पुल अनुरोध बनाना चाहता हूं

git cherry-pick [my-isolated-commit-sha]

अंत में इसे रिमोट तक पुश करें

git push origin isolated-pull

और रिक्वेस्ट डाट शि को खींचें।


1

एक नई (अस्थायी) शाखा, चेरी-पिक बनाने और उस शाखा के लिए पुल अनुरोध बनाने के समाधान ने मुझे संतुष्ट नहीं किया। मैं अपने रिपॉजिटरी को कमिट्स के सेट उपलब्ध कराने के लिए बदलना नहीं चाहता था, इसलिए मैं निम्नलिखित विकल्प के साथ आया:

पहले ब्याज की सभी कमियों के लिए पैच फ़ाइलें बनाएँ:

git format-patch -1 <sha>

यदि ब्याज की प्रतिबद्धता अंतिम है तो आप HEADइसके बजाय उपयोग कर सकते हैं <sha>

अब, आप स्रोत रिपॉजिटरी के अनुचर को पैच भेज सकते हैं, जो उन्हें लागू कर सकते हैं:

git branch new-branch <master or some older commit where the fork diverged>
git checkout new-branch

git am < <the patch>
...

git checkout master
git merge new-branch

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


0

@ केविन-हैकेन्सन के उत्तर के आधार पर, मैंने इस प्रक्रिया को आसान बनाने के लिए इस छोटे से बैश स्क्रिप्ट को लिखा। यह अपस्ट्रीम रेपो जोड़ देगा यदि यह पहले से मौजूद नहीं है (आपको URL के लिए संकेत दे रहा है) तो बनाने के लिए नई शाखा के नाम और उस शाखा पर चेरी पिक करने के लिए प्रतिबद्ध के टैग / SHA दोनों के लिए संकेत दें। यह जाँच करता है कि आप किस शाखा या कमिटमेंट में हैं, इस समय कोई भी परिवर्तन चुराता है ताकि आप नई शाखा की जाँच कर सकें। मर्ज की रणनीति चेरी द्वारा उठाए गए प्रतिबद्ध से बदलावों को रखती है। नई शाखा को origin(अपने दूरस्थ रेपो का नाम माना जाता है) को धकेलने के बाद , जिस शाखा या वचन पर आप पहले थे, उसे फिर से जांच लिया जाता है और आपके पिछले परिवर्तन स्टैश से पॉप हो जाते हैं।

if ! git remote | grep -q upstream; then
    read -p "Upstream git repo URL: " upstream
    git remote add upstream $upstream
    git remote update
fi

read -p "Feature branch name: " feature_branch
# note: giving "master" is the same as giving the SHA it points to
read -p "SHA of commit to put on branch: " sha

current_branch=$(git rev-parse --abbrev-ref HEAD)
if [ "$current_branch" == "HEAD" ]; then
    # detached HEAD; just get the commit SHA
    current_branch=$(git rev-parse --short HEAD)
fi
git stash
git checkout -b $feature_branch upstream/master
git cherry-pick --strategy=recursive -X theirs $sha
git push origin $feature_branch
git checkout $current_branch
git stash pop

(यह मेरे लिए सरल परीक्षणों के एक जोड़े में काम किया है, लेकिन मैं बैश प्रोग्रामर या गिट विशेषज्ञ नहीं हूं, इसलिए मुझे बताएं कि क्या ऐसे मामले हैं जिन्हें मैंने याद किया है जो बेहतर स्वचालित हो सकते हैं!)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.