2009-04-30 11 views
5

पर गिट प्रतिबद्धता में संशोधन करना मेरे पास एक स्थानीय गिट रेपो है जिसे मैंने हाल ही में एक प्रतिबद्धता दी है, फिर साझा किए गए रेपो को धक्का दिया है। साझा किए गए रेपो को धक्का देने के बाद ही मुझे एहसास हुआ कि मैंने बदसूरत गलती की है। मैं इसे स्थानीय स्तर पर कोई समस्या नहीं संशोधन के बाद मैं के साथ मेरी स्रोत तय:किसी साझा रेपो

git commit -C HEAD -a --amend 

उसके बाद, मैं एक Git धक्का मूल की कोशिश की और मैं निम्नलिखित त्रुटि मिलती है:

! [rejected]  mybranch -> mybranch (non-fast forward) 

सबसे अच्छा तरीका यह सुधारने के लिए क्या है परिस्थिति?

उत्तर

7

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

आप -f विकल्प git push पर या किसी अग्रणी '+' के साथ रीफस्पेक का उपयोग करके किसी भी तरह से धक्का देने का प्रयास कर सकते हैं, उदा। git push origin +mybranch:mybranch

आमतौर पर रिमोट रिपॉजिटरीज ऐसा नहीं होने देंगे क्योंकि आप अलग-अलग लोग शाखाओं की युक्तियों को अंधाधुंध कर सकते हैं, जिनमें वे स्थानीय रूप से नहीं हैं, जो शामिल नहीं करते हैं।

रिमोट रिपोजिटरी पर कॉन्फ़िगरेशन पैरामीटर receive.denyNonFastForwards को बदलकर आप इस व्यवहार को ओवरराइड कर सकते हैं (यह मानते हुए कि आपके पास रिमोट रिपोजिटरी में ऐप्रोप्राइट पहुंच है)।

यदि आपके पास ऐसी पहुंच नहीं है तो रिमोट शाखा को हटाकर और इसे पुनर्निर्मित करके इसे प्राप्त करने में सक्षम हो।

उदा।

git push origin :mybranch 
git push origin mybranch 

ध्यान दें कि Git का नवीनतम संस्करण एक विन्यास पैरामीटर receive.denyDeletes है कि, अगर निर्धारित करते हैं, काम करने से इस संभावित खतरनाक वैकल्पिक हल नहीं कर पाएगा शामिल हैं।

+0

अच्छा, मुझे इनकार करने के बारे में पता नहीं था फाइनफॉरवर्ड: मुझे लगता है कि आपको इसे लागू करने के लिए एक हुक की आवश्यकता है। – araqnid

5

यदि आप पुश को मजबूर करना चाहते हैं, तो आप ... ehm ... --force से push पास कर सकते हैं।

हालांकि, इसे आम तौर पर सार्वजनिक भंडार पर इतिहास को फिर से लिखने के लिए खराब रूप माना जाता है।

0

अपने साझा रेपो मान लिया जाये की अनुमति देता है, बस एक धन चिह्न के साथ शाखा का नाम उपसर्ग गैर तेजी से आगे धक्का मजबूर करने के लिए: इस मामले में

git push origin +mybranch 
2

यह शायद सबसे अच्छा बस बनाने के लिए एक दूसरे के साथ के लिए प्रतिबद्ध ठीक कर। चूंकि आप पहले से ही अपने स्थानीय भंडार में मूल पहली प्रतिबद्धता को बदल चुके हैं, इसलिए आप इसे साझा भंडार से खींचना चाहते हैं और HEAD को स्थानांतरित करना चाहते हैं ताकि आपकी बदली गई प्रतिबद्धता कचरा-एकत्र हो सके।