क्यों पथ द्वारा कठिन / नरम रीसेट नहीं कर सकते?


138

$ git reset -- <file_path> पथ द्वारा रीसेट कर सकते हैं।

हालाँकि, $ git reset (--hard|--soft) <file_path>नीचे की तरह एक त्रुटि रिपोर्ट करेगा:

Cannot do hard|soft reset with paths.

जवाबों:


143

क्योंकि कोई बिंदु नहीं है (अन्य कमांड पहले से ही उस कार्यक्षमता को प्रदान करते हैं), और यह दुर्घटना से गलत काम करने की क्षमता को कम करता है।

एक पथ के लिए एक "हार्ड रीसेट" बस के साथ किया जाता है git checkout HEAD -- <path>(फ़ाइल के मौजूदा संस्करण की जांच करना)।

एक मार्ग के लिए एक नरम रीसेट मतलब नहीं है।

एक पथ के लिए एक मिश्रित रीसेट जो git reset -- <path>करता है।


72
व्यक्तिगत रूप से, मुझे लगता है कि git checkout -- <path>इसके साथ प्रतिस्थापित किया जाना चाहिए git reset --hard <path>। यह बहुत अधिक समझ में आता है ...
vergenzt

24
git checkout -- <path>एक हार्ड रीसेट नहीं करता है; यह मंचित सामग्री के साथ कार्यशील पेड़ सामग्री को बदल देता है। git checkout HEAD -- <path>एक पथ के लिए एक हार्ड रीसेट करता है, दोनों सूचकांक और वर्किंग ट्री को HEAD प्रतिबद्ध से संस्करण के साथ बदल देता है।
बजे डान फाबुलिच

1
@EdPlunkett Er, उत्तर में दूसरा वाक्य आपको बताता है कि अन्य कमांड क्या कार्यक्षमता प्रदान करती है।
अंबर

16
-1: उक्त संशोधन के लिए चेकआउट कार्यशील प्रति से फ़ाइलों को नहीं हटाएगा यदि उक्त संशोधन में हटाई गई फाइलें हैं। reset --hardएक पथ के साथ यह लापता टुकड़ा प्रदान करेगा। गिट पहले से ही इतना शक्तिशाली है कि "हम आपको अपनी सुरक्षा के लिए ऐसा नहीं करने देते हैं" बहाना शून्य पानी रखता है: गलत काम करने के बहुत सारे तरीके हैं "दुर्घटना से"। वैसे भी कोई बात नहीं है जब आपके पास है git reflog
void.pointer

1
जैसा कि @ void.pointer चेकआउट द्वारा बताया गया है कि फाइलें नहीं हटेंगी। यदि आप उस व्यवहार को चाहते हैं तो इस उत्तर को देखें। फिर भी, मुझे आशा है कि किसी दिन हम मिलेंगे git reset --hard -- <path>। इसके लिए वैध उपयोग के मामले हैं।
मारियस पावेल्स्की

18

आप जो उपयोग करने की कोशिश कर रहे हैं उसे आप पूरा कर सकते हैं git checkout HEAD <path>

उस ने कहा, प्रदान किए गए त्रुटि संदेश से मुझे कोई मतलब नहीं है (जैसा git resetकि उपनिर्देशिकाओं पर ठीक काम करता है), और मुझे कोई कारण नहीं दिखाई देता git reset --hardहै कि आप जो पूछ रहे हैं वह ठीक से क्यों नहीं करना चाहिए।


का उपयोग कर चेकआउट परिवर्तन, जो एक ही एक रीसेट --soft के रूप में नहीं है चरण
worc

11

सवाल यह है कि पहले से ही उत्तर कैसे दिया गया है , मैं इसका हिस्सा क्यों समझाऊंगा

तो, git रीसेट क्या करता है? निर्दिष्ट मापदंडों के आधार पर, यह दो अलग-अलग चीजें कर सकता है:

  • यदि आप कोई पथ निर्दिष्ट करते हैं, तो यह एक प्रतिबद्ध (HEAD डिफ़ॉल्ट रूप से) से फ़ाइलों के साथ अनुक्रमणिका में मेल की गई फ़ाइलों को बदलता है। यह क्रिया कार्यशील वृक्ष को बिल्कुल प्रभावित नहीं करती है और आमतौर पर इसका उपयोग गिट ऐड के विपरीत के रूप में किया जाता है।

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

    जब आप एक प्रतिबद्ध निर्दिष्ट नहीं करते हैं, तो यह HEAD को डिफॉल्ट करता है, इसलिए git reset --softकुछ भी नहीं करेगा, क्योंकि यह हेड को हेड (अपने वर्तमान राज्य में) स्थानांतरित करने के लिए एक कमांड है। git reset --hardदूसरी ओर, इसके दुष्प्रभावों के कारण समझ में आता है , यह कहता है कि सिर को हेड में ले जाएं और इंडेक्स और वर्किंग ट्री को हेड को रीसेट करें।

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


यह स्पष्ट है कि रीसेट का उद्देश्य पहली बार में शाखा प्रमुख को स्थानांतरित करना है, लेकिन चूंकि इसमें काम करने वाले पेड़ को रीसेट करने की अतिरिक्त कार्यक्षमता है और पूरे कमिट के लिए सूचकांक और विशिष्ट फ़ाइलों के लिए सूचकांक को रीसेट करने की कार्यक्षमता है, इसलिए ऐसा नहीं करता है। विशिष्ट फ़ाइलों के लिए काम कर रहे पेड़ को रीसेट करने की कार्यक्षमता है? मेरा मानना ​​है कि ओपी पूछ रहा है।
डैनिलो सूजा मोरेश्स

शायद इसलिए कि कार्यक्षमता (विशिष्ट फ़ाइलों के लिए काम करने वाले पेड़ को रीसेट करना) पहले से ही git checkoutकमांड के रूप में उपलब्ध है ? और उसी काम को करने के लिए रीसेट करना उपयोगकर्ताओं को और अधिक भ्रमित करेगा। मेरा जवाब था कि --hardविकल्प विशिष्ट फ़ाइलों पर लागू नहीं है क्योंकि यह शाखा रीसेट के लिए एक मोड है, न कि इंडेक्स रीसेट। और वर्किंग ट्री रीसेट को चेकआउट नाम दिया गया है, जैसा कि आप अन्य उत्तरों में पढ़ सकते हैं। यह सब Git के यूजर इंटरफेस, IMHO का केवल एक बुरा डिज़ाइन है।
उपयोगकर्ता

पहले विकल्प की तुलना git checkout: git reset --केवल इंडेक्स सेट करता है, जबकि git checkout --वर्किंग ट्री सेट करता है?
साधक_आफ_बॅकॉन

4

सुनिश्चित करें कि आपने मूल या अपस्ट्रीम (स्रोत) और वास्तविक शाखा के बीच एक स्लैश रखा है:

git reset --hard origin/branch

या

git reset --hard upstream/branch`

कृपया प्रश्न फिर से पढ़ें।
ज़ेरुस

3

इसके पीछे एक बहुत महत्वपूर्ण कारण है: के सिद्धांतों 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>साथ ही साथ बहुत से फीचर्स भी हैं और इससे भी अधिक सुविधाएँ जो आप पहले नहीं कर सके (इसके विपरीत जो स्वीकार किए गए उत्तर कहते हैं। अब आप अंत में बस काम करने वाले पेड़ को आसानी से बहाल कर सकते हैं, बिना स्पर्श सूचकांक के)।
मारियस पावेल्स्की

0

व्याख्या

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बिल्ली out)


-2

git reset --soft HEAD ~ 1 फ़ाइल नाम को कमिट करें लेकिन परिवर्तन स्थानीय में ही रहे। फ़ाइलनाम हो सकता है - सभी आरंभित फ़ाइलों के लिए


6
घातकCannot do soft reset with paths.
alt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.