2010-01-31 7 views
23

हमारे पास प्रोजेक्ट (PHP एप्लिकेशन) है, लेकिन प्रत्येक क्लाइंट के लिए इंस्टालेशन अलग-अलग होता है, कभी-कभी बहुत कम, कभी-कभी और भी। फिर भी, स्रोत कोड का बड़ा हिस्सा आम है। हम मास्टर शाखा में समांतर शाखाओं के रूप में विशिष्ट प्रतिष्ठानों का प्रबंधन करते हैं और हमें मास्टर से अन्य शाखाओं में परिवर्तन स्थानांतरित करने की आवश्यकता होती है। एक ही स्थिति Git: how maintain (mostly) parallel branches with only a few difference? में हल किया गया था सबसे मतदान समाधान शाखाओं के बीच परिवर्तन इस तरह हस्तांतरण करने के लिए किया गया था:गिट: स्थायी समांतर शाखाओं को बनाए रखने के लिए कैसे करें

git pull 
git checkout local 
git rebase master 

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

git pull 
git checkout local 
git merge master 
+0

या हो सकता है आप इस का मतलब है? http://stackoverflow.com/questions/2850369/why-does-git-use-fast-forward-merging-by-default – cregox

उत्तर

5

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

मास्टर को स्थानीय में विलय करना, बजाय स्थानीय समय में मास्टर के साथ आगे बढ़ना होगा, और इतिहास के रूप में रिकॉर्ड किया जाएगा। यदि आपको अतीत में स्थानीय राज्य का पुनर्निर्माण करने में सक्षम होना चाहिए, तो आप इसे करना चाहेंगे। इतिहास कभी नहीं बदलेगा। लेकिन, आपके पास सौदा करने के लिए एक और जटिल इतिहास होगा।

+0

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

2

अपने अन्य प्रश्न के Greg's answer विशेष प्रतिष्ठानों को स्थानीय शेष के रूप में विभिन्न शाखाओं देखने पर लगता है, अन्य रेपोस को धक्का दे नहीं (जोर जोड़ा):

यदि यह स्थानीय पर स्थानीय है, तो इसे पर सिस्टम की "स्थानीय" शाखा पर प्रतिबद्ध करें, अन्यथा इसे "मास्टर" पर प्रतिबद्ध करें और इसे एक सामान्य भंडार में दबाएं।

आप लगभग हमेशा एक साझा भंडार में शाखाओं को तेजी से आगे बढ़ाना चाहते हैं। git rebase documentation बताता है कि अपस्ट्रीम रीबेस (i.e., git rebase, git push -f) से पुनर्प्राप्त कैसे करें, और इसमें शामिल किसी के लिए कोई मजा नहीं है।

एक और दृष्टिकोण के लिए, Never merging back देखें:

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

लेखक एक ही भंडार के भीतर विभिन्न ग्राहक रिलीज के लिए शाखा नीति पर चर्चा करने के लिए आगे बढ़ता है।

17

विचार यह है कि आप एक आम शाखा का उपयोग करते हैं, और दो (या जितनी आप आवश्यकता) ग्राहक विशिष्ट शाखाओं का उपयोग करते हैं। सभी सामान्य परिवर्तन मास्टर में जाते हैं, और प्रत्येक ग्राहक शाखा में परिवर्तन होते हैं जो ग्राहक को केवल से संबंधित होते हैं। समय-समय पर (जब मास्टर स्थिर बिंदु पर माना जाता है), तो आप मास्टर से ग्राहक शाखा (git checkout custA; git merge master) में परिवर्तन विलय कर देंगे। यह ग्राहक शाखा में नए "सामान्य" कोड में लाता है। आप अन्य तरीके से कभी विलय नहीं करेंगे - जो ग्राहक-विशिष्ट कोड के साथ मास्टर को प्रदूषित करेगा।

जब आप ग्राहक ए को डिलीवरी करते हैं, तो आप "custA" शाखा चेकआउट करते हैं और उसे भेजते हैं। और निश्चित रूप से अन्य ग्राहकों के लिए भी।

अब मान लें कि आप एक नया ग्राहक, "सी" प्राप्त करते हैं, और थोड़ी देर बाद सुविधा जो ग्राहक ए और सी चाहते हैं, लेकिन बी नहीं करता है। मास्टर (git checkout -b AC_feature master), कोड/परीक्षण करें, इसे जाने के दौरान काम करते हुए, और फिर इसे ए और सी (git checkout A; git merge AC_feature and similarly for customer C) में विलय करें (उर्फ "कांटा") बनाएं। आप क्योंकि कि सी

में एक के सभी मिल चाहते हैं, तो कुछ देर बाद, आप उस सुविधा में एक छोटी सी बग मिल एक में यह कोड नहीं है और फिर सी में एक विलय पर भरोसा करते हैं, आप बनाने उसी शाखा में बदलें (git checkout AC_feature; edit/test/commit), और फिर आप इसे ऊपर के रूप में custA और custc में विलय करें।

स्रोत: Gitolite के डेवलपर से ये स्फूर्तिदायक स्पष्ट और उपयोगी लेख - सीताराम Chamarty, जूनियो हमानो से प्रत्यक्ष इनपुट (Git को बनाए रखने में लिनुस टोर्वाल्ड 'साथी) के साथ भाग में लिखा है।

को बनाए रखने के साथ-साथ ग्राहकों की शाखाओं:

http://gitolite.com/archived/special-branches.html

फॉलोअप आम और ग्राहक शाखाओं "ऊपर फिक्सिंग 'पर अनुच्छेद:

http://gitolite.com/archived/special-branch-fixups.html

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