github: मौजूदा पुल अनुरोध में जोड़ता है


88

करने के लिए मैं एक पुल अनुरोध खोला रेल का उपयोग करके GitHub पर रेपो कांटा और संपादित इस फ़ाइल फ़ाइल बटन।

अब, अपने पीआर पर प्रतिक्रिया प्राप्त करने के बाद, मैं कुछ और कमिट जोड़ना चाहता था। तो यहाँ है कि मैं क्या कर समाप्त हो गया

$ git clone git@github.com:gaurish/rails.git #my forked repo
$ git rebase -i 785a2e5 #commit hash of my commit using which PR was opened
$ git checkout patch-3 #branch name I had to send my commits under to be shown in that PR
$ git commit -am "Changes done as per feedback"
$ git push origin patch-3

यह ठीक काम किया, लेकिन काफी जटिल वर्कफ़्लो लगता है। शायद मैं यहाँ कुछ गलत हूँ?

मेरा सवाल है: क्या मैं इसे सही तरीके से कर रहा हूं? यदि नहीं, तो ऐसा करने का उचित तरीका क्या है?


4
यहां आने वाले कुछ लोग अपने परिदृश्य को बेहतर पाते हैं: stackoverflow.com/questions/9790448/…
AaronLS

4
मुझे यह प्रश्न / उत्तर स्पष्ट का संस्करण भी मिला: stackoverflow.com/questions/7947322/…
बेन व्हीलर

जवाबों:


62

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


10

मैंने अभी हाल ही में इस विषय पर ब्लॉग किया है:

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

इसलिए हमें विलय के बजाय रिबास करने की आवश्यकता है:

git co devel #devel is ansible's HEAD aka "master" branch
git pull --rebase upstream devel
git co user-non-unique
git rebase devel

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

अब, उन अद्यतनों को आपकी व्यक्तिगत GitHub सुविधा शाखा में धकेलने से यहाँ विफल हो जाएगा, क्योंकि दोनों शाखाएँ अलग-अलग हैं: स्थानीय शाखा वृक्ष और दूरस्थ शाखा वृक्ष "सिंक से बाहर" हैं, क्योंकि वे अलग-अलग हैश हैं। Git आपको पहले बताएगा git pull --rebase, फिर फिर से धक्का देगा, लेकिन यह एक सरल फास्ट-फॉरवर्ड पुश नहीं होगा, क्योंकि आपका इतिहास फिर से लिखा गया है। ऐसा मत करो!

यहाँ समस्या यह है कि आप फिर से अपने पहले बदले गए कमिट्स को प्राप्त करेंगे क्योंकि वे मूल रूप से थे, और वे आपकी स्थानीय शाखा के शीर्ष पर विलीन हो जाएंगे। आउट-ऑफ-सिंक स्थिति के कारण, यह पुल साफ रूप से लागू नहीं होता है। आपको एक टूटा हुआ इतिहास मिलेगा जहाँ आपके कमिट दो बार दिखाई देंगे। जब आप इन सभी को अपनी GitHub सुविधा शाखा में धकेलेंगे, तो वे परिवर्तन मूल पुल अनुरोध पर परिलक्षित होंगे, जो बहुत, बहुत बदसूरत हो जाएंगे।

AFAIK, वास्तव में इसका कोई पूरी तरह से साफ समाधान नहीं है। मुझे जो सबसे अच्छा समाधान मिला वह है अपनी स्थानीय शाखा को अपनी GitHub शाखा में धकेलने के लिए (वास्तव में एक गैर-फास्ट-फॉरवर्ड अपडेट को मजबूर करना):

प्रति-धक्का के अनुसार (1):

Update the origin repository’s remote branch with local branch, allowing non-fast-forward updates. This can leave unreferenced commits dangling in the origin repository.

तो खींचो मत, बस इस तरह से जोर लगाओ:

git push svg +user-non-unique

या:

git push svg user-non-unique --force

यह वास्तव में स्पष्ट रूप से आपकी दूरस्थ शाखा को अधिलेखित करेगा, आपकी स्थानीय शाखा में सब कुछ के साथ। जो कम्फ़र्ट रिमोट स्ट्रीम में होते हैं (और फेल होने के कारण) वहीं बने रहेंगे, लेकिन कमिटिंग कमिट्स होंगे, जो अंततः git-gc (1) द्वारा डिलीट हो जाएंगे। कोई बड़ी बात नहीं।

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


5

आप एक नया पुल अनुरोध भी बना सकते हैं जो masterएक विशिष्ट abc1234संशोधन के बजाय बाध्य है ।

इस तरह, आपकी रिपॉजिटरी में कोई नया कमिट / पुश पुल अनुरोध में जोड़ा जाएगा।


3

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

$ git commit -m "These changes are in response to PR comments"
$ git push -f origin HEAD

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