git - गिट में विशिष्ट संशोधन से एक फ़ाइल को कैसे पुनर्प्राप्त करें?




single-file (6)

मेरे पास एक गिट भंडार है और मैं देखना चाहता हूं कि कुछ फाइलें कुछ महीने पहले कैसे देखी गईं। मुझे उस तारीख में संशोधन मिला, यह है: 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 । मुझे यह देखने की ज़रूरत है कि एक फ़ाइल किस तरह दिखती है और उसे फ़ाइल में भी सहेजती है।

मैं gitk का उपयोग कर फ़ाइल देखने में कामयाब रहा, लेकिन इसमें इसे सहेजने का विकल्प नहीं है। मैंने कमांड लाइन टूल्स के साथ प्रयास किया, मुझे सबसे नज़दीक मिला:

git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt

हालांकि, यह आदेश एक diff दिखाता है, न कि फ़ाइल सामग्री। मुझे पता है कि मैं बाद में PAGER=cat तरह कुछ उपयोग कर सकता हूं और फ़ाइल को आउटपुट रीडायरेक्ट कर सकता हूं, लेकिन मुझे नहीं पता कि वास्तविक फ़ाइल सामग्री कैसे प्राप्त करें।

असल में, मैं svn बिल्ली की तरह कुछ ढूंढ रहा हूँ।


अपना जवाब पूरा करने के लिए, वाक्यविन्यास वास्तव में है

git show object
git show $REV:$FILE
git show somebranch:from/the/root/myfile.txt
git show HEAD^^^:test/test.py

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

  1. शाखा का नाम (जैसा कि ash द्वारा suggested गया है)
  2. ^ पात्रों की HEAD + x संख्या
  3. दिए गए संशोधन के SHA1 हैश
  4. दिए गए SHA1 हैश के पहले कुछ (शायद 5) वर्ण

युक्ति यह याद रखना महत्वपूर्ण है कि " git show " का उपयोग करते समय, हमेशा भंडार की जड़ से पथ निर्दिष्ट करें , न कि आपकी वर्तमान निर्देशिका स्थिति।

(हालांकि माइक मोरेर्टी ने उल्लेख किया है कि कम से कम 1.7.5.4 के साथ, आप पथ की शुरुआत में " ./ " डालकर एक सापेक्ष पथ निर्दिष्ट कर सकते हैं - उदाहरण के लिए:

git show HEAD^^:./test.py

)

Git1.5.x से पहले, यह कुछ नलसाजी के साथ किया गया था:

git ls-tree <rev>
एक प्रतिबद्धता के भीतर एक या अधिक 'ब्लॉब' वस्तुओं की एक सूची दिखाएं

git cat-file blob <file-SHA1>
बिल्ली को एक फ़ाइल के रूप में एक विशिष्ट संशोधन (svn बिल्ली के समान) के भीतर किया गया है। किसी दिए गए फ़ाइल-sha1 के मान को पुनर्प्राप्त करने के लिए गिट एलएस-पेड़ का उपयोग करें

git cat-file -p $(git-ls-tree $REV $file | cut -d " " -f 3 | cut -f 1)::

git-ls-tree $ REV में $ फ़ाइल के लिए ऑब्जेक्ट आईडी सूचीबद्ध करता है, यह आउटपुट से बाहर हो जाता है और गिट-बिल्ली-फ़ाइल के लिए तर्क के रूप में उपयोग किया जाता है, जिसे वास्तव में गिट-बिल्ली-ऑब्जेक्ट कहा जाना चाहिए, और बस डंप उस वस्तु को stdout करने के लिए।

नोट: गिट 2.11 (क्यू 4 2016) के बाद से, आप git cat-file आउटपुट में एक सामग्री फ़िल्टर लागू कर सकते हैं!

32145 9 4 प्रतिबद्ध करें , 7bcf341 (09 सितंबर 2016) प्रतिबद्ध करें , 7bcf341 (09 सितंबर 2016) प्रतिबद्ध करें , और b9e62f6 प्रतिबद्ध करें , जोहान्स dscho ( dscho ) द्वारा 16 डीसीसी 2 9 (24 अगस्त 2016) प्रतिबद्ध करें
( gitster सी gitster द्वारा विलय - gitster - प्रतिबद्ध 7889ed2 , 21 सितंबर 2016)

cat-file : समर्थन --textconv / --filters बैच मोड में --filters

भले ही " git hash-objects ", जो ऑन-फाइल सिस्टम डेटा स्ट्रीम लेने के लिए एक उपकरण है और इसे गिट ऑब्जेक्ट स्टोर में डाल दिया गया है, "बाहरी-से-गिट" रूपांतरणों को निष्पादित करने की अनुमति है (उदाहरण के लिए अंत- लाइन रूपांतरण और क्लीन-फ़िल्टर का उपयोग), और इसकी सुविधा डिफ़ॉल्ट रूप से शुरुआती दिनों से थी, इसके रिवर्स ऑपरेशन " git cat-file ", जो गिट ऑब्जेक्ट स्टोर से ऑब्जेक्ट लेता है और खपत के लिए बाहरी होता है बाहरी दुनिया में, "गिट-टू-आउट-वर्ल्ड" चलाने के लिए समकक्ष तंत्र की कमी थी

git config diff.txt.textconv "tr A-Za-z N-ZA-Mn-za-m <"
git cat-file --textconv --batch

नोट: " git cat-file --textconv " ने हाल ही में (2017) segfaulting शुरू किया, जिसे गिट 2.15 (Q4 2017) में ठीक किया गया है

जेफ किंग ( peff ) द्वारा cc0ea7c (21 सितंबर 2017) को प्रतिबद्ध देखें।
( gitster सी gitster द्वारा विलय - gitster - प्रतिबद्ध बीएफबीसी 2 एफसी , 28 सितंबर 2017)


आपको फ़ाइल को पूरा पथ प्रदान करने की आवश्यकता है:

git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:full/repo/path/to/my_file.txt

पिछले प्रतिबद्धता की जांच और फ़ाइल की प्रतिलिपि बनाकर पिछली प्रतिबद्धता से फ़ाइल प्राप्त करें।

  • ध्यान दें कि आप किस शाखा पर हैं: गिट शाखा
  • पिछली प्रतिबद्धता को चेकआउट करें जो आप चाहते हैं: git checkout 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
  • उस फ़ाइल की प्रतिलिपि बनाएँ जिसे आप अस्थायी स्थान पर चाहते हैं
  • जिस शाखा से आपने शुरू किया था उसे git checkout theBranchYouNoted : git checkout theBranchYouNoted
  • आपके द्वारा अस्थायी स्थान पर रखी गई फ़ाइल में कॉपी करें
  • गिट में अपना परिवर्तन प्रतिबद्ध करें: git commit -m "added file ?? from previous commit"

यदि आप पिछली प्रतिबद्धता या किसी दूसरी शाखा से फ़ाइल की सामग्री के साथ अपनी वर्तमान शाखा में किसी फ़ाइल की सामग्री को प्रतिस्थापित / ओवरराइट करना चाहते हैं, तो आप इन आदेशों के साथ ऐसा कर सकते हैं:

git checkout 08618129e66127921fbfcbc205a06153c92622fe path/to/file.txt

या

git checkout mybranchname path/to/file.txt

आपको वर्तमान शाखा में प्रभावी होने के लिए उन परिवर्तनों को तब करना होगा।


लिखने का सबसे आसान तरीका है:

git show HASH:file/path/name.ext > some_new_name.ext

कहा पे:

  • हैश गिट संशोधन एसएचए 1 हैश नंबर है
  • फ़ाइल / पथ / name.ext उस फ़ाइल का नाम है जिसे आप ढूंढ रहे हैं
  • some_new_name.ext पथ और नाम है जहां पुरानी फ़ाइल सहेजी जानी चाहिए

उदाहरण:

git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:my_file.txt > my_file.txt.OLD

यह my_file.txt.OLD नाम के साथ एक नई फ़ाइल के रूप में my_file.txt को संशोधन b0d78b4 से सहेज देगा

जीआईटी 2.4.5 के साथ परीक्षण किया गया

यदि आप हटाए गए फ़ाइल को पुनर्प्राप्त करना चाहते हैं तो आप HASH~1 (निर्दिष्ट HASH से पहले एक प्रतिबद्ध) का उपयोग कर सकते हैं।

उदाहरण:

git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8~1:deleted_file.txt > deleted_file.txt

विंडोज़ में, गिट बैश के साथ:

  • अपने कार्यक्षेत्र में, उस फ़ाइल में डीआईआर बदलें जहां आपकी फ़ाइल रहता है
  • git show cab485c83b53d56846eb883babaaf4dff2f2cc46:./your_file.ext > old.ext







single-file