कोड समीक्षा के बाद पुल अनुरोध को अद्यतन करने के लिए पसंदीदा Github वर्कफ़्लो


341

मैंने गितूब पर एक ओपन सोर्स प्रोजेक्ट में बदलाव प्रस्तुत किया है, और कोर टीम के सदस्यों में से एक से कोड समीक्षा टिप्पणियां प्राप्त की हैं।

मैं समीक्षा टिप्पणियों को ध्यान में रखते हुए कोड को अपडेट करना चाहता हूं और इसे फिर से सबमिट करना चाहता हूं। ऐसा करने के लिए सबसे अच्छा वर्कफ़्लो क्या है? Git / github के मेरे सीमित ज्ञान से, मैं निम्नलिखित में से कोई भी कर सकता था:

  1. एक नई कमिट के रूप में कोड को अपडेट करें, और मेरे पुल अनुरोध के लिए प्रारंभिक और अद्यतन दोनों को जोड़ें।

  2. किसी तरह (??) मेरी रिपॉजिटरी से पुरानी कमिटमेंट को रोलबैक करें, और एक नई कमेटी बनाएं जिसमें सब कुछ हो, तो उसके लिए एक पुल अनुरोध करें?

  3. git commitआपके पास एक संशोधन सुविधा है, लेकिन मैंने सुना है कि आपके स्थानीय भंडार के बाहर प्रतिबद्ध को धकेलने के बाद आपको इसका उपयोग नहीं करना चाहिए? इस मामले में मैंने अपने स्थानीय पीसी पर बदलाव किया है और इस परियोजना की मेरी गीथब शाखा में धकेल दिया है। क्या 'संशोधन' का उपयोग करना ठीक होगा?

  4. कुछ और?

ऐसा लगता है कि विकल्प 2/3 अच्छा होगा, क्योंकि ओपन सोर्स प्रोजेक्ट उनके इतिहास में केवल एक ही प्रतिबद्ध होगा जो सब कुछ लागू करेगा, लेकिन मुझे यकीन नहीं है कि यह कैसे करना है।

नोट: मुझे नहीं पता कि यह उत्तर को प्रभावित करता है या नहीं, लेकिन मैंने एक अलग शाखा में बदलाव नहीं किया है, मैंने अभी-अभी मास्टर के ऊपर एक कमिट किया है

जवाबों:


219

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

# 2 और # 3 अनावश्यक हैं। यदि लोग केवल वही देखना चाहते हैं जहाँ आपकी शाखा को विलय किया गया था (और अतिरिक्त आवागमन नहीं), तो वे git log --first-parentकेवल लॉग में मर्ज कमिट देखने के लिए उपयोग कर सकते हैं ।


7
masterएक शाखा भी है, इसलिए तकनीकी रूप से यह कोई फर्क नहीं पड़ता है :)
प्रहार

10
@ ओरियनएडवर्ड्स - जैसा कि प्रहार का उल्लेख है, मास्टर एक शाखा है, इस प्रकार, इसे अपडेट करने से इसके आधार पर किसी भी पुल अनुरोध को अपडेट किया जाएगा। (किसी भी चीज़ के लिए एक अलग शाखा का उपयोग करने का यह एक अच्छा कारण है जिसके लिए आप एक पुल अनुरोध प्रस्तुत करने की योजना बना रहे हैं।)
एम्बर

18
चूंकि कोड अभी भी समीक्षा में है, इसलिए आमतौर पर अतिरिक्त
फ़िक्सअप को

4
@ मंगल, यह प्राथमिकता का विषय है।
एम्बर

4
मेरे द्वारा लिखे गए ब्लॉग पोस्ट में बताए गए कारणों के लिए मुझे यह उत्तर पसंद नहीं है ; मेरा मानना ​​है कि अन्य उत्तर ज्यादा बेहतर है।
एडम स्पियर्स

225

पुल अनुरोध को अद्यतन करने के लिए

पुल अनुरोध (बिंदु # 1) को अपडेट करने के लिए, केवल एक चीज जो आपको करने की आवश्यकता है, उसी शाखा को चेकआउट करना है जो पुल अनुरोध से है और इसे फिर से धक्का दें:

cd /my/fork
git checkout master
...
git commit -va -m "Correcting for PR comments"
git push

वैकल्पिक - इतिहास की सफाई

आपको अपने कमिट्स को एक साथ स्क्वैश करने के लिए कहा जा सकता है ताकि रिपॉजिटरी का इतिहास साफ हो, या अपने आप से बिचौलिया कमेंट्स को हटाना चाहते हैं जो आपके पुल अनुरोध (बिंदु # 2) में "संदेश" से विचलित करते हैं। उदाहरण के लिए यदि आपका प्रतिबद्ध इतिहास इस तरह दिखता है:

$ git remote add parent git@github.com:other-user/project.git
$ git fetch parent
$ git log --oneline parent/master..master
e4e32b8 add test case as per PR comments
eccaa56 code standard fixes as per PR comments
fb30112 correct typos and fatal error
58ae094 fixing problem

यह चीजों को एक साथ निचोड़ने के लिए एक अच्छा विचार है ताकि वे एक ही प्रतिबद्ध के रूप में दिखाई दें:

$ git rebase -i parent/master 

यह आपको अपने पुल अनुरोध के इतिहास को फिर से लिखने का विकल्प चुनने के लिए प्रेरित करेगा, निम्नलिखित आपके संपादक में होगा:

pick 58ae094 fixing actual problem
pick fb30112 correct typos
pick eccaa56 code standard fixes
pick e4e32b8 add test case as per PR comments

किसी भी कमिटमेंट के लिए आप पिछली कमिटमेंट का हिस्सा बनना चाहते हैं - स्क्वैश में बदलाव करें:

pick 58ae094 fixing actual problem
squash fb30112 correct typos
squash eccaa56 code standard fixes
squash e4e32b8 add test case as per PR comments

और अपने संपादक को बंद करें। Git तब इतिहास को फिर से लिखेगा और आपको एक संयुक्त प्रतिबद्ध के लिए एक प्रतिबद्ध संदेश प्रदान करने के लिए संकेत देगा। तदनुसार संशोधन करें और आपका प्रतिबद्ध इतिहास अब संक्षिप्त होगा:

$ git log --oneline parent/master..master
9de3202 fixing actual problem

पुश करने के लिए अपने कांटा:

$ git push -f
Counting objects: 19, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (11/11), 978 bytes, done.
Total 11 (delta 9), reused 7 (delta 6)
To git@github.com:me/my-fork.git
   f1238d0..9de3202  HEAD -> master

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

पब्लिक रिपोज पर इतिहास बदलना बुरी बात है

इतिहास को फिर से लिखना और git push -fउस शाखा का उपयोग करना, जो, संभवतः, किसी और ने पहले ही क्लोन कर लिया है, एक बुरी बात है - यह रिपॉजिटरी के इतिहास का कारण बनता है और चेकआउट करने के लिए।

हालाँकि, अपने कांटे के इतिहास को संशोधित करने के लिए आप जिस रिपॉजिटरी में एकीकृत होने का प्रस्ताव कर रहे हैं, उसे ठीक करना - एक अच्छी बात है। जैसे कि आपके पुल अनुरोधों में से "शोर" को दूर करने के लिए कोई आरक्षण नहीं है।

शाखाओं पर एक नोट

ऊपर में मैं masterआपके फोर्क की शाखा से आने के रूप में पुल अनुरोध दिखाता हूं , इसमें जरूरी कुछ भी गलत नहीं है, लेकिन यह कुछ सीमाएं बनाता है जैसे कि, यदि यह आपकी मानक तकनीक है, तो केवल एक पीआर प्रति भंडार खोलने में सक्षम है । हालांकि यह एक बेहतर विचार है कि आप जिस प्रत्येक व्यक्ति को प्रस्ताव देना चाहते हैं उसके लिए एक शाखा बनाएं:

$ git branch feature/new-widgets
$ git checkout feature/new-widgets
...
Hack hack hack
...
$ git push
# Now create PR from feature/new-widgets

28
अतिरिक्त फिक्सअप कमिट्स को आगे बढ़ाने के बजाय कमिट्स को साफ करने का उल्लेख करने के लिए +1।
मंगल

3
मैं कुछ समस्याओं को उठा रहा / उठा रहा था और इस जवाब से मुझे मदद मिली। यह भी देखा कि मेरे द्वारा किए जाने के बाद जीथब ने पिछली बातचीत को हटा दिया git push -f। बहुत सारी टिप्पणियां नहीं थीं, लेकिन यह ऐसी चीज है जिसकी मुझे उम्मीद नहीं थी।
हितेश

5
बस स्पष्ट होने के लिए, जब एक स्वच्छ इतिहास होने के लिए रिबासिंग कर रहे हैं, तो आप वास्तव में अपने सार्वजनिक कमिट को बदल रहे हैं, आप बस यह मान रहे हैं कि कोई भी परवाह नहीं करता है क्योंकि यह एक कांटा है।
brita_

2
अनुवर्ती: जब आपके पीआर के दौरान मास्टर बदलता है तो सबसे अच्छा अभ्यास?
केविन सटल सूक्ष्म

1
इस बात पर विचार करें कि समीक्षा (या कोड के बारे में सामान्य रूप से टिप्पणी करने वाले) पर पुल अनुरोधों पर पुनर्लेखन का इतिहास भ्रम पैदा कर सकता है, क्योंकि इतिहास अब उन टिप्पणियों से मेल नहीं खाएगा, जिनका उल्लेख करना था। कोई आसान समाधान नहीं है: कोई व्यक्ति पीआर को बंद कर देगा और इसे एक नए रूप में संदर्भित करेगा (इतिहास को फिर से लिखने के लिए नहीं); मेरा विचार केवल नवीनतम प्रतिबद्ध SHA को बैकअप करना होगा जो कि रीसेट / फिर से लिखा जा रहा है और इसे पीआर पर एक टिप्पणी में संदर्भित किया जाता है, मजबूर-पुश के बाद प्रदर्शन किया गया है। यदि prune वह अलग-थलग नहीं करता है तो उसका इतिहास अभी भी पीआर की टिप्पणियों से मेल खाएगा।
कामाफेदर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.