एकल फ़ाइल का हार्ड रीसेट


1003

वर्तमान में मेरी कार्यशील निर्देशिका में तीन संशोधित फाइलें हैं। हालाँकि मैं चाहता हूं कि उनमें से एक को HEAD स्थिति में रीसेट किया जाए।

SVN में, मैं उपयोग करूँगा svn revert <filename>( svn update <filename>यदि आवश्यक हो तो) लेकिन Git में मुझे उपयोग करना चाहिए git reset --hard। हालाँकि यह कमांड एक फाइल पर काम नहीं कर सकती है।

क्या Git में किसी भी फाइल के परिवर्तनों को त्यागने और उसे एक ताज़ा हेड कॉपी के साथ अधिलेखित करने का कोई तरीका है?


3
git checkoutनीचे जवाब है। Git में, "रिवर्ट" एक ऐसी चीज है जिसे आप कमिट करते हैं। "रिवर्ट" आपके वर्किंग डायरेक्टरी में एक ऐतिहासिक कमिट का उलटा रिप्ले करता है, इसलिए आप एक नया कमिट कर सकते हैं जो रिवर्ट किए गए कमिट को "अनडू" करता है। मुझे लगता है कि यह svn से आने वाले लोगों के लिए भ्रम का एक लगातार बिंदु है।
डैन रे


अगर आपके पास रास्तों के साथ हार्ड रीसेट नहीं कर सकते रुचि रखते हैं, मेरा उत्तर की जाँच वहाँ
उपयोगकर्ता

यह प्रश्न मानता है, कि किसी को पता है कि हार्ड रीसेट क्या है।

जवाबों:


1805

आप निम्न आदेश का उपयोग कर सकते हैं:

git checkout HEAD -- my-file.txt

... जो my-file.txtकि HEAD के सूचकांक में और उसके राज्य की कार्य प्रतिलिपि दोनों को अद्यतन करेगा ।

--मूल रूप से इसका मतलब है: इस बिंदु के बाद हर तर्क को एक फ़ाइल नाम के रूप में मानेंइस उत्तर में अधिक जानकारी । इसे इंगित करने के लिए VonC को धन्यवाद ।


58
अधिक पूर्ण उत्तर +1;) '-' के लिए, stackoverflow.com/questions/6561142/… (और, आम तौर पर, stackoverflow.com/questions/1192180/… )
VonC

8
इसके अलावा, यह मत भूलो कि आप पिछली प्रतिबद्ध को संदर्भ के साथ प्रतिबद्ध कर सकते HEAD~1हैं।
रेनमैट

14
HEADयदि आप वर्तमान शाखा के प्रमुख हैं, तो आप बाहर निकल सकते हैं - देखिए norbauer.com/rails-consulting/notes/…
cxw

4
किसी भी अंतर्दृष्टि क्यों resetकमांड (जैसा कि यह कहता है) "पूरे रास्ते में checkoutहार्ड-रीसेट करने के लिए उपयोग नहीं किया जा सकता " और फिर कमांड क्यों नहीं है (नहीं हो सकता?)। (मेरा मतलब है कि यह क्यों डिजाइन किया गया है।)
एसजेड।

1
@cxw दुर्भाग्य से, यह बिल्कुल सच नहीं है। के मैन पेज से git checkout: "इंडेक्स या <ट्री-ईश>" में सामग्री के साथ काम करके ट्री को ओवरराइट करें। यानी यदि <tree-ish>छोड़ा गया है, तो इंडेक्स में जो भी सामग्री काम करने वाले पेड़ को अपडेट करने के लिए उपयोग की जाएगी। यह HEAD से भिन्न हो भी सकता है और नहीं भी।
tuntap

136

सिर पर रीसेट करें:

हार्ड फाइल को HEAD में रीसेट करने के लिए:

git checkout @ -- myfile.ext

ध्यान दें कि के @लिए कम है HEAD। पुराने संस्करण के संक्षिप्त रूप का समर्थन नहीं किया जा सकता है।

अनुक्रमणिका में रीसेट करें:

किसी एकल फ़ाइल को अनुक्रमणिका में हार्ड रीसेट करने के लिए , यह मानते हुए कि सूचकांक गैर-रिक्त है, अन्यथा HEAD के लिए:

git checkout -- myfile.ext

मुद्दा यह है कि सुरक्षित होने के लिए, आप तब तक @या HEADकमांड से बाहर नहीं निकलना चाहते जब तक कि आप विशेष रूप से केवल इंडेक्स पर रीसेट करने का मतलब न करें


1
Myfile.ext से पहले "-" के साथ क्या हो रहा है?
लैंस काइंड

3
@ लांसकींड जैसा कि मैं समझता हूं, इसका उपयोग उन फिल्मनामों की एक सूची का सीमांकन करने के लिए किया जाता है, जो इसका अनुसरण करते हैं। इसके बिना, ऐसे मामले हैं जब गिट गलत तरीके से तर्कों की व्याख्या करते हैं।
एक्यूमेनस

2
सिर्फ फिल्मी नहीं। व्यापक रूप से उपयोग किया जाने वाला सम्मेलन कई उपयोगिताओं में स्थितीय तर्कों से विकल्पों को अलग करता है। man bashपेज देखें इस उत्तर में भी उल्लेख किया गया है: unix.stackexchange.com/a/187548/142855
boweeb

1
पारंपरिक रूप से, --कार्यक्रम को बताने के लिए उपयोग किया जाता है I've finished specifying "options", and from here on, everything will be a positional argument.। परंपरागत रूप से, "विकल्प" टोकन हैं, --recursiveजो किसी भी क्रम में प्रकट हो सकते हैं, या यहां तक ​​कि उनके छोटे रूप में एक साथ जोड़ सकते हैं, जैसे rm -rf। इसके विपरीत, "स्थिति संबंधी दलीलें" एक प्रोग्रामिंग भाषा में एक फ़ंक्शन के लिए दिए गए तर्कों की तरह अधिक होती हैं: टोकन की सूची में उनकी स्थिति यह परिभाषित करती है कि कार्यक्रम वास्तव में उनके साथ क्या करने जा रहा है (ये अक्सर फ़ाइलनाम हैं)। --जो है के रूप में अस्पष्टता को हटाता है।
आयन


18

चूंकि Git 2.23 (अगस्त 2019) का उपयोग कर सकते restore( अधिक जानकारी ):

git restore pathTo/MyFile

ऊपर वर्तमान शाखा MyFileपर HEAD(अंतिम प्रतिबद्ध) को बहाल करेगा ।

यदि आप अन्य प्रतिबद्धताओं से परिवर्तन प्राप्त करना चाहते हैं तो आप प्रतिबद्ध इतिहास पर पीछे जा सकते हैं। नीचे दिए गए कमांड को MyFileपिछले एक से दो कमिट मिलेंगे । अब आप की जरूरत है -s( --sourceके बाद से अब आप का उपयोग करें) विकल्प master~2और नहीं master(डिफ़ॉल्ट) आप स्रोत बहाल के रूप में:

git restore -s master~2 pathTo/MyFile

आप अन्य शाखा से भी फ़ाइल प्राप्त कर सकते हैं!

git restore -s my-feature-branch pathTo/MyFile

1
अब तक का सबसे आसान तरीका। दुर्भाग्य से इस जवाब पर पर्याप्त ध्यान नहीं दिया जा रहा है।
singrium


4

आप एकल फ़ाइल को रीसेट करने के लिए नीचे दिए गए आदेश का उपयोग कर सकते हैं

git checkout HEAD -- path_to_file/file_name

path_to_file/filenameनीचे दिए गए आदेश के साथ प्राप्त करने के लिए सभी परिवर्तित फ़ाइलों की सूची बनाएं

git status

1

आप निम्न आदेश का उपयोग कर सकते हैं:

git reset -- my-file.txt

जो my-file.txtजोड़े जाने पर दोनों काम की प्रति अपडेट कर देगा ।


अनुरोध के अनुसार संशोधित फ़ाइल की सामग्री को नहीं बदलता है।
राफेल

जब आप छिपाने के लिए जोड़ते हैं तो क्या आपने फ़ाइल को संपादित किया है?
ADDYQU

1
वह विशेष रूप से बिंदु @ADDQU नहीं है। सवाल यह है कि किसी फाइल को "हार्ड रीसेट" कैसे किया जाए, न कि उसे स्टैण्डर्ड लिस्ट से हटाने के लिए।
राफेल

@ राफेल आप सही हैं, लेकिन मैं आपको बताना चाहता हूं कि इसका एक तरीका भी है।
ADDYQU

0

आप निम्न आदेश का उपयोग कर सकते हैं:

git checkout filename

यदि आपके पास एक ही फ़ाइल नाम के साथ एक शाखा है तो आपको इस कमांड का उपयोग करना होगा:

git checkout -- filename

1
यह फ़ाइल को "हार्ड रीसेट" नहीं करेगा - यह केवल कार्यशील पेड़ पर सूचकांक स्थिति की प्रतिलिपि बनाता है। एक "हार्ड रीसेट" सबसे पहले इंडेक्स को रीसेट करेगा।
एह

-20

एक सरल, आसान, हाथों पर चलने वाला, आपको गर्म पानी से बाहर निकालने का तरीका, खासकर यदि आप गिट के साथ इतने सहज नहीं हैं:

  1. अपनी फ़ाइल का लॉग देखें

    git लॉग myFile.js

    प्रतिबद्ध 1023057173029091u23f01w276931f7f42595f84f लेखक: kmiklas तिथि: मंगल अगस्त 7 09:29:34 2018 -0400

    JIRA-12345 - नई वास्तुकला के साथ रिफ्लेक्टर।

  2. फ़ाइल का नोट हैश:

    1023057173029091u23f01w276931f7f42595f84f

  3. हैश का उपयोग करके फ़ाइल दिखाएं। सुनिश्चित करें कि यह वही है जो आप चाहते हैं:

    git show 1023057173029091u23f01w276931f7f42595f84f :/ myFile.js

  4. फ़ाइल को स्थानीय प्रतिलिपि पर पुनर्निर्देशित करें

    git show 1023057173029091u23f01w276931f7f42595f84f :// myFile.js> myFile.07aug2018.js

  5. अपनी वर्तमान फ़ाइल का बैकअप लें।

    cp myFile.js myFile.bak.js

  6. अपने पसंदीदा टेक्स्ट एडिटर में दोनों फाइलें खोलें।

    vim myFile.js
    vim myFile.07aug2018.js

  7. N 'पेस्ट कोड को myFile.07aug2018.js से myFile.js पर कॉपी करें, और सहेजें।

  8. प्रतिबद्ध करें और myFile.js को आगे बढ़ाएं

  9. फिर से लॉग देखें, और पुष्टि करें कि आपकी फ़ाइल ठीक से है।

  10. अपने ग्राहकों को नवीनतम खींचने के लिए कहें, खुशी से इसे पुराने संस्करण के साथ काम करते हुए देखें।

सबसे कामुक, या अधिकांश गिट-केंद्रित समाधान नहीं है, और निश्चित रूप से एक "मैनुअल" रीसेट / प्रत्यावर्तन है, लेकिन यह काम करता है। इसके लिए न्यूनतम ज्ञान की आवश्यकता होती है, और यह प्रतिबद्ध इतिहास को विचलित नहीं करता है।


2
यह उत्तर किसी भी समाधान की तुलना में कहीं अधिक जटिल और त्रुटि प्रवण है जो इसे वर्षों से पूर्व निर्धारित करता है।
Artif3x

2
किसी को भी इस समाधान का उपयोग क्यों करना चाहिए !? सच्चा उत्तर केवल एक साधारण आदेश है।
मिलाद रहीमी

1
यह कुछ परिस्थितियों के लिए इष्टतम समाधान है। यह एक बाँध में उन लोगों के लिए योग्यता है, जहाँ git की खराबी है, और उन लोगों के लिए जिन्हें काम की जरूरत है।
किमीकिलास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.