जीआईटी में दूरस्थ शाखाओं को रिबास करना


135

मैं एक दूरस्थ एसवीएन रिपॉजिटरी को मिरर करने के लिए एक मध्यवर्ती गिट रिपॉजिटरी का उपयोग कर रहा हूं, जिससे लोग क्लोन कर सकते हैं और काम कर सकते हैं। मध्यवर्ती रिपॉजिटरी में मास्टर शाखा है जो अपस्ट्रीम एसवीएन से रात भर में छूट देती है, और हम फीचर शाखाओं पर काम कर रहे हैं। उदाहरण के लिए:

remote:
  master

local:
  master
  feature

मैं अपनी सुविधा शाखा को सफलतापूर्वक रिमोट में धकेल सकता हूं, और जो मैं उम्मीद करता हूं, उसे समाप्त कर सकता हूं:

remote:
  master
  feature

local:
  master
  feature

मैंने रिमोट को ट्रैक करने के लिए शाखा को फिर से सेटअप किया:

remote:
  master
  feature

local:
  master
  feature -> origin/feature

और सब ठीक है। मैं यहां से जो करना चाहूंगा, वह सुविधा शाखा को रिमोट पर मास्टर शाखा को फिर से बनाना है, लेकिन मैं अपनी स्थानीय मशीन से ऐसा करना चाहूंगा। मैं ऐसा करने में सक्षम होना चाहता हूं:

git checkout master
git pull
git checkout feature
git rebase master
git push origin feature

दूरस्थ मास्टर के साथ दूरस्थ सुविधा शाखा को अद्यतित रखना। हालाँकि, इस विधि के कारण शिकायत होती है:

To <remote>
 ! [rejected]        feature -> feature (non-fast-forward)
error: failed to push some refs to '<remote>'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

git pullचाल है, लेकिन एक मर्ज का कारण बनता है कि मैं से बचने के लिए चाहते हैं। मुझे चिंता है कि संदेश feature -> featureइसके बजाय बताता है feature -> origin/featureलेकिन यह सिर्फ एक प्रस्तुति की चीज हो सकती है।

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


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

जवाबों:


185

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

अगर यह सिर्फ आप है, तो आप रिबेस के बाद पुश को मजबूर कर सकते हैं

git push origin feature -f

हालांकि, अगर अन्य लोग इस पर काम कर रहे हैं, तो आपको विलय करना चाहिए और मास्टर से छूट नहीं देनी चाहिए।

git merge master
git push origin feature

यह सुनिश्चित करेगा कि आप जिन लोगों के साथ सहयोग कर रहे हैं, उनके साथ आपका एक सामान्य इतिहास है।

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

इस विषय पर मेरा लेख है, जिसे प्रति सुविधा शाखा कहा जाता है ।

उम्मीद है की यह मदद करेगा।


29
+1 के लिए if others are working on it, you should merge and not rebase off of master, रिबास बेहतर केवल निजी शाखा पर उपयोग किया जाता है।
हेंड उज़िया

6
अल्टरनेटिव टू पुश पुश ओरिजिनल फीचर -f आप अपने रिमोट फीचर और पुश फीचर को फिर से डिलीट कर सकते हैं
मार्कस

2
अपनी शाखा में मास्टर विलय करने से एक मर्ज कमेटी बनेगी और आपके बदलावों को आगे बढ़ाने के बाद मास्टर की किसी अन्य खुली सुविधा शाखा के साथ टकराव होगा।
स्टीवन

के लिए +1 git push origin feature -f। कुछ संदर्भों में दूरस्थ शाखाओं के साथ भी एक रिबास प्रदर्शन करना आवश्यक हो सकता है। क्रूक्स जान रहा है कि आप क्या कर रहे हैं। और हमें इस बात का ध्यान रखना चाहिए कि आप रिमोट रेपो में कमियां मिटा सकते हैं।
enagra

33

अच्छा लगा कि आप इस विषय को सामने लाए।

यह git में एक महत्वपूर्ण बात / अवधारणा है जिसे git उपयोगकर्ताओं के एक समूह को जानने से लाभ होगा। git rebase एक बहुत ही शक्तिशाली टूल है और आपको एक साथ स्क्वैश करने, कमिट्स हटाने आदि में सक्षम बनाता है, लेकिन किसी भी शक्तिशाली टूल के साथ, आपको मूल रूप से यह जानना होगा कि आप क्या कर रहे हैं या कुछ गलत हो सकता है।

जब आप स्थानीय स्तर पर काम कर रहे हों और अपनी स्थानीय शाखाओं के साथ खिलवाड़ कर रहे हों, तब तक आप जो चाहें कर सकते हैं, जब तक कि आपने केंद्रीय भंडार में बदलाव को आगे नहीं बढ़ाया है। इसका मतलब है कि आप अपने इतिहास को फिर से लिख सकते हैं, लेकिन दूसरों के इतिहास को नहीं। केवल अपने स्थानीय सामान के साथ खिलवाड़ करने से, अन्य रिपॉजिटरी पर कुछ भी प्रभाव नहीं पड़ेगा।

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


खराब भाषा के लिए डाउनवोट: meta.stackexchange.com/questions/22232/…
पॉवर्स

1
मेरी भाषा अपडेट की गई।
राल्फथिन्जा

5

क्योंकि आपने featureनए के शीर्ष पर बगावत कर दी है master, आपका स्थानीय अब featureऔर तेजी से आगे origin/featureनहीं है। इसलिए, मुझे लगता है, इस मामले में पूरी तरह से ठीक है कि तेजी से आगे की जाँच को ओवरराइड करके git push origin +feature। आप इसे अपने कॉन्फ़िगरेशन में भी निर्दिष्ट कर सकते हैं

git config remote.origin.push +refs/heads/feature:refs/heads/feature

यदि अन्य लोग शीर्ष पर काम करते हैं origin/feature, तो वे इस मजबूर अपडेट से परेशान होंगे। आप रिबासिंग के बजाय नए masterमें विलय करके इससे बच सकते हैं feature। परिणाम वास्तव में एक तेजी से आगे होगा।


1

--forceविकल्प का उपयोग करके आप चेक को अक्षम कर सकते हैं (यदि आप वास्तव में आप जानते हैं कि आप क्या कर रहे हैं) git push


15
समस्या यह है, मुझे यकीन नहीं है कि मैं वास्तव में जानता हूं कि मैं क्या कर रहा हूं :)
kfb

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