किसी विशेष फ़ाइल को एक विशिष्ट पुनरीक्षण के लिए रीसेट करना या वापस करना Git का उपयोग करना है?


Answers

आप 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>
Question

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

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




git checkout -- foo

वह foo को सिर में रीसेट करेगा आप भी कर सकते हैं:

git checkout HEAD^ foo

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




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 चेकआउट git rebase master

... उन शाखाओं की शाखा की जांच करें, जिन्हें आप master शाखा में आवेदन करना चाहते हैं rebase कमांड कमांड को <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>



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

git show $revision:$file > $file

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

git show $revision:$file

या

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

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

और इससे भी ज्यादा अजीब:

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



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

git checkout HEAD^1 path/to/file

या

git checkout HEAD~1 path/to/file

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

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

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




git-aliases, awk और शैल-कार्य बचाव में!

git prevision <N> <filename>

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

git prevision -1 x/y/z.c

कैसे git prevision काम करता है?

अपने gitconfig में निम्न जोड़ें

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

मूल रूप से कमांड

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

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




यदि आप Git Extensions का उपयोग कर रहे हैं और आप केवल फ़ाइल के लिए माता-पिता की प्रतिबद्धता को वापस करना चाहते हैं, तो आप उस प्रतिबद्धता का चयन कर सकते हैं, जिसमें वे बदलाव शामिल हैं जिन्हें आप वापस करना चाहते हैं, फिर विवरण फलक में 'डिफ' टैब का चयन करें, राइट क्लिक करें जिस फ़ाइल को आप वापस करना चाहते हैं, फिर 'फाइल को रीसेट करें' ...., फिर 'ए' (अभिभावक)




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

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




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

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

$ git checkout $A file

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

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

$ git revert $B

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




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

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

के साथ शुरू:

$ git log

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

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

$ git reset --hard SHA1_HASH

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




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

git checkout [commit-ref] [filename]

यह आपके कामकाजी डायरेक्टरी में पुराना संस्करण रखेगा और वहां से आप ऐसा कर सकते हैं यदि आप चाहते हैं




git revert <hash>

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

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




जीआईटी चेकआउट रिफ | कमांडहाश - फाइलपाथ

जैसे

git checkout HEAD~5 -- foo.bar
or 
git checkout 048ee28 -- foo.bar





Links