एक शाखा से सभी कमिटों को खींचो, निर्दिष्ट किए गए दूसरे पर धक्का दें


102

मेरी निम्नलिखित शाखाएँ हैं:

  • master
  • production

और निम्नलिखित दूरस्थ शाखाएँ:

  • origin/master
  • origin/production

मेरे पास एक स्क्रिप्ट है जो origin/masterशाखा को लाती है और मेरे अंतिम भ्रूण ( log -p master..origin/master) से जो कुछ भी बदला है, उसका लाभ मिलता है । फिर मैं विलीन हो जाता हूं origin/master

पाए गए कमिट को एक कोड समीक्षा टूल में धकेल दिया जाता है।

मैं सफल कमिट्स को पुश करना चाहता हूं - और केवल उन्हें - उत्पादन शाखा को, और फिर निश्चित रूप से origin/production

ऐसा मैं किस प्रकार करूं?

इसके अलावा, मेरे पास 2 स्क्रिप्ट्स चल रही हैं: एक जो कि से आती है origin/master, पुश एक डेटाबेस में विवरण भेजता है, और मर्ज करता है, और दूसरा जो मैं वर्तमान में लिख रहा हूं कि सफल कमिट्स को धक्का देना होगा।

मैं दौड़ की परिस्थितियों / मर्ज संघर्ष से बचते हुए उन 2 लिपियों को चलाना चाहता हूं। चूंकि मैं केवल निर्दिष्ट कमिट्स के साथ काम करना चाहता हूं, हो सकता है कि कमिट्स से छुटकारा पाने का एक तरीका है जो मुझे नहीं चाहिए?


Comm सफल कमिट ’से आपका क्या अभिप्राय है?
bdonlan

जिसकी समीक्षा की गई है और उसे सफल के रूप में चिह्नित किया गया है। यह वास्तव में यहाँ मायने नहीं रखता है, महत्वपूर्ण यह है कि वहाँ हैं जो मैं रखना चाहता हूं और दूसरी शाखा में धकेलना चाहता हूं, और अन्य जिन्हें मैं / उपेक्षा से छुटकारा चाहता हूं।
सिल्वेन

जवाबों:


312

मुझे लगता है कि आप जिस शब्द की तलाश कर रहे हैं वह 'चेरी पिक' है। यही है, एक शाखा के मध्य से एक एकल प्रतिबद्ध लें और इसे दूसरे में जोड़ें:

A-----B------C
 \
  \
   D

हो जाता है

A-----B------C
 \
  \
   D-----C'

यह, ज़ाहिर है, गिट चेरी-पिक कमांड के साथ किया जा सकता है।

इस कमिट के साथ समस्या यह है कि git उनके सामने सभी इतिहासों को शामिल करने के लिए कमिट करता है - इस प्रकार, यदि आपके पास तीन कमेंट्स हैं जैसे:

A-----B-----C

और बी से छुटकारा पाने की कोशिश करें, आपको एक पूरी तरह से नई प्रतिबद्धता बनानी होगी:

A-----------C'

जहां C 'की एक अलग SHA-1 आईडी है। इसी तरह, चेरी को एक शाखा से दूसरी शाखा में ले जाने के लिए मूल रूप से एक पैच उत्पन्न करना शामिल है, फिर इसे लागू करना, इस प्रकार उस तरह से इतिहास को खोना।

कमिट आईडी के इस बदलाव से अन्य चीजों के बीच जीआईटी की विलय की कार्यक्षमता टूट जाती है (हालांकि यदि संयम से इस्तेमाल किया जाता है, तो ऐसे आंकड़े हैं जो इस पर पेपर करेंगे)। हालांकि इससे भी महत्वपूर्ण बात यह है कि यह कार्यात्मक निर्भरता को नजरअंदाज करता है - यदि C वास्तव में B में परिभाषित फ़ंक्शन का उपयोग करता है, तो आप कभी नहीं जान पाएंगे।

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

यदि आप पैच के स्तर पर चीजों से निपटने पर जोर देते हैं, तो आप डार्क्स को देखना चाह सकते हैं - यह एक रिपॉजिटरी को पैच का एक सेट मानता है, और इस तरह चेरी पिकिंग मौलिक ऑपरेशन बन जाता है। हालाँकि यह समस्याओं का अपना सेट है, जैसे कि बहुत धीमा होना :)

संपादित करें: इसके अलावा, मुझे यकीन नहीं है कि मैं आपके दूसरे प्रश्न को, दो लिपियों के बारे में समझूंगा। हो सकता है कि आप इसे और अधिक विस्तार से वर्णन कर सकें, संभवतः चीजों को भ्रामक होने से बचाने के लिए एक अलग प्रश्न के रूप में?


अपने दूसरे प्रश्न के बारे में, मैं केवल यह सुनिश्चित करना चाहता हूं कि विभिन्न शाखाओं के साथ काम करते समय, परिवर्तन (1 स्क्रिप्ट) को लाने और किसी अन्य स्थान (दूसरी स्क्रिप्ट) पर दिए गए कमिटिंग की प्रक्रिया दौड़ की स्थिति / विलय के संघर्ष के बिना काम कर सकती है। लेकिन अंत में मुझे लगता है कि इससे कोई फर्क नहीं पड़ता क्योंकि मैं 2 लिपियों को एक में विलय कर सकता था, इसलिए 2 लिपियाँ एक साथ काम नहीं करतीं :)
सिल्वेन

9
"कमिट आईडी के इस परिवर्तन से अन्य चीजों के बीच गिट की विलय की कार्यक्षमता टूट जाती है" @bdonlan कृपया बताएं कि विलय की कार्यक्षमता कैसे ब्रेक की जाती है। इसका क्या मतलब है?
नारेक

5
@Narek उनका शायद मतलब है कि कमिट सी में बदलाव 'कमिट सी' में उसी बदलाव के साथ होगा जब आप दूसरी ब्रांच को मर्ज करेंगे। यही कारण है कि प्रतिबद्ध इतिहास के पीछे इतिहास खोने का नतीजा है
बाइटफू

1
"और बी से छुटकारा पाने की कोशिश करें" - आप बी से छुटकारा पाने की कोशिश क्यों कर रहे हैं?
d512

3
@ user1334007, उनका मतलब है कि पहले यह एबीसी हुआ करता था। अब, C की आपकी चेरी पिक के कारण, आपकी शाखा AD-C है, जिसमें अब 'B' नहीं है।
ऐनीएजाइल

1

मुझे लगता है कि यह एक पुराना सवाल है, लेकिन यहाँ संदर्भित है: कैसे एक विशिष्ट प्रतिबद्ध को Git में मर्ज किया जाए

इसलिए, एक नया उत्तर: सुविधा शाखाओं और अनुरोधों का उपयोग करें।

यह कैसा दिखता है, जहाँ fA फीचर A के साथ कमिट है, और fB फीचर बी के साथ कमिट है:

            fA   fC (bad commit, don't merge)
           /  \ /
master ----A----B----C
                \  /
                 fB

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

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