सवाल गिट का उपयोग करके किसी विशिष्ट फ़ाइल को एक विशिष्ट संशोधन में रीसेट या वापस लाएं?


मैंने फाइल में कुछ बदलाव किए हैं जो फाइलों के समूह के हिस्से के रूप में कुछ बार किए गए हैं, लेकिन अब पिछले संस्करणों में बदलावों को रीसेट / रीवर्ट करना चाहते हैं।

मैंने किया है git log ए के साथ git diff मुझे जिस संशोधन की आवश्यकता है, उसे ढूंढने के लिए, लेकिन मुझे पता नहीं है कि फाइल को पूर्व में अपने पूर्व राज्य में कैसे वापस लेना है।


3452
2017-10-18 23:34


मूल


वापस करने के बाद, मत भूलना --cached जांच करते समय git diff। संपर्क - Geoffrey Hale
जब मैंने मेरा गुस्सा किया तो मुझे आपका प्रश्न मिला। लेकिन जब मैंने समाधान पढ़ा, तो मैंने अपने लॉग की जांच की और पता चला कि मैंने स्टैंडअलोन प्रतिबद्धता के रूप में परिवर्तन किया है, इसलिए मैंने उस प्रतिबद्धता के लिए गिट वापसी की, और बाकी सब कुछ मैं चाहता था। कोई समाधान नहीं, कभी-कभी इसे करने का एक और तरीका। - sudo97


जवाब:


जो प्रतिबद्धता आप चाहते हैं उसका हैश मानना c5f567:

git checkout c5f567 -- file1/to/restore file2/to/restore

गिट चेकआउट मैन पेज अधिक जानकारी देता है।

यदि आप पहले प्रतिबद्धता पर वापस जाना चाहते हैं c5f567, संलग्न करें ~1 (किसी भी संख्या के साथ काम करता है):

git checkout c5f567~1 -- file1/to/restore file2/to/restore

एक साइड नोट के रूप में, मैं हमेशा इस आदेश के साथ असहज रहा हूं क्योंकि इसका उपयोग सामान्य चीजों (शाखाओं के बीच बदलना) और असामान्य, विनाशकारी चीजों (कार्यशील निर्देशिका में परिवर्तनों को छोड़कर) दोनों के लिए किया जाता है।


4672
2017-10-18 23:39



यदि आप "abbcdf" में गड़बड़ कर चुके हैं और संस्करण चाहते हैं ठीक पहले "abbcdf", आप कर सकते हैं git checkout "abbcdf~1" path/to/file। - shadowhand
@shadowhand: क्या इसके विपरीत करने का कोई तरीका है, तो यह सही संस्करण है? - aliteralmind
@aliteralmind: नहीं, दुर्भाग्यवश गिट इतिहास शॉर्टकट नोटेशन इतिहास में पीछे की तरफ जाता है। - Greg Hewgill
यदि आप के लिए शाखा का नाम उपयोग करने जा रहे हैं abcde (उदाहरण के लिए develop) आप चाहेंगे git checkout develop -- file/to/restore (डबल डैश नोट करें) - Ohad Schneider
@aliteralmind: असल में, हाँ, ऐसा करने का एक तरीका है: "गिट लॉग - रिवर्स -1 - कैनेस्ट्री-पथ yourgitrev..master" और फिर गिट rev को प्राप्त करने के लिए उपयुक्त विकल्पों का उपयोग करें। --कैनेस्ट्री-पथ दो प्रतिबद्धताओं के बीच "एक रेखा खींचा" और -1 आपको केवल एक संस्करण दिखाएगा, और - यह सुनिश्चित करेगा कि उत्सर्जित पहली प्रविष्टि सबसे पुराना है। - Chris Cogdon


आप diff कमांड का उपयोग कर फ़ाइल में किए गए परिवर्तनों की त्वरित समीक्षा कर सकते हैं:

git diff <commit hash> <filename>

फिर उस प्रतिबद्धता को एक विशिष्ट फ़ाइल को वापस करने के लिए रीसेट कमांड का उपयोग करें:

git reset <commit hash> <filename>

आपको इसका उपयोग करने की आवश्यकता हो सकती है --hard विकल्प यदि आपके पास स्थानीय संशोधन हैं।

मैनेजिंग वेप पॉइंट्स के लिए एक अच्छा वर्कफ़्लो टैग्स का उपयोग अपनी टाइमलाइन में अंक को स्पष्ट रूप से चिह्नित करने के लिए करना है। मैं आपकी आखिरी वाक्य को काफी समझ नहीं पा रहा हूं लेकिन आप जो चाहते हैं वह पिछले समय से एक शाखा को अलग कर सकता है। ऐसा करने के लिए, आसान चेकआउट कमांड का उपयोग करें:

git checkout <commit hash>
git checkout -b <new branch name>

जब आप उन परिवर्तनों को मर्ज करने के लिए तैयार हों तो आप अपनी मुख्य लाइन के खिलाफ इसे फिर से दबा सकते हैं:

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>

508
2017-12-17 06:59



'गिट चेकआउट <प्रतिबद्ध हैश>' कमांड ने मुझे परियोजना के अपने पुराने संस्करण को ठीक से वापस दिया है जिसके लिए मैं धन्यवाद क्रिस खोज रहा था। - vidur punj
'गिट रीसेट <प्रतिबद्ध हैश> <filename>' ने मेरी विशिष्ट फ़ाइल को नहीं बदला है जिसे मैं बदलना चाहता हूं। क्या फ़ाइल के संस्करण को चेकआउट करने का कोई तरीका है, विशेष रूप से, और पूरे प्रोजेक्ट को चेकआउट नहीं करना? - Danny
फ़ाइल को वापस करने के लिए git checkout <commit hash> <filename> मेरे लिए बेहतर काम किया git reset - Motti Strom
उपयोग नहीं कर सकते git reset एकल फ़ाइल को रीसेट करने के लिए, आपको एक त्रुटि मिलेगी fatal: Cannot do hard reset with paths - slier
क्या स्लीयर ने कहा: आप नहीं कर सकते git reset --hard <commit hash> <filename>। यह त्रुटि होगी fatal: Cannot do hard reset with paths. मोटी स्ट्रॉम ने क्या कहा: उपयोग करें git checkout <commit hash> <filename> - Hawkeye Parker


यदि आप सबसे सुविधाजनक हैं तो आप SHA-1 समेत गिट प्रतिबद्ध के किसी भी संदर्भ का उपयोग कर सकते हैं। मुद्दा यह है कि आदेश इस तरह दिखता है:

git checkout [commit-ref] -- [filename]


306
2018-04-07 21:48



इस जवाब के बीच क्या अंतर है, जो है --, और स्वीकृत एक जो नहीं करता है? - 2rs2ts
गिट में, फ़ाइल सूची से पहले '-' गिट बताता है कि सभी अगले तर्कों को फ़ाइल नामों के रूप में व्याख्या किया जाना चाहिए, न कि शाखा-नाम या किसी अन्य चीज़ के रूप में। यह कभी-कभी एक सहायक असंबद्ध है। - foxxtrot
'-' न केवल एक गिट सम्मेलन है, लेकिन * निक्स कमांडलाइन पर आपको विभिन्न स्थानों पर कुछ मिलता है। rm -- -f (नाम की एक फ़ाइल को हटा दें -f) कैनोलिक उदाहरण प्रतीत होता है। यहां अधिक जानकारी - Hawkeye Parker
बस @HawkeyeParker ने क्या कहा, rm कमांड अपने तर्कों का विश्लेषण करने के लिए getopt (3) का उपयोग करता है। getopt कमांड तर्कों को पार्स करने का आदेश है। gnu.org/software/libc/manual/html_node/Getopt.html - Devy
@ हनी हां, मेरा यही मतलब है, और हाँ, शायद बिल्कुल आम नहीं है। मैंने उस जगह को विभिन्न स्थानों में देखा है, शायद इसे यादगार बनाने के लिए: आरएम-एफ डरावना / खतरनाक होने के लिए जाना जाता है। लेकिन, बिंदु, * nix में एक फ़ाइल नाम है कर सकते हैं '-' से शुरू करें, और यह विभिन्न कमांडलाइन दुभाषियों को भ्रमित करेगा, जब वे '-' देखते हैं, तो कमांड विकल्प का पालन करने की अपेक्षा करें। यह '-' से शुरू होने वाली कोई भी फाइल हो सकती है; उदाहरण के लिए, "-mySpecialFile"। - Hawkeye Parker


git checkout -- foo

वह रीसेट हो जाएगा foo बढ़ना। आप भी कर सकते हैं:

git checkout HEAD^ foo

एक संशोधन के लिए, आदि के लिए


244
2017-08-29 20:56



मैं वाक्यविन्यास का उपयोग करने का सुझाव देना चाहूंगा git checkout -- foo अगर किसी भी गलतियों से बचने के लिए foo कुछ खास है (एक निर्देशिका या एक फ़ाइल की तरह -f)। गिट के साथ, यदि आप अनिश्चित हैं, तो हमेशा विशेष तर्क के साथ सभी फ़ाइलों और निर्देशिकाओं को उपसर्ग करें --। - Mikko Rantalainen
मिक्को की टिप्पणी के लिए एक अतिरिक्त नोट: -- गिट कमांड नहीं है और गिट के लिए विशेष नहीं है। यह कमांड विकल्पों के अंत को इंगित करने के लिए अंतर्निहित एक बैश है। आप इसे कई अन्य बैश कमांड के साथ भी उपयोग कर सकते हैं। - matthaeus
@matthaeus यह भी न तो विशिष्ट है और न ही एक खोल सुविधा के लिए विशिष्ट है। यह कई अलग-अलग आदेशों में लागू एक सम्मेलन है (और गेटोपेट द्वारा समर्थित)। - Greg Hewgill


और अंतिम प्रतिबद्ध संस्करण पर वापस जाने के लिए, जिसकी सबसे अधिक आवश्यकता होती है, आप इस सरल कमांड का उपयोग कर सकते हैं।

git checkout HEAD file/to/restore

106
2018-01-14 06:15



इस के बीच क्या अंतर है (गिट चेकआउट HEAD फ़ाइल / टू / पुनर्स्थापित) और गिट रीसेट - फ़ाइल फ़ाइल / पुनर्स्थापित / ??? - Motti Shneor
1) अधिक सामान्य तरीके याद रखना आसान है 2) फ़ाइल नाम दर्ज करने से पहले एंटर दबाएं कोई चिंता नहीं - Roman Susi


मुझे अभी भी यही समस्या थी और मैंने पाया यह जवाब समझने के लिए सबसे आसान (commit-ref लॉग में परिवर्तन का SHA मान है जिसे आप वापस जाना चाहते हैं):

git checkout [commit-ref] [filename]

यह आपके पुराने निर्देशिका में उस पुराने संस्करण को रखेगा और वहां से यदि आप चाहें तो इसे प्रतिबद्ध कर सकते हैं।


100
2018-05-27 17:52





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

git checkout master~5 image.png

यह मानता है कि आप पर हैं master शाखा, और जो संस्करण आप चाहते हैं वह 5 है।


85
2018-04-07 14:03





मुझे लगता है कि मैंने इसे पाया है .... से http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html

कभी-कभी आप वापस जाना चाहते हैं और एक निश्चित बिंदु से हर बदलाव के बारे में भूल जाते हैं क्योंकि वे सभी गलत हैं।

के साथ शुरू:

$ git log

जो आपको हालिया प्रतिबद्धताओं की सूची दिखाता है, और उनके SHA1 हैश।

अगला, टाइप करें:

$ git reset --hard SHA1_HASH

किसी दिए गए प्रतिबद्धता को राज्य को बहाल करने और रिकॉर्ड से सभी नए कामों को स्थायी रूप से मिटाने के लिए।


75
2017-12-17 06:53



गिट कुछ भी नहीं हटाता है। आपकी पुरानी काम अभी भी वहां है, लेकिन जब तक कोई शाखा टिप इंगित नहीं करती है तब तक वे अब तक पहुंच योग्य नहीं हैं। गिट रीफ्लॉग तब भी उन्हें तब तक दिखाएगा जब तक कि आप अपने भंडार को गिट-जीसी के साथ साफ न करें। - Bombe
@ बॉम्बे: जानकारी के लिए धन्यवाद। मैंने फ़ाइल के पुराने संस्करण की जांच की थी। अपनी टिप्पणी पढ़ने के बाद, मैं आंशिक SHA1 हैश को देखने के लिए "gitref" का उपयोग करने में सक्षम था, और नवीनतम संस्करण पर वापस जाने के लिए "चेकआउट" का उपयोग करता हूं। अन्य गिट उपयोगकर्ताओं को यह जानकारी उपयोगी हो सकती है। - Winston C. Yang
संभवतः एक के बाद git push --force - bshirley
यदि आपके पास असामान्य परिवर्तन हैं, तुम ढीले हो जाओगे अगर वे एक गिट रीसेट करते हैं - हार्ड - Boklucius
@ बॉम्बे - "गिट कभी भी कुछ भी नहीं हटाता है। आपकी पुरानी काम अभी भी वहां है, लेकिन जब तक कोई शाखा टिप इंगित नहीं करती है तो वे अब तक पहुंच योग्य नहीं हैं।" - लेकिन ऐसा कुछ समय के बाद इस तरह से किया जाता है, इसलिए "गिट कभी भी कुछ भी नहीं हटाता" असत्य है। - Bulwersator