जवाबों:
क्योंकि कोई बिंदु नहीं है (अन्य कमांड पहले से ही उस कार्यक्षमता को प्रदान करते हैं), और यह दुर्घटना से गलत काम करने की क्षमता को कम करता है।
एक पथ के लिए एक "हार्ड रीसेट" बस के साथ किया जाता है git checkout HEAD -- <path>
(फ़ाइल के मौजूदा संस्करण की जांच करना)।
एक मार्ग के लिए एक नरम रीसेट मतलब नहीं है।
एक पथ के लिए एक मिश्रित रीसेट जो git reset -- <path>
करता है।
git checkout -- <path>
एक हार्ड रीसेट नहीं करता है; यह मंचित सामग्री के साथ कार्यशील पेड़ सामग्री को बदल देता है। git checkout HEAD -- <path>
एक पथ के लिए एक हार्ड रीसेट करता है, दोनों सूचकांक और वर्किंग ट्री को HEAD प्रतिबद्ध से संस्करण के साथ बदल देता है।
reset --hard
एक पथ के साथ यह लापता टुकड़ा प्रदान करेगा। गिट पहले से ही इतना शक्तिशाली है कि "हम आपको अपनी सुरक्षा के लिए ऐसा नहीं करने देते हैं" बहाना शून्य पानी रखता है: गलत काम करने के बहुत सारे तरीके हैं "दुर्घटना से"। वैसे भी कोई बात नहीं है जब आपके पास है git reflog
।
git reset --hard -- <path>
। इसके लिए वैध उपयोग के मामले हैं।
आप जो उपयोग करने की कोशिश कर रहे हैं उसे आप पूरा कर सकते हैं git checkout HEAD <path>
।
उस ने कहा, प्रदान किए गए त्रुटि संदेश से मुझे कोई मतलब नहीं है (जैसा git reset
कि उपनिर्देशिकाओं पर ठीक काम करता है), और मुझे कोई कारण नहीं दिखाई देता git reset --hard
है कि आप जो पूछ रहे हैं वह ठीक से क्यों नहीं करना चाहिए।
सवाल यह है कि पहले से ही उत्तर कैसे दिया गया है , मैं इसका हिस्सा क्यों समझाऊंगा
तो, git रीसेट क्या करता है? निर्दिष्ट मापदंडों के आधार पर, यह दो अलग-अलग चीजें कर सकता है:
यदि आप कोई पथ निर्दिष्ट करते हैं, तो यह एक प्रतिबद्ध (HEAD डिफ़ॉल्ट रूप से) से फ़ाइलों के साथ अनुक्रमणिका में मेल की गई फ़ाइलों को बदलता है। यह क्रिया कार्यशील वृक्ष को बिल्कुल प्रभावित नहीं करती है और आमतौर पर इसका उपयोग गिट ऐड के विपरीत के रूप में किया जाता है।
यदि आप कोई पथ निर्दिष्ट नहीं करते हैं, तो यह वर्तमान शाखा प्रमुख को एक निर्दिष्ट कमिट में ले जाता है और, इसके साथ , वैकल्पिक रूप से उस कमेट के इंडेक्स और वर्किंग ट्री को रीसेट करता है। यह अतिरिक्त व्यवहार मोड पैरामीटर द्वारा नियंत्रित किया जाता है:
--soft : इंडेक्स और वर्किंग ट्री को स्पर्श न करें।
--mixed (डिफ़ॉल्ट): इंडेक्स रीसेट करें, लेकिन वर्किंग ट्री नहीं।
-हार्ड : इंडेक्स और वर्किंग ट्री को रीसेट करें।
अन्य विकल्प भी हैं, पूरी सूची के लिए प्रलेखन देखें और कुछ उपयोग के मामले।
जब आप एक प्रतिबद्ध निर्दिष्ट नहीं करते हैं, तो यह HEAD को डिफॉल्ट करता है, इसलिए git reset --soft
कुछ भी नहीं करेगा, क्योंकि यह हेड को हेड (अपने वर्तमान राज्य में) स्थानांतरित करने के लिए एक कमांड है। git reset --hard
दूसरी ओर, इसके दुष्प्रभावों के कारण समझ में आता है , यह कहता है कि सिर को हेड में ले जाएं और इंडेक्स और वर्किंग ट्री को हेड को रीसेट करें।
मुझे लगता है कि यह अब तक स्पष्ट हो जाना चाहिए कि यह ऑपरेशन अपनी प्रकृति से विशिष्ट फ़ाइलों के लिए क्यों नहीं है - यह पहली जगह में एक शाखा प्रमुख को स्थानांतरित करने का इरादा है, काम करने वाले पेड़ को रीसेट करना और सूचकांक द्वितीयक कार्यक्षमता है।
git checkout
कमांड के रूप में उपलब्ध है ? और उसी काम को करने के लिए रीसेट करना उपयोगकर्ताओं को और अधिक भ्रमित करेगा। मेरा जवाब था कि --hard
विकल्प विशिष्ट फ़ाइलों पर लागू नहीं है क्योंकि यह शाखा रीसेट के लिए एक मोड है, न कि इंडेक्स रीसेट। और वर्किंग ट्री रीसेट को चेकआउट नाम दिया गया है, जैसा कि आप अन्य उत्तरों में पढ़ सकते हैं। यह सब Git के यूजर इंटरफेस, IMHO का केवल एक बुरा डिज़ाइन है।
git checkout
: git reset --
केवल इंडेक्स सेट करता है, जबकि git checkout --
वर्किंग ट्री सेट करता है?
सुनिश्चित करें कि आपने मूल या अपस्ट्रीम (स्रोत) और वास्तविक शाखा के बीच एक स्लैश रखा है:
git reset --hard origin/branch
या
git reset --hard upstream/branch`
इसके पीछे एक बहुत महत्वपूर्ण कारण है: के सिद्धांतों checkout
औरreset
।
Git के संदर्भ में, चेकआउट का अर्थ "वर्तमान कार्यशील पेड़ में लाना" है। और git checkout
हम किसी भी क्षेत्र के डेटा के साथ काम कर रहे पेड़ को भर सकते हैं, यह एक कमेटी या स्टेजिंग क्षेत्र से एक रिपॉजिटरी या व्यक्तिगत फाइलों में कमिट से (जो कि डिफ़ॉल्ट भी है)।
बदले में, git रीसेट में यह भूमिका नहीं है। जैसा कि नाम से पता चलता है, यह वर्तमान रेफरी को रीसेट करेगा लेकिन हमेशा "पहुंच" (--soft, --mixed या --hard) के रूप में एक स्रोत के रूप में रिपॉजिटरी के पास होगा ।
संक्षिप्त:
इसलिए जो थोड़ा भ्रमित हो सकता है वह है git reset COMMIT -- files
"ओवर राइटिंग" के बाद से केवल कुछ फाइलों के होने का कोई मतलब नहीं है!
आधिकारिक स्पष्टीकरण के अभाव में, मैं केवल अनुमान लगा सकता हूं कि git डेवलपर्स ने पाया कि reset
अभी भी एक कमांड का सबसे अच्छा नाम था जो स्टेजिंग क्षेत्र में किए गए परिवर्तनों को त्यागने के लिए और, केवल डेटा स्रोत को रिपॉजिटरी दिया गया था, फिर " चलो विस्तार करते हैं कार्यक्षमता "एक नया कमांड बनाने के बजाय।
तो किसी तरह git reset -- <files>
पहले से ही थोड़ा असाधारण है: यह हेड को अधिलेखित नहीं करेगा। IMHO इस तरह के सभी बदलाव अपवाद होंगे। यहां तक कि अगर हम एक --hard
संस्करण की कल्पना कर सकते हैं , तो अन्य (उदाहरण के लिए --soft
) कोई मतलब नहीं होगा।
git reset -- <files>
गिर गया जैसे इसे जोड़ा गया था क्योंकि यह उपयोगी विशेषता है लेकिन किसी को यह सुनिश्चित नहीं था कि इसे किस कमांड में रखा जाना चाहिए। सौभाग्य से अब हमारे पास बहुत अधिक समझदार हैं git restore
, जिनकी कार्यक्षमता बहुत ज्यादा है git checkout -- <path>
git checkout <commit> -- <path>
और git reset [<commit>] -- <path>
साथ ही साथ बहुत से फीचर्स भी हैं और इससे भी अधिक सुविधाएँ जो आप पहले नहीं कर सके (इसके विपरीत जो स्वीकार किए गए उत्तर कहते हैं। अब आप अंत में बस काम करने वाले पेड़ को आसानी से बहाल कर सकते हैं, बिना स्पर्श सूचकांक के)।
git reset
मैनुअल सूचियों मंगलाचरण के 3 तरीके:
2 फ़ाइल-वार हैं: ये काम करने वाले पेड़ को प्रभावित नहीं करते हैं , लेकिन इसके द्वारा निर्दिष्ट सूचकांक में केवल फाइलों पर काम करते हैं <paths>
:
git reset [-q] [<tree-ish>] [--] <paths>..
git reset (--patch | -p) [<tree-ish>] [--] [<paths>...]
1 वचनबद्ध है: संदर्भित में सभी फाइलों पर काम करता है <commit>
, और काम करने वाले पेड़ को प्रभावित कर सकता है :
git reset [<mode>] [<commit>]
आह्वान का कोई मोड नहीं है जो केवल निर्दिष्ट फ़ाइलों पर संचालित होता है और काम कर पेड़ को प्रभावित करता है।
यदि आप दोनों को चाहते हैं:
आप इस उपनाम का उपयोग अपनी git config फाइल में कर सकते हैं:
[alias]
reco = !"cd \"${GIT_PREFIX:-.}\" && git reset \"$@\" && git checkout \"$@\" && git status --short #" # Avoid: "fatal: Cannot do hard reset with paths."
फिर आप इनमें से एक कर सकते हैं:
$ git reco <paths>
$ git reco <branch/commit> <paths>
$ git reco -- <paths>
(मेनेनिक के लिए reco
: re
सेट && c
बिल्ली o
ut)
git checkout -- <path>
इसके साथ प्रतिस्थापित किया जाना चाहिएgit reset --hard <path>
। यह बहुत अधिक समझ में आता है ...