2010-06-30 14 views
7

2 प्रतिबद्ध बना दिया है (और मैं धक्का दिया नहीं किया है) कर सकते हैं सबसे हाल ही में एक 'है:मैं वापस अपने पिछले में 1 फ़ाइल परिवर्तन कैसे रोल Git, जहां 'कमिट 2' में प्रतिबद्ध

git log -2 
commit 791962d776f66253d656586b097b2677eaa983d1 
Author: michael <[email protected](none)> 
Date: Tue Jun 29 23:20:58 2010 -0700 

    Commit 2 

commit b743075e81f6fe25fe48ddbef2b5e7cc06623533 
Author: michael <[email protected](none)> 
Date: Tue Feb 16 23:09:53 2010 -0800 

    Commit 1 

और मेरे में प्रतिबद्ध 1 b743075e81f6fe25fe48ddbef2b5e7cc06623533, मैं छुआ/फ़ाइलों की एक नंबर बदल गया:

dir1/file1.cpp 
    dir1/file1.h 
    dir1/file2.cpp 
    dir1/file2.h 

मेरे सवालों का है, मैं वापस कैसे रोल कर सकते हैं अपने परिवर्तनों कि मैं dir1 को/file2.cpp, dir1/प्रतिबद्ध की file2.h बनाया 1? और बाकी सब कुछ एक ही रखें?

धन्यवाद।

उत्तर

5

सरल समाधान हो सकता है, अपने नवीनतम प्रतिबद्ध (सिर) से करने के लिए:

  • checkout पुराने संस्करण पर उन दो फ़ाइलें,
  • उन्हें जोड़ने,
  • और उसके बाद के लिए प्रतिबद्ध।
 
    git checkout b743075e81 -- dir1/file2.cpp 
    git checkout b743075e81 -- dir1/file2.h 
    git add dir1/file2.cpp # only if you made additional changes 
    git add dir1/file2.h # only if you made additional changes 
    git commit -m "revert dir1/file2.cpp and dir1/file2.h" 

Chris Johnsen के रूप में टिप्पणी में उल्लेख है:

git checkout pathspecs साथ इंडेक्स अपडेट (pathspecs साथ git reset की तरह) और काम पेड़, इसलिए git add की जरूरत नहीं है जब तक अतिरिक्त परिवर्तन कर रहे हैं चेकआउट के बाद बनाया गया।

+0

यह वास्तव में आपका एकमात्र विकल्प विकल्प है, यदि आप पहले से ही अपने काम को मूल करने के लिए 'गिट पुश' का उपयोग कर चुके हैं। –

+0

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

+0

मैंने 'गिट पुश' नहीं किया है। – michael

0

प्रतिबद्ध हैश और फ़ाइल नाम है जो आप

git reset <commit hash> <filename> 

वापस लौटने के लिए आपकी आवश्यकता उपयोग

git reset b743075e81f6fe25fe48ddbef2b5e7cc06623533 dir1/file2.cpp 

git reset b743075e81f6fe25fe48ddbef2b5e7cc06623533 dir1/file2.h 
+0

यह काम करता है, लेकिन भ्रमित हो सकता है क्योंकि यह केवल इंडेक्स प्रविष्टियों को "रोल करता है", कामकाजी पेड़ नहीं ('गिट चेकआउट पेड़िश - पथस्पेक्स 'के विपरीत जो सूचकांक और काम करने वाले पेड़ दोनों को अपडेट करता है)। –

3

यदि आप के लिए की जरूरत के आधार पर पहले से प्रतिबद्ध फ़ाइल के साथ फ़ाइल में रोल बैक करना उपयोग निम्न आदेश पहले से ही आपके काम को मूल में धकेल दिया है, फिर यहां वर्णित अन्य समाधान (git reset या git checkout का उपयोग करके git commit) आपका एकमात्र विकल्प विकल्प है ।

हालांकि, अगर आप अभी अपने परिवर्तन धक्का दिया नहीं किया है, और आपको लगता है कि फ़ाइलें कभी अंजाम दिया सभी निशान निकालना चाहते हैं, एक इंटरैक्टिव रिबेस एक अच्छा विकल्प है। अपने पिछले दो करता rebase के लिए निम्न आदेश का उपयोग करें:

git rebase --interactive HEAD~2 

एक संपादक, खुल जाएगा अपने दो करता दिखा। आप निम्न को दिखाने के लिए फ़ाइल को संपादित करना चाहते हैं, फिर सहेजें;

edit b743075 Commit 1 
pick 791962d Commit 2 

Git तो एक राज्य है जहां हम संपादित कर सकते हैं (दूसरा बिना छुए) पहली प्रतिबद्ध में हमें जगह देगा: विशेष रूप से, आप edit के लिए अपना पहला प्रतिबद्ध के सामने pick बदलना चाहते हैं।इसे कहते हैं आप git commit --amend साथ प्रतिबद्ध में संशोधन कर सकते हैं, लेकिन हम वास्तव में सिर से पहले प्रतिबद्ध करने के लिए एक रीसेट करते हैं, और यह पूरी तरह से पूर्ववत करना चाहते हैं:

git reset HEAD^ 

यह 1 अपने काम के पेड़ में वापस कमिट से परिवर्तन स्थापित करेंगे। फिर, git add केवल फ़ाइलें आप रखना चाहते हैं, और उन्हें git commit का उपयोग कर फिर से प्रतिबद्ध:

git add dir1/file1.cpp 
git add dir1/file1.h 
git commit -m "Commit 1" 

अंत में, फ़ाइलों को आप अपने काम के पेड़ से रखने के लिए नहीं करना चाहती नष्ट करने के लिए हार्ड रीसेट करते हैं, और खत्म रिबेस:

git reset --hard 
git rebase --continue 

जब रिबेस पूरा हो गया है, अपने भंडार दोनों करता है, लेकिन file2.* फ़ाइलों का कोई निशान होगा।

संबंधित मुद्दे