गिट रिपॉजिटरी के इतिहास से पूरी निर्देशिका को कैसे पुनर्स्थापित करें?


91

मैं अपने गिट रिपॉजिटरी के इतिहास से एक पूरी निर्देशिका (पुनरावर्ती) को पुनर्स्थापित करना चाहूंगा।

केवल 1 शाखा (मास्टर) है।

मैं उस कमेटी को जानता हूं जिसमें त्रुटियां शामिल थीं।

क्या मैं निर्देशिका की स्थिति को पुनर्स्थापित करने के लिए माता-पिता की sha1 हैश का उपयोग कर सकता हूं क्योंकि यह त्रुटियों को शामिल करने से पहले था?

मैंने कुछ इस तरह से सोचा:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 path/to/the/folder/

लेकिन यह काम नहीं करता।


7
संशोधन और रास्तों के बीच '-' को जोड़ने का प्रयास करें:git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/
कार्लोस कैंपड्रोस

इससे मदद मिली। आपका बहुत बहुत धन्यवाद।
mostwanted

1
@ CarlosCampderrós एक वास्तविक उत्तर के रूप में लिखें और किसी और के करने से पहले अपने 15 बिंदुओं को इकट्ठा करें;)
ralphtheninja

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

2
एक सामान्य संकेत के रूप में, "यह काम नहीं किया" बहुत उपयोगी नहीं है। हमें बताएं कि यह काम क्यों नहीं किया गया, आदर्श रूप से त्रुटि आउटपुट के साथ (छंटनी की गई तो यह बहुत लंबा है)।
me_and

जवाबों:


156

संशोधन और रास्तों के बीच '-' जोड़ने का प्रयास करें:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/ 

और यदि आप पिछली कमेटी से डायरेक्टरी वसूल करना चाहते हैं, तो आप हैश की जगह हैश ~ 1 लगा सकते हैं, उदाहरण के लिए:

git checkout HEAD~1 -- path/to/the/folder/ 

एक ही कमांड, लगभग अलग उद्देश्य: stackoverflow.com/questions/953481/…
cregox

18
हालांकि एक समस्या है: यदि निर्देशिका अभी भी मौजूद है तो ओपी निर्दिष्ट नहीं करता है। किसी मौजूदा निर्देशिका को कमिट की स्थिति में पुनर्स्थापित करने के लिए, निर्देशिका की सामग्री को पहले हटा दिया जाना चाहिए। अन्य मामलों में, पुरानी प्रतिबद्ध में मौजूद मौजूदा फ़ाइलों को हटाया नहीं जाएगा।
अल्बर्टो

7
+1 @Alberto निश्चित रूप से सहमत हैं। मैंने rm -Rf path/to/the/folderतब किया था git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/- परिणाम: उस पथ में बिल्कुल वैसी ही फाइलें थीं जैसा कि उस कमिट में, कोई अंतर नहीं था और इस फाइल के बाद कोई अतिरिक्त फाइल नहीं बनाई गई थी। जो मुझे चाहिए।
उपचार

2
क्या करता --है?
रे फॉस

2
@RayFoss यह बताता है कि निम्नलिखित पैरामीटर फाइलें हैं (अन्यथा वे एक प्रतिबद्ध हैश, शाखा या कुछ और के साथ भ्रमित हो सकते हैं)। आमतौर पर इनकी जरूरत नहीं होती है, लेकिन इन्हें लगाने में कोई तकलीफ नहीं होती है
कार्लोस कैंपडरो

3

ऐसा करने के दो आसान तरीके हैं:

यदि प्रतिबद्ध में केवल त्रुटियों को शामिल किया गया था, git revertतो इसके प्रभावों को पलटने के लिए उपयोग करें।

यदि नहीं, तो आसान रास्ता यह है:

  1. git checkout 348…
  2. cp -a path/to/the/folder ../tmp-restore-folder
  3. git checkout HEAD # or whatever
  4. rm -rf path/to/the/folder
  5. mv ../tmp-restore-folder path/to/the/folder
  6. git add path/to/the/folder
  7. git commit -m "revert …"

1

यदि आप बस करते हैं git checkout <SHA-ID>तो यह अस्थायी रूप से आपको उस sha- कमिट में ले जाएगा।

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


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