github tutorial




मैं गिटहब फोर्कड रिपोजिटरी कैसे अपडेट करूं? (11)

अगर, मेरे जैसे, आप सीधे मास्टर को कुछ भी नहीं करते हैं , जो आपको वास्तव में करना चाहिए, आप निम्न कार्य कर सकते हैं।

अपने कांटे के स्थानीय क्लोन से, अपना अपस्ट्रीम रिमोट बनाएं। आपको केवल एक बार ऐसा करने की ज़रूरत है:

git remote add upstream https://github.com/whoever/whatever.git

फिर जब भी आप अपस्ट्रीम रिपोजिटरी मास्टर शाखा के साथ पकड़ना चाहते हैं तो आपको यह करना होगा:

git checkout master
git pull upstream master

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

तो शुरुआती अपस्ट्रीम सेटअप और मास्टर चेकआउट से पहले, आपको बस इतना करना है कि अपस्ट्रीम के साथ अपने मास्टर को सिंक करने के लिए निम्न आदेश चलाएं: गिट पुल अपस्ट्रीम मास्टर

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

कुछ दिनों बाद एक और योगदानकर्ता ने एक और योगदान दिया। तो मेरे कांटा में वह परिवर्तन नहीं है।

मैं अपने कांटा में उस परिवर्तन को कैसे प्राप्त कर सकता हूं? क्या मुझे योगदान देने के लिए और बदलाव होने पर मुझे अपने कांटा को हटाने और फिर से बनाने की ज़रूरत है? या कोई अद्यतन बटन है?


असल में, ब्राउज़र में अपस्ट्रीम की किसी भी प्रतिबद्धता से अपने कांटा में एक शाखा बनाना संभव है:

  • https://github.com/<repo>/commits/<hash> खोलें, जहां रेपो आपका कांटा है, और हैश प्रतिबद्धता का पूर्ण हैश है जिसे आप अपस्ट्रीम वेब इंटरफ़ेस में पा सकते हैं। उदाहरण के लिए, मैं https://github.com/max630/linux/commits/0aa0313f9d576affd7747cc3f179feb097d28990 खोल सकता हूं, जो linux master को लेखन के समय के रूप में इंगित करता है।
  • "वृक्ष: ...." बटन पर क्लिक करें।
  • नई शाखा का नाम टाइप करें और एंटर दबाएं

फिर आप उस शाखा को अपने स्थानीय क्लोन में ला सकते हैं, और जब आप उस प्रतिबद्धता के शीर्ष पर संपादन को दबाते हैं तो आपको उस डेटा को गिटहब पर वापस धक्का नहीं देना पड़ेगा। या उस शाखा में कुछ बदलने के लिए वेब इंटरफ़ेस का उपयोग करें।

यह कैसे काम करता है (यह अनुमान है, मुझे नहीं पता कि गिटहब वास्तव में यह कैसे करता है): फोर्क ऑब्जेक्ट स्टोरेज साझा करते हैं और उपयोगकर्ता के संदर्भों को अलग करने के लिए namespaces का उपयोग करते हैं। तो आप अपने कांटा के माध्यम से सभी कामों तक पहुंच सकते हैं, भले ही वे फोर्किंग के समय मौजूद न हों।


इस जवाब के पूरक के रूप में, मैं एक बार में अपस्ट्रीम शाखाओं से अपने क्लोन रेपो ( मूल ) की सभी दूरस्थ शाखाओं को अद्यतन करने का एक तरीका ढूंढ रहा था। मैंने इस तरह से इसे किया।

यह मानता है कि आपने पहले से ही स्रोत भंडार (जहां मूल से फोर्क किया गया था) पर एक अपस्ट्रीम रिमोट पॉइंटिंग कॉन्फ़िगर किया है और इसे git fetch upstream साथ समन्वयित किया है।

फिर भागो:

for branch in $(git ls-remote --heads upstream|sed 's#^.*refs/heads/##'); do git push origin refs/remotes/upstream/$branch:refs/heads/$branch; done

इस कमांड का पहला भाग अपस्ट्रीम रिमोट रेपो में सभी प्रमुखों को सूचीबद्ध करता है और SHA-1 को refs/heads/ शाखा नाम उपसर्ग के बाद हटा देता है।

फिर इन शाखाओं में से प्रत्येक के लिए, यह अपस्ट्रीम रिमोट ट्रैकिंग शाखा की स्थानीय प्रतिलिपि (स्थानीय तरफ refs/remotes/upstream/<branch> ) मूल पर दूरस्थ शाखा (रिमोट refs/heads/<branch> पर दूरस्थ तरफ) )।

इनमें से कोई भी शाखा सिंक आदेश दो कारणों में से एक के लिए असफल हो सकता है: या तो अपस्ट्रीम शाखा को फिर से लिखा गया है, या आपने उस शाखा पर अपने कांटे पर काम किया है। पहले मामले में जहां आपने अपने कांटे पर शाखा में कुछ भी नहीं किया है, बलपूर्वक धक्का देना सुरक्षित है ( -एफ स्विच जोड़ें, यानी ऊपर दिए गए आदेश में git push -f )। दूसरे मामले में यह सामान्य है क्योंकि आपकी कांटा शाखा अलग हो गई है और आप सिंक कमांड को तब तक काम करने की उम्मीद नहीं कर सकते जब तक कि आपके कामों को अपस्ट्रीम में वापस विलय नहीं किया जाता है।


एंड्रॉइड स्टूडियो ने अब गिटहब कांटा भंडारों के साथ काम करना सीखा है (आपको कंसोल कमांड द्वारा "अपस्ट्रीम" रिमोट रिपोजिटरी भी जोड़ने की ज़रूरत नहीं है)।

ओपन मेनू वीसीएसगिट

और दो अंतिम पॉपअप मेनू आइटम पर ध्यान दें:

  • मेरे गिटहब कांटा को दोबारा दोहराएं

  • पुल अनुरोध बनाएँ

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

(मैं एंड्रॉइड स्टूडियो 3.0 का उपयोग "गिट एकीकरण" और "गिटहब" प्लगइन के साथ करता हूं।)


नवंबर 2013 के बाद से गिटहब के साथ एक अनौपचारिक सुविधा अनुरोध खुला है, ताकि उन्हें स्थानीय फर्क को अपस्ट्रीम के साथ सिंक में रखने के लिए एक बहुत ही सरल और सहज तरीका जोड़ने के लिए कहा जा सके:

https://github.com/isaacs/github/issues/121

नोट: चूंकि सुविधा अनुरोध अनौपचारिक है, इसलिए इसे लागू करने के लिए इस तरह की सुविधा के लिए अपना समर्थन जोड़ने के लिए [email protected] से संपर्क करने की भी सलाह दी जाती है। उपरोक्त अनौपचारिक सुविधा अनुरोध को लागू किए जा रहे ब्याज की राशि के साक्ष्य के रूप में उपयोग किया जा सकता है।


नीचे दिए गए चरणों का पालन करें। मैंने उनकी कोशिश की और इससे मेरी मदद की।

अपनी शाखा में चेकआउट करें

सिंटेक्स: गिट शाखा आपके डेवलपमेंट ब्रंच
उदाहरण: गिट चेकआउट मास्टर

नवीनतम कोड प्राप्त करने के लिए स्रोत भंडार शाखा खींचें

सिंटेक्स: गिट खींचें https://github.com/tastejs/awesome-app-ideas मास्टर
उदाहरण: गिट खींचें https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git BRANCH_NAME


मई 2014 से शुरू, गिटहब से सीधे एक कांटा अद्यतन करना संभव है। यह अभी भी सितंबर 2017 के रूप में काम करता है, लेकिन यह एक गंदे प्रतिबद्ध इतिहास का कारण बन जाएगा।

  1. गिटहब पर अपना कांटा खोलें।
  2. पुल अनुरोधों पर क्लिक करें।
  3. न्यू पुल अनुरोध पर क्लिक करें। डिफ़ॉल्ट रूप से, गिटहब मूल की तुलना आपके फोर्क से करेगा, और यदि आपने कोई बदलाव नहीं किया है तो तुलना करने के लिए कुछ भी नहीं होना चाहिए।
  4. यदि आप उस लिंक को देखते हैं तो आधार को स्विच करने पर क्लिक करें। अन्यथा, मैन्युअल रूप से आधार कांटा को अपने कांटा में छोड़ दें, और ऊपर की ओर सिर का कांटा सेट करें। अब गिटहब मूल के साथ आपके कांटे की तुलना करेगा, और आपको सभी नवीनतम परिवर्तन देखना चाहिए।
  5. पुल अनुरोध बनाएं और अपने पुल अनुरोध (उदाहरण के लिए, Update from original ) पर अनुमानित नाम असाइन करें।
  6. पुल अनुरोध मर्ज करने के लिए नीचे स्क्रॉल करें , लेकिन अभी तक कुछ भी क्लिक न करें।

अब आपके पास तीन विकल्प हैं, लेकिन प्रत्येक एक कम से कम स्वच्छ प्रतिबद्ध इतिहास का नेतृत्व करेगा।

  1. डिफ़ॉल्ट एक बदसूरत विलय प्रतिबद्धता पैदा करेगा।
  2. यदि आप ड्रॉपडाउन पर क्लिक करते हैं और "स्क्वाश और विलय" चुनते हैं, तो सभी हस्तक्षेप करने वाली गतिविधियों को एक में squashed किया जाएगा। यह अक्सर ऐसा कुछ होता है जिसे आप नहीं चाहते हैं।
  3. यदि आप रीबेस और विलय पर क्लिक करते हैं, तो सभी कामों को आपके साथ "बनाया जाएगा", मूल पीआर आपके पीआर से लिंक होंगे, और गिटहब प्रदर्शित करेगा कि This branch is X commits ahead, Y commits behind <original fork>

तो हां, आप अपने रेपो को गिटहब वेब यूआई का उपयोग करके अपने अपस्ट्रीम के साथ अपडेट कर सकते हैं, लेकिन ऐसा करने से आपका प्रतिबद्धता इतिहास खराब हो जाएगा। इसके बजाय कमांड लाइन पर चिपकाएं - यह आसान है।


मैं इस लाइन के साथ अपने फोर्कड रेपो अपडेट करता हूं:

git pull https://github.com/forkuser/forkedrepo.git branch

यदि आप यहां पोस्ट किए गए अन्य समाधानों के रूप में, अपने प्रोजेक्ट में एक और रिमोट एंडपॉइंट जोड़ना नहीं चाहते हैं तो इसका उपयोग करें।


यह आपके भंडार के आकार और आपने इसे कैसे फोर्क किया है, इस पर निर्भर करता है।

यदि यह काफी बड़ा भंडार है तो आप इसे एक विशेष तरीके से प्रबंधित करना चाहते थे (जैसे ड्रॉप इतिहास)। असल में, आप वर्तमान और अपस्ट्रीम संस्करणों के बीच मतभेद प्राप्त कर सकते हैं, उन्हें प्रतिबद्ध कर सकते हैं और फिर चेरी मास्टर को वापस ले सकते हैं।

इसे पढ़ने का प्रयास करें। यह वर्णन करता है कि बड़े गिट भंडारों को कैसे संभालें और नवीनतम परिवर्तनों के साथ उन्हें कैसे अपस्ट्रीम करें।


यहां एक कांटा सिंक करने पर गितहब का आधिकारिक दस्तावेज है:

एक कांटा सिंकिंग

स्थापित करना

सिंक करने से पहले, आपको एक रिमोट जोड़ना होगा जो अपस्ट्रीम रिपोजिटरी को इंगित करता है। जब आपने मूल रूप से फोर्क किया था तो आपने ऐसा किया होगा।

युक्ति: अपने कांटा को सिंक करना केवल भंडार की आपकी स्थानीय प्रति अपडेट करता है; यह गिटहब पर आपके भंडार को अपडेट नहीं करता है।

$ git remote -v
# List the current remotes
origin  https://github.com/user/repo.git (fetch)
origin  https://github.com/user/repo.git (push)

$ git remote add upstream https://github.com/otheruser/repo.git
# Set a new remote

$ git remote -v
# Verify new remote
origin    https://github.com/user/repo.git (fetch)
origin    https://github.com/user/repo.git (push)
upstream  https://github.com/otheruser/repo.git (fetch)
upstream  https://github.com/otheruser/repo.git (push)

सिंक कर रहा है

अपस्ट्रीम के साथ अपने भंडार को सिंक करने के लिए दो चरणों की आवश्यकता है: सबसे पहले आपको रिमोट से प्राप्त करना होगा, फिर आपको वांछित शाखा को अपनी स्थानीय शाखा में मर्ज करना होगा।

ला रहा है

रिमोट रिपोजिटरी से प्राप्त करने से इसकी शाखाएं और उनके संबंधित काम आएंगे। ये विशेष शाखाओं के तहत आपके स्थानीय भंडार में संग्रहीत हैं।

$ git fetch upstream
# Grab the upstream remote's branches
remote: Counting objects: 75, done.
remote: Compressing objects: 100% (53/53), done.
remote: Total 62 (delta 27), reused 44 (delta 9)
Unpacking objects: 100% (62/62), done.
From https://github.com/otheruser/repo
 * [new branch]      master     -> upstream/master

अब हमारे पास अपस्ट्रीम की मास्टर शाखा स्थानीय शाखा, अपस्ट्रीम / मास्टर में संग्रहीत है

$ git branch -va
# List all local and remote-tracking branches
* master                  a422352 My local commit
  remotes/origin/HEAD     -> origin/master
  remotes/origin/master   a422352 My local commit
  remotes/upstream/master 5fdff0f Some upstream commit

विलय

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

$ git checkout master
# Check out our local master branch
Switched to branch 'master'

$ git merge upstream/master
# Merge upstream's master into our own
Updating a422352..5fdff0f
Fast-forward
 README                    |    9 -------
 README.md                 |    7 ++++++
 2 files changed, 7 insertions(+), 9 deletions(-)
 delete mode 100644 README
 create mode 100644 README.md

यदि आपकी स्थानीय शाखा में कोई अनोखा काम नहीं था, तो गिट इसके बजाय "फास्ट-फॉरवर्ड" करेगा:

$ git merge upstream/master
Updating 34e91da..16c56ad
Fast-forward
 README.md                 |    5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

युक्ति: यदि आप गिटहब पर अपना भंडार अपडेट करना चाहते हैं, तो here दिए गए निर्देशों here पालन here


अपने फोर्कड रिपॉजिटरी के अपने स्थानीय क्लोन में, आप मूल गिटहब रिपॉजिटरी को "रिमोट" के रूप में जोड़ सकते हैं। ("रिमोट्स" रिपॉजिटरीज के यूआरएल के लिए उपनामों की तरह हैं - origin उदाहरण है, उदाहरण के लिए।) फिर आप उस अपस्ट्रीम रिपोजिटरी से सभी शाखाएं ला सकते हैं, और अपस्ट्रीम संस्करण पर काम करना जारी रखने के लिए अपने काम को दोबारा कर सकते हैं। आदेशों के संदर्भ में जो दिख सकते हैं:

# Add the remote, call it "upstream":

git remote add upstream https://github.com/whoever/whatever.git

# Fetch all the branches of that remote into remote-tracking branches,
# such as upstream/master:

git fetch upstream

# Make sure that you're on your master branch:

git checkout master

# Rewrite your master branch so that any commits of yours that
# aren't already in upstream/master are replayed on top of that
# other branch:

git rebase upstream/master

यदि आप अपनी मास्टर शाखा के इतिहास को फिर से लिखना नहीं चाहते हैं, (उदाहरण के लिए क्योंकि अन्य लोगों ने इसे क्लोन कर दिया हो) तो आपको git merge upstream/master साथ अंतिम कमांड को प्रतिस्थापित करना चाहिए। हालांकि, आगे खींचने के अनुरोधों को जितना संभव हो उतना साफ करने के लिए, संभवतया रीबेज करना बेहतर है।

यदि आपने अपनी शाखा को upstream/master पर रीबेस कर दिया है तो आपको इसे गिटहब पर अपने स्वयं के फोर्कड रिपॉजिटरी में धक्का देने के लिए पुश को मजबूर करने की आवश्यकता हो सकती है। आप इसके साथ ऐसा करेंगे:

git push -f origin master

आपको केवल पुनः भुगतान करने के बाद पहली बार -f का उपयोग करने की आवश्यकता है।





github