मैं किसी विशिष्ट संशोधन के लिए फ़ाइल को कैसे रीसेट या रिवर्ट कर सकता हूं?


4511

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

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


11
वापस आने के बाद, --cachedजब जाँच करना न भूलें git diffलिंक
ज्योफ्री हेल

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

जवाबों:


6129

आप चाहते हैं कि हैश का मान है c5f567:

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

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

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

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

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


12
@ शशोखंड: क्या इसका उल्टा करने का कोई तरीका है, इसलिए यह इसके ठीक बाद का संस्करण है?
aliteralmind

16
@aliteralmind: नहीं, दुर्भाग्य से गिट इतिहास शॉर्टकट नोटेशन केवल इतिहास में पीछे की ओर जाता है।
ग्रेग हेवगिल

45
यदि आप abcde के लिए एक शाखा नाम का उपयोग करने जा रहे हैं (जैसे develop) आप git checkout develop -- file/to/restore(डबल डैश पर ध्यान दें) चाहते हैं
ओह्ड श्नाइडर

8
@aliteralmind: वास्तव में, हाँ, ऐसा करने का एक तरीका है: "git log --reverse -1 --ancestry-path yourgitrev..master" और उसके बाद उपयुक्त विकल्पों का उपयोग करके केवल git Rev प्राप्त करें। - वानिकी-पथ दो आवागमन के बीच "एक रेखा खींचेगा" और -1 आपको सिर्फ एक संस्करण दिखाएगा, और --reverse सुनिश्चित करेगा कि उत्सर्जित पहली प्रविष्टि सबसे पुरानी है।
क्रिस कोगडोन

6
व्यक्तिगत रूप से मुझे HEAD ^ HEAD की तुलना में टाइप करना आसान लगता है ~ 1 :)
juzzlin

606

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

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>

7
'git चेकआउट <प्रतिबद्ध हैश>' कमांड ने मुझे प्रोजेक्ट का मेरा पुराना संस्करण वापस दे दिया है, जिसके लिए मैं धन्यवाद क्रिस खोज रहा था।
विदुर ने

48
फ़ाइल को वापस करने के git checkout <commit hash> <filename>लिए मेरे लिए बेहतर काम कियाgit reset
मोति स्ट्रोम

3
मैं एक एकल फ़ाइल का एक प्रारंभिक संस्करण चाहता था क्योंकि मैंने बुरी तरह से चुनी गई कॉपी / पेस्ट के साथ 150 लाइनें लिखी थीं। git checkout <commit hash> <filename>मेरे लिए काम किया। यह स्वीकृत उत्तर नहीं होना चाहिए, IMHO। git resetनहीं किया।
harperville

24
git resetएकल फ़ाइल को रीसेट करने के लिए उपयोग नहीं किया जा सकता है , आपको एक त्रुटि मिल जाएगीfatal: Cannot do hard reset with paths
स्लिकर

13
किस धीमे ने कहा: आप नहीं कर सकते git reset --hard <commit hash> <filename>fatal: Cannot do hard reset with paths.Motti स्ट्रोम ने कहा कि यह त्रुटि करेगा : उपयोगgit checkout <commit hash> <filename>
Hawkeye पार्कर

366

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

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


22
इस उत्तर के बीच क्या अंतर है, जो है --, और जो स्वीकार नहीं करता है?
2rs2ts

80
Git में, फ़ाइल सूची से पहले एक '-' git बताता है कि अगले सभी तर्कों को फ़ाइल नाम के रूप में व्याख्या किया जाना चाहिए, न कि शाखा-नामों या किसी अन्य चीज़ के रूप में। यह कभी-कभी एक मददगार अनादर है।
foxxtrot

49
'-' न केवल एक जीआईटी सम्मेलन है, बल्कि आप कुछ जगहों पर * निक्स कमांडलाइन पर भी मिल सकते हैं। rm -- -f(नाम की एक फ़ाइल को हटा दें -f) विहित उदाहरण प्रतीत होता है। यहाँ अधिक विस्तार
हॉकआई पार्कर

7
@HawkeyeParker ने क्या कहा, rmइसके तर्क में पार्स (3) का उपयोग करें। getoptआदेश तर्कों को पार्स करने के लिए आदेश है। gnu.org/software/libc/manual/html_node/Getopt.html
Devy

2
@ हाँ, यही मेरा मतलब है, और हाँ, शायद बिल्कुल भी सामान्य नहीं है। मैंने उस उदाहरण को विभिन्न स्थानों में देखा है, हो सकता है कि सिर्फ इसे छंटनी यादगार बनाने के लिए: rm -f को डरावना / खतरनाक माना जाता है। लेकिन, मुद्दा यह है कि, * nix में एक फ़ाइल नाम '-' से शुरू हो सकता है , और यह विभिन्न कमांडलाइन दुभाषियों को भ्रमित करेगा, जब वे '-' देखते हैं, तो कमांड विकल्प का पालन करने की अपेक्षा करते हैं। यह '-' से शुरू होने वाली कोई भी फाइल हो सकती है; जैसे, "-mySpecialFile"।
हकीकी पार्कर

287
git checkout -- foo

वह fooHEAD में रीसेट हो जाएगा । आप भी कर सकते हैं:

git checkout HEAD^ foo

एक संशोधन के लिए वापस, आदि।


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

8
मिको की टिप्पणी पर एक अतिरिक्त टिप्पणी: --एक git कमांड नहीं है और git के लिए विशेष नहीं है। यह एक बैश बिल्ट-इन है जो कमांड विकल्पों के अंत को दर्शाता है। आप इसे कई अन्य बैश कमांड के साथ भी उपयोग कर सकते हैं।
मैथ्यूस

14
@matthaeus यह न तो बैश के लिए विशिष्ट है और न ही एक शेल विशेषता है। यह कई अलग-अलग कमांडों में लागू किया गया एक सम्मेलन है (और गेटटॉप द्वारा समर्थित)।
४ill में ग्रेग हेवगिल

2
नहीं है, --है बैश में अंतर्निहित विशेष शब्द। लेकिन यह एक सामान्य सम्मेलन है जो कई कमांडलाइन पार्सर द्वारा समर्थित है और कई सीएलआई द्वारा उपयोग किया जाता है, जिसमें गिट भी शामिल है।
एमिल लुंडबर्ग

123

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

git checkout HEAD file/to/restore

2
इसमें क्या अंतर है (git checkout HEAD फाइल / टू / रिस्टोर) और git रीसेट --hard file / to / restore ???
मोतिन शनर

2
1) अधिक सामान्य तरीके से याद रखना आसान है 2) प्रेस करने के लिए कोई चिंता नहीं है फ़ाइल नाम दर्ज करने से पहले दर्ज करें
रोमन सूसी

105

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

git checkout [commit-ref] [filename]

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


91

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

git checkout master~5 image.png

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


80

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

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

के साथ शुरू:

$ git log

जो आपको हाल ही में किए गए कॉमेट्स और उनके SHA1 हैश की सूची दिखाता है।

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

$ git reset --hard SHA1_HASH

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


24
गिट कभी भी कुछ भी नहीं निकालता है। आपके पुराने कमिट अभी भी हैं, लेकिन जब तक कोई ब्रांच टिप नहीं है, तब तक वे इशारा करते हैं कि वे अब उपलब्ध नहीं हैं। git reflog तब तक उन्हें दिखाएगा, जब तक आप अपनी रिपॉजिटरी को git-gc से साफ नहीं करते।
बॉम्बे

1
@ बॉम्बे: जानकारी के लिए धन्यवाद। मैंने एक फ़ाइल के पुराने संस्करण की जाँच की थी। आपकी टिप्पणी पढ़ने के बाद, मैं आंशिक SHA1 हैश देखने के लिए "gitref" का उपयोग करने में सक्षम था, और सबसे हाल के संस्करण में वापस आने के लिए "चेकआउट" का उपयोग कर सकता था। अन्य git यूजर्स को यह जानकारी मददगार लग सकती है।
विंस्टन सी। यांग

4
संभवतः एक के बादgit push --force
bshirley

4
यदि आपके पास कोई परिवर्तन नहीं हुआ है, तो आप उन्हें ढीला कर देंगे यदि कोई git रीसेट करता है
भार

5
@ बॉम्बे - "गेट कभी भी कुछ भी नहीं हटाता है। आपके पुराने कमिट अभी भी हैं, लेकिन जब तक कोई ब्रांच टिप नहीं है, यह इंगित करता है कि वे अब उपलब्ध नहीं हैं।" - लेकिन इस तरह से कुछ निर्धारित समय के बाद छंटाई की जाती है, इसलिए "गिट कभी भी कुछ भी नहीं हटाता है" असत्य है।
बुलवेटर

61

यह मेरे लिए काम किया:

git checkout <commit hash> file

फिर परिवर्तन करें:

git commit -a

54

"रोलबैक" कहने पर आपको सावधान रहना होगा। यदि आपके पास $ A में फ़ाइल का एक संस्करण हुआ करता था, और फिर बाद में दो अलग-अलग बदलाव किए $ B और $ C (तो आप जो देख रहे हैं, वह फ़ाइल का तीसरा पुनरावृत्ति है), और यदि आप कहते हैं " मैं पहले एक के लिए वापस रोल करना चाहता हूं ", क्या आप वास्तव में इसका मतलब है?

यदि आप दूसरे और तीसरे पुनरावृत्ति दोनों के परिवर्तनों से छुटकारा पाना चाहते हैं, तो यह बहुत आसान है:

$ git checkout $A file

और फिर आप परिणाम के लिए प्रतिबद्ध हैं। कमांड पूछता है "मैं कमिट $ ए द्वारा दर्ज की गई राज्य से फाइल की जांच करना चाहता हूं"।

दूसरी ओर, आपके लिए क्या मतलब है कि बदलाव लाए जाने से छुटकारा पाने के लिए दूसरा पुनरावृत्ति (यानी प्रतिबद्ध $ B) लाया जाए, जबकि $ C ने फ़ाइल के लिए जो किया है, उसे ध्यान में रखते हुए, आप $ B को वापस करना चाहेंगे।

$ git revert $B

ध्यान दें कि जिसने भी $ B बनाया है, वह बहुत अनुशासित नहीं हो सकता है और उसने एक ही प्रतिबद्ध में पूरी तरह से असंबंधित परिवर्तन किया हो, और यह रिवर्ट आपके द्वारा किए जा रहे परिवर्तनों को देखने वाली फ़ाइल के अलावा अन्य फ़ाइलों को स्पर्श कर सकता है, इसलिए आप ऐसा करने के बाद सावधानीपूर्वक परिणाम की जांच करना चाहते हैं। इसलिए।


मैंने ऐसा किया था, लेकिन फिर एक "गिट लॉग फाइल" कहेगा कि मैं मूल वचन पर था, हेड। ऐसा लगता था कि "गिट चेकआउट" विफल हो रहा था। हालाँकि, एक स्थिति ने दिखाया कि फ़ाइल वास्तव में बदल गई थी और "git diff --staged फ़ाइल" वास्तविक परिवर्तन दिखाएगा। इसके अलावा, "git स्टेटस" ने फ़ाइल को बदल के भी दिखाया। इसलिए "git लॉग" का उपयोग यहां मत ट्रैक करने के लिए करें कि कौन सी फाइलें बदल गईं।
फ्रेडरिक ओलिंगर

37

git checkout fooयदि वर्किंग कॉपी नाम की डायरेक्टरी में है, तो मनोरंजक ढंग से काम नहीं करेगा foo; हालाँकि, दोनों git checkout HEAD fooऔर git checkout ./fooहोगा:

$ pwd
/Users/aaron/Documents/work/foo
$ git checkout foo
D   foo
Already on "foo"
$ git checkout ./foo
$ git checkout HEAD foo

26
याgit checkout -- foo
knittl

32

यहां बताया गया है कि कैसे rebaseकाम करता है:

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

मान लो तुम्हारे पास है

---o----o----o----o  master
    \---A----B       <my branch>

पहले दो कमांड ... कमिट चेक चेक git रिबेट मास्टर

... उन शाखाओं की जाँच करें जिन्हें आप शाखा में लागू करना चाहते हैं masterrebaseआदेश से प्रतिबद्ध लेता है <my branch>(कि में नहीं मिलते हैं masterके सिर करने के लिए) और उन्हें फिर से लागू करता master। दूसरे शब्दों में, पहली प्रतिबद्धता के माता-पिता <my branch>अब masterइतिहास में पिछली प्रतिबद्ध नहीं हैं , लेकिन वर्तमान प्रमुख हैं master। दो आज्ञाएँ समान हैं:

git rebase master <my branch>

इस आदेश को याद रखना आसान हो सकता है क्योंकि दोनों "आधार" और "संशोधित" शाखाएं स्पष्ट हैं।

। अंतिम इतिहास परिणाम है:

---o----o----o----o   master
                   \----A'----B'  <my branch>

अंतिम दो आदेश ...

git checkout master
git merge <my branch>

... <my branch>पर सभी परिवर्तनों को लागू करने के लिए एक तेजी से आगे मर्ज करें master। इस कदम के बिना, रिबेट कमिट को जोड़ा नहीं जाता है master। अंतिम परिणाम है:

---o----o----o----o----A'----B'  master, <my branch>

masterऔर <my branch>दोनों संदर्भ B'। इसके अलावा, इस बिंदु से <my branch>संदर्भ को हटाना सुरक्षित है ।

git branch -d <my branch>

26

Git v2.23.0 के अनुसार एक नया git रिस्टोर मेथड है जो माना जाता है कि git checkoutइसके लिए जिम्मेदार था (यहां तक ​​कि स्वीकृत उत्तर का उल्लेख है git checkoutजो काफी भ्रामक है)। जीथब ब्लॉग पर परिवर्तनों के मुख्य अंश देखें ।

इस कमांड का डिफ़ॉल्ट व्यवहार sourceपैरामीटर (जो आपके मामले में एक प्रतिबद्ध हैश होगा) से आने वाली सामग्री के साथ एक कार्यशील पेड़ की स्थिति को पुनर्स्थापित करना है ।

तो ग्रेग हेगिल के जवाब (प्रतिबद्ध हैश है c5f567) के आधार पर कमांड इस तरह दिखेगा:

git restore --source=c5f567 file1/to/restore file2/to/restore

या यदि आप c5f567 से पहले एक कमिट की सामग्री को पुनर्स्थापित करना चाहते हैं:

git restore --source=c5f567~1 file1/to/restore file2/to/restore

24

टारगेट फाइल के लिए पहले रीसेट हेड

git reset HEAD path_to_file

दूसरा चेकआउट वह फ़ाइल

git checkout -- path_to_file

4
+1, हालांकि HEAD को रीसेट करने के इरादे के बारे में सुनिश्चित नहीं है। इसकी जरूरत हो भी सकती है और नहीं भी। मेरी स्थिति में मैं केवल रिपॉजिटरी में संस्करण के लिए एक विशेष फ़ाइल को वापस करना चाहता था (जो शेष स्थानीय परिवर्तनों को बरकरार रख रहा था। बस ऊपर दूसरा कदम चलाना मेरे लिए पर्याप्त था
fkl

हां मुझे केवल 2 डी कमांड चलाने की जरूरत है। जैसा -> shellhacks.com/git-revert-file-to-previous-commit
javaPlease42

22

बचाव के लिए git-aliases, awk और shell-functions!

git prevision <N> <filename>

<N>फ़ाइल के रोलबैक में फ़ाइल के संशोधन की संख्या कहाँ है <filename>
उदाहरण के लिए, किसी एकल फ़ाइल के तत्काल पिछले संशोधन की जांच करने के लिए x/y/z.c, चलाएं

git prevision -1 x/y/z.c

प्रिटिंग कैसे काम करती है?

निम्नलिखित को अपने में जोड़ें gitconfig

[alias]
        prevision = "!f() { git checkout `git log --oneline $2 |  awk -v commit="$1" 'FNR == -commit+1 {print $1}'` $2;} ;f"

मूल रूप से आज्ञा

  • प्रदर्शन करती एक git logनिर्दिष्ट फ़ाइल पर और
  • फ़ाइल के इतिहास में उपयुक्त कमिट-आईडी चुनता है और
  • git checkoutनिर्दिष्ट फ़ाइल के लिए प्रतिबद्ध आईडी के लिए एक निष्पादित करता है ।

अनिवार्य रूप से, वह सब जो इस स्थिति में मैन्युअल रूप से करेगा,
एक सुंदर, कुशल गिट-उर्फ में लिपटा हुआ - गिट-प्रीविज़न


20

मुझे यहां ईज़ीगिट प्लग करना है, जो अनुभवी उपयोगकर्ताओं को भ्रमित किए बिना नौसिखियों को अधिक स्वीकार्य बनाने के लिए एक आवरण है। यह जिन चीजों को करता है उनमें से एक को अधिक अर्थ दिया जाता हैgit revert । इस मामले में, आप बस कहेंगे:

eg revert foo/bar foo/baz


1
यह होना चाहिए eg revert --in REVISON -- FILENAME--inमहत्वपूर्ण है। विंडोज उपयोगकर्ताओं के लिए: खुला गिट बाश। निष्पादित करें echo %PATH। पहला रास्ता आपकी उपयोगकर्ता निर्देशिका के साथ समाप्त होना चाहिए bin। वह रास्ता बनाएं। स्टोर जैसे वहाँ। नाम बताइए eg। नहीं है eg.txt
koppor

20

उस स्थिति में जब आप किसी फ़ाइल को पिछली कमेटी में वापस करना चाहते हैं (और वह फ़ाइल जिसे आप पहले से ही कमिट करना चाहते हैं) आप उपयोग कर सकते हैं

git checkout HEAD^1 path/to/file

या

git checkout HEAD~1 path/to/file

फिर बस चरण और "नया" संस्करण प्रतिबद्ध करें।

इस ज्ञान के साथ सशस्त्र कि एक मर्ज के मामले में दो माता-पिता हो सकते हैं, आपको पता होना चाहिए कि HEAD ^ 1 पहला माता-पिता है और HEAD ~ 1 दूसरा माता-पिता है।

अगर पेड़ में केवल एक ही माता-पिता हैं तो या तो काम करेंगे।


19

यहाँ कई सुझाव, अधिकांश की तर्ज पर git checkout $revision -- $file। अस्पष्ट विकल्पों में से एक जोड़ी:

git show $revision:$file > $file

और यह भी, मैं अस्थायी रूप से किसी विशेष संस्करण को देखने के लिए इसका उपयोग करता हूं:

git show $revision:$file

या

git show $revision:$file | vim -R -

(OBS: इसके $fileसाथ उपसर्ग करने की आवश्यकता है ./अगर यह git show $revision:$fileकाम करने के लिए एक सापेक्ष मार्ग है )

और भी अजीब:

git archive $revision $file | tar -x0 > $file

1
यह एक अच्छा विकल्प है यदि आप सुनिश्चित नहीं हैं कि आप कौन सा संस्करण चाहते हैं और अपनी कार्यशील निर्देशिका को अधिलेखित किए बिना चारों ओर "झांकना" चाहिए।
वारबिक्री

18

हालांकि, ध्यान रखें कि git checkout ./fooऔर git checkout HEAD ./foo नहीं कर रहे हैं वास्तव में एक ही बात; इसका स्पष्ट उदाहरण:

$ echo A > foo
$ git add foo
$ git commit -m 'A' foo
Created commit a1f085f: A
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 foo
$ echo B >> foo
$ git add foo
$ echo C >> foo
$ cat foo
A
B
C
$ git checkout ./foo
$ cat foo
A
B
$ git checkout HEAD ./foo
$ cat foo
A

(दूसरा addचरण फ़ाइल को इंडेक्स में रखता है, लेकिन यह प्रतिबद्ध नहीं है ।)

Git checkout ./fooसूचकांक./foo से पथ को वापस लाने का मतलब है ; ऐसा करने से पहले अनुक्रमणिका में उस पथ को उसके पुनरीक्षण में वापस लाने के निर्देश Git को जोड़ता है।HEADHEAD


14

मेरे लिए कोई भी उत्तर वास्तव में स्पष्ट नहीं था और इसलिए मैं अपना जोड़ना चाहूंगा जो सुपर आसान लगता है।

मेरे पास एक कमिट है abc1और इसके बाद मैंने एक फाइल में कई (या एक संशोधन) किया है file.txt

अब कहते हैं कि मैंने फ़ाइल में कुछ गड़बड़ कर दी है file.txtऔर मैं एक पिछली प्रतिबद्धता पर वापस जाना चाहता हूं abc1

1. git checkout file.txt, यह स्थानीय परिवर्तनों को हटा देगा, अगर आपको उनकी आवश्यकता नहीं है

2 git checkout abc1 file.txt.: यह आपकी फ़ाइल को आपके वांछित संस्करण में लाएगा

3 git commit -m "Restored file.txt to version abc1".: यह आपका उलटा काम करेगा।

  1. git push : यह दूरस्थ भंडार पर सब कुछ धक्का देगा

चरण 2 और 3 के बीच निश्चित रूप से आप यह git statusसमझने के लिए कर सकते हैं कि क्या चल रहा है। आमतौर पर आपको file.txtपहले से ही जोड़ा हुआ देखना चाहिए और इसीलिए इसकी कोई आवश्यकता नहीं है git add


2
ठीक है तो मुझे लगता है कि चरण 1 और 2 पारस्परिक रूप से अनन्य हैं: यदि एबीसी 1 आपकी अंतिम प्रतिबद्धता है तो 2. की कोई आवश्यकता नहीं है और यदि एबीसी 1 के बाद अन्य कमिट थे तो आप सीधे कर सकते हैं 2.
जीन पॉल

13
  1. एक विशिष्ट कमिट के लिए फ़ाइल को वापस लाएँ
git checkout Last_Stable_commit_Number -- fileName

2. एक विशिष्ट शाखा में फ़ाइल को वापस लाएं

git checkout branchName_Which_Has_stable_Commit fileName

11

फ़ाइल के पिछले कमिट वर्जन में जाने के लिए, कमिट नंबर प्राप्त करें, फिर eb917a1 कहें

git checkout eb917a1 YourFileName

अगर आपको बस आखिरी कमिटेड वर्जन पर वापस जाने की जरूरत है

git reset HEAD YourFileName
git checkout YourFileName

यह आपको फ़ाइल के अंतिम प्रतिबद्ध राज्य में ले जाएगा



10

यहां कई उत्तर उपयोग करने git reset ... <file>या दावा करने का दावा करते हैं, git checkout ... <file>लेकिन ऐसा करने पर, आप जिस संशोधन <file>को वापस करना चाहते हैं, उसके बाद आप हर संशोधन को ढीला कर देंगे ।

यदि आप किसी एकल फ़ाइल पर केवल एक ही फ़ाइल से किए गए परिवर्तनों को वापस करना चाहते हैं, git revertतो केवल एक फ़ाइल के लिए (या कहें कि फ़ाइलों का सबसेट कहेंगे), मैं दोनों का उपयोग करने का सुझाव देता हूं git diffऔर git applyउस तरह ( <sha>= = हैश के साथ) आप वापस करना चाहते हैं):

git diff <sha>^ <sha> path/to/file.ext | git apply -R

मूल रूप से, यह पहले उन परिवर्तनों के लिए एक पैच उत्पन्न करेगा जिन्हें आप वापस करना चाहते हैं, और फिर उन परिवर्तनों को छोड़ने के लिए पैच को उल्टा कर दें।

निश्चित रूप से, यह काम नहीं करेगा यदि उलटा लाइनों को किसी भी प्रतिबद्ध <sha1>और HEAD(संघर्ष) द्वारा संशोधित किया गया था ।


वह स्वीकृत उत्तर होना चाहिए। मुझे थोड़ा सरलीकृत संस्करण सुझाया जा सकता है:git show -p <sha> path/to/file.ext|git apply -R
Amaury D

आप <sha>^!इसके बजाय का उपयोग कर सकते हैं<sha>^ <sha>
कपटपूर्ण

8

git logविशिष्ट संस्करण के लिए हैश कुंजी प्राप्त करने के लिए उपयोग करें और फिर उपयोग करेंgit checkout <hashkey>

नोट: पिछले एक से पहले हैश टाइप करना ना भूलें। अंतिम हैश आपकी वर्तमान स्थिति (HEAD) को इंगित करता है और कुछ भी नहीं बदलता है।


7

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

cd <working copy>
git revert master

ऐसा करने के लिए लगने वाली अंतिम प्रतिबद्धता को पूर्ववत कर देगा।

इयान


7

आप इसे 4 चरणों में कर सकते हैं:

  1. जिस फ़ाइल को आप विशेष रूप से वापस करना चाहते हैं, उसके साथ पूरी प्रतिबद्धता वापस करें - यह आपकी शाखा पर एक नई प्रतिबद्धता बनाएगा
  2. नरम रीसेट जो प्रतिबद्ध है - प्रतिबद्ध को हटा देता है और कार्य क्षेत्र में परिवर्तन को स्थानांतरित करता है
  3. वापस करने और उन्हें करने के लिए फ़ाइलों को हैंडपिक करें
  4. अपने कार्य क्षेत्र में अन्य सभी फ़ाइलें छोड़ें

आपको अपने टर्मिनल में क्या लिखना है :

  1. git revert <commit_hash>
  2. git reset HEAD~1
  3. git add <file_i_want_to_revert> && git commit -m 'reverting file'
  4. git checkout .

सौभाग्य


सभी परिवर्तनों को वापस नहीं करता है?
arcee123

1
@ arcee123 हां, लेकिन बाद में रीसेट सभी परिवर्तनों को वापस कर देता है। समस्या यह है कि git-revertकेवल पूरे रेपो पर काम करता है, इसलिए क्षतिपूर्ति करने के लिए हमें बाकी सब कुछ पूर्ववत करना होगा।
तीमुथियुस

2
मैं उपयोग करने की सलाह देता हूं: 1. git revert --no-commit <commit_hash>2. git reset HEADयह एक अतिरिक्त कमेंट को इधर-उधर करता है और केवल आपकी वर्किंग डायरेक्टरी में ही सारे बदलाव करता है।
तीमुथियुस

@ greg-hewgill का उत्तर बेहतर और हाजिर है। यह एक घटिया है और इसका उपयोग नहीं किया जाना चाहिए।
डैनियल Tranca

यह वही है जो विशिष्ट फ़ाइलों के एक सच्चे वापसी के लिए आवश्यक है। मुझे पहले की प्रतिबद्ध से कुछ फ़ाइलों में परिवर्तन करने की आवश्यकता थी जो पहले से ही दूरस्थ रिपॉजिटरी में धकेल दी गई थी। मैंने रिवर्ट किया, रीसेट किया, और परिणाम दिया: git revert _oldcommit_ --no-commit git reset -- _unchanged1_ _unchanged2_ ... git commit -m "branch without changes to specific files"नई ब्रांच टिप ने रिवर्ट की गई फ़ाइलों को छोड़कर सभी परिवर्तनों को प्रतिबिंबित किया।
सनकैट

7

यह एक बहुत ही सरल कदम है। हम चाहते हैं कि प्रतिबद्ध आईडी के लिए चेकआउट फ़ाइल, यहाँ एक से पहले आईडी, और फिर बस कमिट संशोधन और हम किया जाता है।

# git checkout <previous commit_id> <file_name>
# git commit --amend

यह बहुत आसान है। अगर हम किसी भी फ़ाइल को किसी भी पूर्व प्रतिबद्ध आईडी पर लाना चाहते हैं, तो हम आसानी से कर सकते हैं।


5
git revert <hash>

किसी दिए गए वचन को वापस करेंगे। ऐसा लगता है कि आपको लगता है कि git revertकेवल हालिया प्रतिबद्ध को प्रभावित करता है।

यदि आप किसी विशिष्ट फ़ाइल में परिवर्तन वापस करना चाहते हैं और उस फ़ाइल की तुलना में अधिक परिवर्तन किया है, तो यह आपकी समस्या का समाधान नहीं करता है।


5

यदि आप अपने पिछले कामों में एक गलत फ़ाइल करते हैं तो निर्देश का पालन करें:

  1. ओपन सोर्स ट्री, इस कमिट में बदलें

खुला स्रोत पेड़

  1. लाइनों को बदलें और अपनी प्रतिबद्ध पाएं कि गलत फ़ाइल को प्रतिबद्ध के रूप में भेजा गया है

यहां छवि विवरण दर्ज करें

  1. आप उस प्रतिबद्धताओं में अपने परिवर्तनों की सूची देख सकते हैं स्रोत ट्री में फ़ाइलों की सूची
  2. इसे चुनें और फिर राइट-क्लिक करें ... राइट-क्लिक करें ... रिवर्स फाइल पर क्लिक करें
  3. फिर आप इसे बायीं ओर नीचे की ओर स्थित फ़ाइल स्थिति टैब पर देख सकते हैं, फिर अस्थिर क्लिक करें:

फ़ाइल स्थिति टैब

  1. अपना विज़ुअल स्टूडियो कोड खोलें और अपनी हटाई गई फ़ाइलों को कम करके वापस लौटें
  2. उन सभी के बाद, आप स्रोत पेड़ में अपने अंतिम प्रतिबद्ध में परिणाम देख सकते हैं

यहां छवि विवरण दर्ज करें

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