सबसे पहले, यह स्पष्ट करें कि HEAD क्या है और इसके अलग होने का क्या मतलब है।
HEAD वर्तमान में जाँच की गई कमेटी का प्रतीकात्मक नाम है। जब HEAD को अलग नहीं किया जाता है ("सामान्य" 1 स्थिति: आपके पास एक शाखा की जाँच की जाती है), HEAD वास्तव में एक शाखा के "रेफरी" की ओर इशारा करता है और शाखा प्रतिबद्ध की ओर इशारा करती है। इस प्रकार हेड एक शाखा से "संलग्न" है। जब आप एक नई प्रतिबद्धता बनाते हैं, तो HEAD अंक वाली शाखा को नई प्रतिबद्ध की ओर इंगित करने के लिए अद्यतन किया जाता है। हेड स्वचालित रूप से अनुसरण करता है क्योंकि यह शाखा को इंगित करता है।
git symbolic-ref HEAD
पैदावार refs/heads/master
"मास्टर" नाम की शाखा की जाँच की जाती है।
git rev-parse refs/heads/master
उपज 17a02998078923f2d62811326d130de991d1a95a
जो प्रतिबद्ध है वह वर्तमान शाखा या मास्टर शाखा का "सिर" है।
git rev-parse HEAD
पैदावार 17a02998078923f2d62811326d130de991d1a95a
यह भी है कि यह एक "प्रतीकात्मक रेफरी" होने का क्या मतलब है। यह किसी अन्य संदर्भ के माध्यम से किसी वस्तु को इंगित करता है।
(प्रतीकात्मक refs को मूल रूप से प्रतीकात्मक लिंक के रूप में लागू किया गया था, लेकिन बाद में अतिरिक्त व्याख्या के साथ सादे फ़ाइलों में बदल दिया गया ताकि उनका उपयोग उन प्लेटफार्मों पर किया जा सके, जिनमें सहानुभूति नहीं है।)
हम HEAD
→ refs/heads/master
→17a02998078923f2d62811326d130de991d1a95a
जब HEAD को अलग किया जाता है, तो यह सीधे एक कमिट की ओर इशारा करता है - बजाय एक शाखा के माध्यम से अप्रत्यक्ष रूप से इंगित करने के लिए। आप एक अनाम शाखा के रूप में एक अलग HEAD के बारे में सोच सकते हैं।
git symbolic-ref HEAD
के साथ विफल रहता है fatal: ref HEAD is not a symbolic ref
git rev-parse HEAD
पैदावार 17a02998078923f2d62811326d130de991d1a95a
चूंकि यह एक प्रतीकात्मक रेफरी नहीं है, इसलिए इसे सीधे प्रतिबद्ध होना चाहिए।
हमारे पास HEAD
→ है17a02998078923f2d62811326d130de991d1a95a
एक अलग हेड के साथ याद रखने वाली महत्वपूर्ण बात यह है कि यदि यह प्रतिबद्ध है, तो यह अन्यथा इंगित नहीं है (कोई अन्य रेफरी इस तक नहीं पहुंच सकता है), तो जब आप कुछ अन्य कमियों की जांच करेंगे तो यह "झूलना" बन जाएगा। आखिरकार, इस तरह के झूलने वाले कामों को कचरा संग्रह प्रक्रिया के माध्यम से फिर से शुरू किया जाएगा (डिफ़ॉल्ट रूप से, उन्हें कम से कम 2 सप्ताह के लिए रखा जाता है और HEAD के रिफ्लॉग द्वारा संदर्भित किया जा सकता है)।
1
एक अलग सिर के साथ "सामान्य" काम करना पूरी तरह से ठीक है, आपको बस इस बात का ध्यान रखना होगा कि आप क्या कर रहे हैं कि मछली को इतिहास से हटा दिया जाए।
एक इंटरैक्टिव रिबेस का मध्यवर्ती चरण एक अलग हेड (आंशिक रूप से सक्रिय शाखा के अपवित्र को प्रदूषित करने से बचने के लिए) के साथ किया जाता है। यदि आप पूर्ण रीबेस ऑपरेशन समाप्त कर लेते हैं, तो यह आपकी मूल शाखा को रिबास संचालन के संचयी परिणाम और मूल शाखा को फिर से शुरू करने के साथ अद्यतन करेगा। मेरा अनुमान है कि आपने पूरी तरह से रिबेस की प्रक्रिया पूरी नहीं की है; यह आपको उस घृणित HEAD के साथ छोड़ देगा जो उस प्रतिबद्ध की ओर इशारा करता है जिसे हाल ही में रिबेस ऑपरेशन द्वारा संसाधित किया गया था।
अपनी स्थिति से उबरने के लिए, आपको एक शाखा बनानी चाहिए जो वर्तमान में आपके द्वारा अलग किए गए बिंदु की ओर इशारा करती है:
git branch temp
git checkout temp
(इन दोनों आदेशों को संक्षिप्त रूप में देखा जा सकता है git checkout -b temp
)
यह आपके HEAD को नई temp
ब्रांच में पहुंचा देगा ।
अगला, आपको वर्तमान शाखा (और उसके इतिहास) की तुलना उस सामान्य शाखा से करनी चाहिए, जिस पर आपको काम करने की उम्मीद थी:
git log --graph --decorate --pretty=oneline --abbrev-commit master origin/master temp
git diff master temp
git diff origin/master temp
(आप लॉग विकल्पों के साथ प्रयोग करना चाहेंगे: संपूर्ण लॉग संदेश, आदि देखने के लिए -p
छोड़ दें --pretty=…
।
यदि आपकी नई temp
शाखा अच्छी लगती है, तो आप master
इसे इंगित करने के लिए (जैसे) अपडेट करना चाहते हैं :
git branch -f master temp
git checkout master
(इन दोनों आदेशों को संक्षिप्त रूप में देखा जा सकता है git checkout -B master temp
)
फिर आप अस्थायी शाखा को हटा सकते हैं:
git branch -d temp
अंत में, आप शायद पुन: स्थापित इतिहास को आगे बढ़ाना चाहेंगे:
git push origin master
--force
यदि नई शाखा के लिए दूरस्थ शाखा "फास्ट-फॉरवर्ड" नहीं हो सकती है (यानी आप गिरा दिया गया है, या कुछ मौजूदा प्रतिबद्ध को फिर से लिख सकते हैं, या अन्यथा कुछ इतिहास को फिर से लिख सकते हैं) तो आपको इस कमांड के अंत में जोड़ने की आवश्यकता हो सकती है ।
यदि आप एक रिबेस के ऑपरेशन के बीच में थे, तो आपको शायद इसे साफ करना चाहिए। आप यह देख सकते हैं कि निर्देशिका की तलाश में एक रिबास प्रक्रिया में था या नहीं .git/rebase-merge/
। आप मैन्युअल रूप से उस डायरेक्टरी को हटाकर इन-प्रोग्रेस रिबेस को क्लीन कर सकते हैं (जैसे कि अगर आपको अब एक्टिव रिबेस ऑपरेशन का उद्देश्य और संदर्भ याद नहीं है)। आमतौर पर आप उपयोग करते हैं git rebase --abort
, लेकिन यह कुछ अतिरिक्त रीसेट करता है जिसे आप शायद बचना चाहते हैं (यह HEAD को मूल शाखा में वापस ले जाता है और इसे वापस मूल प्रतिबद्ध में रीसेट करता है, जो हमारे द्वारा किए गए कुछ कार्यों को पूर्ववत कर देगा)।