2012-04-13 20 views
67

को जोड़ना करता रहा कांटा & संपादित इस फ़ाइल फ़ाइल बटन का उपयोग करके GitHub पर rails रेपो के लिए एक पुल अनुरोध खोला।GitHub: मौजूदा पुल अनुरोध

अब, मेरे पीआर पर प्रतिक्रिया प्राप्त करने के बाद, मैं कुछ और काम करना चाहता था। तो यहां मैं

$ git clone [email protected]: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 

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

मेरा प्रश्न है: क्या मैं यह सही तरीका कर रहा हूं? यदि नहीं, तो ऐसा करने का सही तरीका क्या है?

+3

यहां आने वाले कुछ लोग यह देख सकते हैं कि यह उनके परिदृश्य को बेहतर तरीके से फिट करता है: http://stackoverflow.com/questions/9790448/how-to-update-a-pull-request – AaronLS

+3

मुझे प्रश्न/उत्तर स्पष्ट का यह संस्करण भी मिला: http://stackoverflow.com/questions/7947322/preferred-github-workflow-for-updating-a-pull-request-after-code-review?rq=1 –

उत्तर

45

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

+0

भयानक, धन्यवाद। – Magne

4

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

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

7

मैं अभी हाल ही में इस विषय पर blogged में दिखाई देगा:

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

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

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

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

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

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

AFAIK, वास्तव में इसका कोई बिल्कुल साफ समाधान नहीं है।

प्रति Git-धक्का के रूप में (1):: सबसे अच्छा समाधान मैंने पाया अपने GitHub शाखा करने के लिए अपने स्थानीय शाखा धक्का (वास्तव में एक गैर तेजी से orward अद्यतन के लिए मजबूर) के लिए मजबूर करने के लिए है

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 

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

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

संबंधित मुद्दे