2012-08-06 6 views
5

क्या कोई कृपया एक साधारण उदाहरण प्रदान कर सकता है कि एक केंद्रीय रिपो को गिट पुश का असफल होने का कारण क्या होगा क्योंकि तेजी से आगे नहीं हो सका? केंद्रीय रिपो के राज्य को स्थानीय रेपो के राज्य को ऐसा करने के लिए क्या दिखने की आवश्यकता होगी? वास्तव में इसे देखने में परेशानी हो रही है ...इसका क्या अर्थ है कि एक गिट पुश तेजी से फहराया जा सकता है?

+0

उत्कृष्ट सवाल! बहुत से लोग इसे समझ नहीं पाते हैं, लेकिन इसमें पाए गए अधिकांश प्रश्नों को अच्छी तरह से लिखा नहीं गया है। – erikbwork

उत्तर

11

मैं तुम्हें इस समस्या को देख रहे हैं मान:

! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to '/Users/mayoff/t/test/central' 
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. 

यहाँ कैसे "गैर तेजी से आगे अद्यतन अस्वीकार कर दिया गया" समस्या होता है।

मान लें कि एलिस और बॉब एक ​​परियोजना पर काम कर रहे हैं। उनमें से प्रत्येक के पास एक भंडार होता है, और वहां एक केंद्रीय भंडार होता है जो वे दोनों को धक्का देते हैं और खींचते हैं। प्रारंभ में, तीन खजाने इस तरह दिखेगा:

initial synchronized repos

अब ऐलिस और बॉब दोनों कुछ काम करना।

private repos have new commits

इसके बाद, ऐलिस केंद्रीय रेपो के लिए उसे परिवर्तन धक्का:

central repo updated by Alice

बाद, यदि राहुल को पुश करने की कोशिश करता है प्रत्येक उनके स्थानीय भंडार के लिए एक अलग परिवर्तन करता है। सेंट्रल रेपो की मास्टर शाखा प्रतिबद्धता पर इंगित करती है 3. बॉब का पुश इसे 4 प्रतिबद्ध करने के लिए अपडेट करने का प्रयास करता है। चूंकि प्रतिबद्ध 4 में पूर्वजों के रूप में 3 प्रतिबद्ध नहीं होते हैं, इसलिए विलय की आवश्यकता होती है, लेकिन git push असली विलय नहीं करता है। यह केवल "फास्ट-फॉरवर्ड" करता है, जहां नए मास्टर के पास पूर्वजों के रूप में पुराना मास्टर होता है। तो बॉब को त्रुटि मिलती है क्योंकि वह ऐसी चीज को धक्का देने की कोशिश कर रहा है जिसके लिए एक वास्तविक विलय की आवश्यकता है, न कि तेजी से आगे।

सफलतापूर्वक पुश करने के लिए, वैभव पहली बार लाने के लिए केंद्रीय रेपो से नए प्रतिबद्ध है:

Bob has fetched Alice's commit

और वह अपने परिवर्तन (प्रतिबद्ध # 4) के साथ ऐलिस परिवर्तन मर्ज करने के लिए है (प्रतिबद्ध # 3) , बनाने के लिए एक नया प्रतिबद्ध है कि दोनों पूर्वजों के रूप में करता है:

Bob has merged the commits

लाने और विलय दो आदेश (git fetchद्वारा पीछा किया जा सकता है) या एक कमांड में (git pull)।

अब बॉब सफलतापूर्वक धक्का दे सकता है, क्योंकि केंद्रीय रेपो देखता है कि नए मास्टर के पास पूर्वजों के रूप में पुराना मास्टर है।

Bob pushed the merge

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

+0

मुझे बस एहसास हुआ कि मेरे सभी तीर गलत तरीके से इंगित करते हैं। ओह अच्छा।उम्मीद है कि यह काफी स्पष्ट है। –

+0

ठीक है, अब वे समय में विकास दिखाते हैं, न कि गिट पेड़। यह भी बुरा नहीं है। – erikbwork

+0

स्थिरता कुंजी है। और आगे बढ़ने की दिशा में इशारा करते हुए वास्तव में कुछ लोगों के लिए अधिक आरामदायक हो सकता है। – araqnid

0

बस अपने स्थानीय को खींचने के बिना उसी शाखा पर केंद्रीय रेपो पर प्रतिबद्ध बनाएं। फिर स्थानीय रूप से प्रतिबद्ध करें और धक्का देने का प्रयास करें।

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