full - integrate git bash with visual studio code




फीचर शाखा रिबेस के बाद गिट पुश खारिज कर दिया गया (7)

-f या --force डेवलपर्स का उपयोग करने के बजाय उपयोग करना चाहिए

--force-with-lease

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

ठीक है, मैंने सोचा कि यह एक साधारण गिट परिदृश्य था, मुझे क्या याद आ रही है?

मेरे पास एक master शाखा और एक feature शाखा है। मैं master पर कुछ काम करता हूं, कुछ feature पर और फिर master पर कुछ और करता हूं। मैं इस तरह से कुछ खत्म करता हूं (लेक्सिकोग्राफिक ऑर्डर का मतलब है कि काम करने का आदेश):

A--B--C------F--G  (master)
       \    
        D--E  (feature)

मुझे रिमोट master अद्यतन रखने के लिए git push origin master को git push origin master करने में कोई समस्या नहीं है, न ही मेरे feature वर्क के लिए रिमोट बैकअप बनाए रखने के लिए git push origin feature ( feature पर) के साथ। अब तक, हम अच्छे हैं।

लेकिन अब मैं मास्टर पर F--G करता है, तो मैं git checkout feature और git rebase master करता हूं। फिर भी अच्छा। अब हमारे पास है:

A--B--C------F--G  (master)
                 \
                  D'--E'  (feature)

समस्या: जिस क्षण मैं git push origin feature साथ ब्रांडेड नई छूट वाली feature का बैकअप लेना चाहता हूं, तो पुश को अस्वीकार कर दिया गया है क्योंकि पेड़ के कारण पेड़ बदल गया है। इसे केवल git push --force origin feature साथ हल किया जा सकता है।

मैं निश्चित रूप से बिना --force उपयोग से नफरत करता हूं मुझे इसकी आवश्यकता है। तो, क्या मुझे इसकी ज़रूरत है? क्या रिबेजिंग जरूरी है कि अगला push --force फुल होना चाहिए?

यह सुविधा शाखा किसी भी अन्य देवताओं के साथ साझा नहीं की जाती है, इसलिए मुझे बल धक्का के साथ वास्तव में कोई समस्या नहीं है, मैं कोई भी डेटा खोने वाला नहीं हूं, सवाल अधिक वैचारिक है।


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

रीबेस और एक साझा भंडार आम तौर पर साथ नहीं मिलता है। यह इतिहास लिख रहा है। अगर अन्य उस शाखा का उपयोग कर रहे हैं या उस शाखा से ब्रांच किया है तो रिबेस काफी अप्रिय होगा।

सामान्य रूप से, रीबेस स्थानीय शाखा प्रबंधन के लिए अच्छी तरह से काम करता है। रिमोट शाखा प्रबंधन स्पष्ट विलय (--no-ff) के साथ सबसे अच्छा काम करता है।

हम एक फीचर शाखा में मास्टर को विलय करने से भी बचते हैं। इसके बजाए हम मास्टर के लिए रीबेज करते हैं लेकिन एक नई शाखा के नाम के साथ (उदाहरण के लिए एक संस्करण प्रत्यय जोड़ना)। यह साझा भंडार में पुन: उत्पन्न करने की समस्या से बचाता है।


चूंकि ओपी समस्या को समझता है, बस एक अच्छा समाधान ढूंढता है ...

इस अभ्यास के रूप में कैसे?

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

  • एक दूसरी फीचर-डेवलपमेंट शाखा है, जहां एक फीचर टीम सदस्य नियामक सभी सुविधाओं को वास्तव में मजबूर करता है, वास्तव में मजबूर करता है। तो लगभग हाल ही में मास्टर प्रतिबद्धता के आधार पर लगभग साफ-सफाई। सुविधा पूर्ण होने पर, उस शाखा को मास्टर के शीर्ष पर दबाएं।

इस विधि के लिए पहले से ही एक पैटर्न नाम हो सकता है।


बल धक्का से बचने का मेरा तरीका एक नई शाखा बनाना और उस नई शाखा पर लगातार काम करना है और कुछ स्थिरता के बाद, पुरानी शाखा को हटा दिया गया था:

  • स्थानीय रूप से चेक आउट शाखा को दोबारा शुरू करना
  • पुनर्स्थापित शाखा से एक नई शाखा में शाखा
  • उस शाखा को रिमोट के लिए एक नई शाखा के रूप में धक्का देना। और पुरानी शाखा को रिमोट पर हटा देना

मैं इसके बजाय "चेकआउट-बी" का उपयोग करूंगा और इसे समझना अधिक आसान है।

git checkout myFeature
git rebase master
git push origin --delete myFeature
git push origin myFeature

जब आप हटाते हैं तो आप एक बाहरी शाखा में धक्का देने से रोकते हैं जिसमें विभिन्न SHA आईडी होती है। मैं इस मामले में केवल रिमोट शाखा को हटा रहा हूं।


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

जैसा कि मैं निम्नलिखित अनुक्रम का उपयोग करने का सुझाव दूंगा:

git rebase master
git checkout -b feature_branch_2
git push origin feature_branch_2

हाँ, नई शाखा, इसे बिना किसी बल के हल करना चाहिए, जो मुझे लगता है कि आम तौर पर एक बड़ी गड़बड़ी होती है।


feature शाखा पर git merge master साथ क्या गलत है? यह मुख्य कार्य शाखा से अलग रखते हुए, आपके पास जो काम था, उसे सुरक्षित रखेगा।

A--B--C------F--G
       \         \
        D--E------H

संपादित करें: आह क्षमा करें आपकी समस्या कथन नहीं पढ़ी। जब आप एक rebase प्रदर्शन करते हैं तो आपको बल की आवश्यकता होगी। इतिहास को संशोधित करने वाले सभी आदेशों को --force तर्क की आवश्यकता होगी। यह आपको काम खोने से रोकने के लिए एक असफलता है (पुराना D और E खो जाएगा)।

तो आपने एक git rebase किया जिसने पेड़ को देखा (हालांकि आंशिक रूप से छिपा हुआ D और E नामित शाखा में नहीं है):

A--B--C------F--G
       \         \
        D--E      D'--E'

इसलिए, अपनी नई feature शाखा (इसमें D' और E' साथ धक्का देने की कोशिश करते समय, आप D और E खो देंगे।





git