2012-03-06 16 views
7

पृष्ठभूमि: हम अपने प्रोजेक्ट के लिए जिथब का उपयोग करते हैं और मैं अपने मुख्य भंडार के अपने स्वयं के कांटे पर काम करता हूं। हम बड़ी विलय प्रतिबद्धताओं से बचने के लिए विलय के बजाय छूट का उपयोग करते हैं।लंबे समय तक (रिमोट) फीचर शाखाओं पर गिट रिबेस

परिदृश्य:

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

समस्या: चरण 4 वह समस्या है जहां मुझे समस्याएं मिलती हैं। मुझे लगभग हमेशा गैर-फास्ट-फॉरवर्ड किए गए कामों से निपटना होगा और गिट पुश - फोर्स का उपयोग करना होगा।

मैं

Git: how to maintain permanent parallel branches

How to maintain (mostly) parallel branches with only a few difference

देखा है और मेरे कार्यप्रवाह काम करने के लिए एक तरह से नहीं मिली है। गिट वर्कफ़्लोज़ पर Google खोज करना ज्यादातर परिणाम देता है जो मानते हैं कि आप सभी स्थानीय शाखाओं पर काम करते हैं और github (उदा। http://nvie.com/posts/a-successful-git-branching-model/) पर रिमोट कॉपी नहीं रखते हैं।

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

उत्तर

8

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

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

जैसा कि एम्बर का उल्लेख है, रीबेस एक ही शाखा में अन्य लोगों के साथ काम करना बहुत मुश्किल बनाता है - git push --force आईएनजी से पहले, आपको रिमोट शाखा की स्थिति को देखना होगा कि किसी और ने इसे पहले धक्का दिया है, और pull --rebase उसमें, git push --force में। यहां तक ​​कि इसकी दौड़ की स्थिति भी है - अगर कोई और push --force से पहले धक्का देता है, तो उनके परिवर्तन आपके द्वारा ओवरराइट हो जाएंगे।

+1

आप '--force-with-lease' का उपयोग करके दौड़ की स्थिति से बच सकते हैं जो अपस्ट्रीम आपके स्थानीय से नए होने पर विफल हो जाएगा। – mLuby

6

यदि आप rebase आईएनजी हैं, तो आपको पर हमेशा धक्का देना होगा, क्योंकि rebase इतिहास को फिर से लिखता है। यह बस यह कैसे काम करता है। पुनर्लेखित इतिहास परिभाषा के अनुसार उसी इतिहास के शीर्ष पर तेजी से आगे नहीं बढ़ रहा है।

विकल्प rebase आईएनजी के बजाय विकल्प है। आप अपने सटीक वही वर्कफ़्लो का उपयोग कर सकते हैं, रिबेस के बजाए विलय को छोड़कर, और आपको पुश को मजबूर नहीं करना पड़ेगा।

यदि कोई और आपके रिमोट शाखा का उपयोग आपके अलावा नहीं कर रहा है, तो --force का उपयोग स्वाभाविक रूप से खराब नहीं है। यदि अन्य लोग रिमोट शाखा का उपयोग कर हैं, तो आपको शायद merge का उपयोग करना चाहिए।

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