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


831

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

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

git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt

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

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


73
यहाँ कुंजी: git show(अनछुए) एक बृहदान्त्र के साथ विभिन्न वाक्यविन्यास का उपयोग करता है। git show 2c7cf:my_file.txt
स्टीव बेनेट

4
आगे स्पष्ट करने के लिए, ऊपर दिए गए आदेश में दो अलग-अलग ऑब्जेक्ट, एक संशोधन और एक फ़ाइल दिखाने के लिए git पूछ रहा है। नीचे दिए गए स्वीकृत उत्तर, जो दो मदों के बीच एक बृहदान्त्र का उपयोग करता है, एक विशिष्ट संशोधन के लिए एक विशिष्ट फ़ाइल के लिए पूछ रहा है।
१२:१२ बजे झूलक



Checat के पास एक महत्वपूर्ण टिप्पणी है, उन लोगों के लिए जो कुछ फ़ाइल में निर्यात की गई सामग्री चाहते हैं। आपको कुछ इस तरह की आवश्यकता है: git show {sha}: my_file.txt> old_my_file.txt
ormurin

जवाबों:


743

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

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

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

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

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

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

git show HEAD^^:./test.py

)


Git 2.23+ (अगस्त 2019) के साथ, आप यह भी उपयोग कर सकते हैं git restore जो भ्रमित कमांड को बदल देता हैgit checkout

git restore -s <SHA1>     -- afile
git restore -s somebranch -- afile

यह काम कर रहे पेड़ पर केवल "स्रोत" ( -s) प्रतिबद्ध SHA1 या शाखा में मौजूद फ़ाइल को पुनर्स्थापित करेगा somebranch
सूचकांक को भी बहाल करने के लिए:

git restore -s <SHA1> -SW -- afile

( -SW: के लिए कम --staged --worktree)


Git1.5.x से पहले, यह कुछ प्लंबिंग के साथ किया गया था:

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

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

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

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


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

देखें प्रतिबद्ध 3214594 , प्रतिबद्ध 7bcf341 , (09 सितं, 2016) के लिए प्रतिबद्ध 7bcf341 (09 सितं, 2016), और b9e62f6 प्रतिबद्ध , प्रतिबद्ध 16dcc29 द्वारा (24 अगस्त 2016) जोहानिस Schindelin ( dscho)
(द्वारा विलय Junio सी Hamano - gitster- में प्रतिबद्ध 7889ed2 , 21 सितं, 2016)

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

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

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

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

जेफ किंग ( ) द्वारा देखें प्रतिबद्ध cc0ea7c (21 सितंबर 2017 )(द्वारा विलय Junio सी Hamano - - में प्रतिबद्ध bfbc2fc , 28 सितं, 2017)peff
gitster


ध्यान दें कि पिछली सामग्री से किसी फ़ाइल को ओवरराइड / रिप्लेस करने के लिए , आपको भ्रमित करने वाली git checkoutकमांड का उपयोग नहीं करना चाहिए , लेकिन git restore(२.२३+, अगस्त २०१ ९)

git restore -s <SHA1> -- afile

यह काम कर रहे पेड़ पर केवल "स्रोत" ( -s) SHA1 के रूप में मौजूद फ़ाइल को पुनर्स्थापित करेगा ।
सूचकांक को भी बहाल करने के लिए:

git restore -s <SHA1> -SW -- afile

( -SW: के लिए कम --staged --worktree)


6
@ ऑस्कर चूंकि git showअनिवार्य रूप से stdout(मानक आउटपुट) पर सामग्री को डंप करता है , आप बस उस आउटपुट को किसी भी फ़ाइल में पुनर्निर्देशित कर सकते हैं जो आप चाहते हैं ( tldp.org/LDP/abs/html/io-redirection.html )।
वॉन

8
git checkout [branch | revision] filepathसही आदेश है
गौई

12
@ गौई, लेकिन आपकी फ़ाइल को किसी अन्य संस्करण द्वारा ओवरराइडgit checkout करेगा , जिसका विरोध किया गया है , जो आपको एक अलग नाम के तहत इसे सहेजने की अनुमति देता है, ताकि आप दोनों (वर्तमान संस्करण और पुराने संस्करण) प्राप्त कर सकें और देख सकें । यह इस सवाल से स्पष्ट नहीं है कि क्या ओपी अपने वर्तमान संस्करण को पुराने से बदलना चाहता है । git show
वॉन

9
मैं यह नोट करना चाहूंगा कि ^^^आम तौर पर ~~~या, बेहतर, के रूप में भी लिखा जा सकता है ~3। टिल्ड का उपयोग करने से कुछ शेल (उदाहरण के लिए, zsh) के फ़ाइल नाम मिलान को ट्रिगर नहीं करने का भी फायदा होता है।
एरिक ओ लेबिगॉट

2
मेरे पास जाँच करने के लिए पर्याप्त पुराना git नहीं है: क्या पहले से 1.5.x git rev-parseहैंडल rev:pathसिंटैक्स है? (अधिक नया Git आप कर सकते हैं में git cat-file -p $REV:path। हालांकि, git showनिर्देशिका पथ के लिए और साथ ही, काम करता है तो यह सिर्फ कम नहीं है, यह आम तौर पर करीब एक चाहता है के लिए है।)
torek

510

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

git checkout 08618129e66127921fbfcbc205a06153c92622fe path/to/file.txt

या

git checkout mybranchname path/to/file.txt

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


4
सबसे सरल समाधान और यह वह है जो git-checkout के लिए डिज़ाइन किया गया है - pathname निर्दिष्ट करने का अर्थ है कि केवल मेल खाने वाली फ़ाइल की जाँच की जाती है। Git-checkout मैन पेज से: git checkout master ~ 2 Makefile
RichVel

1
फिर, इस कमांड को चलाने से पहले आप पिछली स्थिति में कैसे लौटेंगे?
फ्लिंट

@ यदि आप HEAD राज्य से आ रहे हैं तो यह git चेकआउट HEAD - [पूर्ण पथ] के समान सरल होगा।
टियागो एस्पिन्हा

72
ध्यान दें कि यह उस पथ में मौजूदा फ़ाइल को अधिलेखित करता है, जबकि git show SHA1:PATHसमाधान केवल स्टडआउट करने के लिए प्रिंट करता है।
फ्लिम

अच्छा! मैं इसे देखकर यह पता नहीं लगा सका git help checkout। मुझे एक निश्चित तिथि के रूप में एक उपनिर्देशिका की जांच करनी थी, और इस दृष्टिकोण का उपयोग करके, मैं इस वाक्यविन्यास को प्राप्त कर सकता था:git checkout @{YYYY-MM-DD} sub-dir
haridsv

150

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

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

7
पूर्ण पथ होना आवश्यक नहीं है। रूट रूट डायरेक्टरी से निकलने वाले (जो लोग आए, वे git show --name-onlyभी काफी हैं
मोहसिन

7
एर्म, रिपॉजिटरी रूट से पूर्ण पथ। मैंने जो उदाहरण दिया है, उस पर एक बेहतर नज़र डालें। "पूर्ण" से पहले कोई अग्रणी स्लैश नहीं है।
मिलन बाबूकोव

7
FYI करें, यदि आप किसी सबडिर में हैं, तो आप उपयोग कर सकते हैं ।/filename.ext सफलतापूर्वक भी।
ट्रैवलर

मुझे लगता है कि अगर full/repo/path/toआप कोशिश कर रहे हैं, तो यह बिंदु है :git show 27cf8e84:my_file.txt आपको एक संदेश दिया जाएगा जैसे: घातक: पथ 'पूर्ण / रेपो / पथ / से / my_file.txt' मौजूद है, लेकिन 'my_file.txt' नहीं । क्या आपका मतलब '27cf8e84: full / repo / path / to / my_file.txt' aka '27cf8e84 :/ my_file.txt' है? यह ऐसा है, Git सीधे मदद कर सकता है, लेकिन यहाँ पांडित्य होना चुना गया।
एड रान्डेल

101

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

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 को revision 27cf8e से my_file.txt.OLD नाम से एक नई फ़ाइल के रूप में बचाएगा।

इसका परीक्षण Git 2.4.5 के साथ किया गया था।

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

उदाहरण:

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

1
अतिरिक्त जानकारी: आप
गेट

@xotix धन्यवाद। मुझे एक विशेष फ़ाइल का उपयोग करके सभी एचएएसएच इतिहास मिलाgit log file/path/name.ext
श्रीराम कन्नन

11

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

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

8

और इसे अच्छी तरह से एक फ़ाइल (विंडोज पर कम से कम) में डंप करें - गिट बैश:

$ echo "`git show 60d8bdfc:src/services/LocationMonitor.java`" >> LM_60d8bdfc.java

"उद्धरण की जरूरत है तो यह नई-पंक्तियों को बरकरार रखता है।


अच्छा है। +1। git showउपर्युक्त वाक्य विन्यास का अच्छा जोड़ ।
VonC

23
मैं वास्तव में समझ नहीं पा रहा हूँ कि आप उद्धरणों के साथ या उसके बिना इको का उपयोग क्यों करेंगे। और मुझे समझ नहीं आ रहा है कि आप आउटपुट पुनर्निर्देशन के परिशिष्ट रूप को क्यों चाहते हैं। क्या केवल लिखना बेहतर नहीं होगा: git show 60d8bdfc: src / services / LocationMonitor.java> LM_60d8bdfc.java यदि किसी कारण से आप वास्तव में डॉस-स्टाइल लाइन पर जोर देना चाहते हैं, तो आप इसे unix2dos के माध्यम से पाइप कर सकते हैं। लेकिन मैंने विंडोज पर डॉस लाइन-एंडिंग को बनाए रखने के लिए इसे कभी भी कम से कम उपयोगी नहीं पाया है, क्योंकि नोटपैड के अलावा किसी भी टेक्स्ट टूल को मैंने विंडोज हैंडल यूनिक्स-स्टाइल लाइनों पर इस्तेमाल किया है।
sootsnoot

4
git show 60d8bdfc: src / services / LocationMonitor.java >> LM_60d8bdfc.java ने मेरे लिए काम किया।
मिकी ६६

@ माइक: आप खिड़कियों पर हैं?
Mr_and_Mrs_D

2
दोहरे उद्धरण चिह्नों का उपयोग न करें क्योंकि यदि आपकी फ़ाइल वर्ण जो शेल चर यानी $ LANG की तरह दिखती है, तो उसे बदल दिया जाएगा। @ LưuV LnhPhúc सेवर है। यह भी प्रयोग न करें >> यह फ़ाइल को जोड़ देगा यदि यह अस्तित्व में है और त्रुटियों के लिए नेतृत्व कर सकता है
पीड़ा

3

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

git diff --name-only --diff-filter=D $commit~1 $commit | xargs git checkout $commit~1

1
git checkout {SHA1} -- filename

यह कमांड विशिष्ट फ़ाइल से कॉपी की गई फ़ाइल प्राप्त करती है।


-2

चेक-आउट पिछली कमिट और कॉपी करने वाली फ़ाइल के माध्यम से एक पिछली प्रतिबद्ध से फ़ाइल प्राप्त करें।

  • ध्यान दें कि आप किस शाखा में हैं: गिट शाखा
  • आप चाहते हैं कि पिछली प्रतिबद्धता की जाँच करें: git checkout 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
  • उस फ़ाइल की प्रतिलिपि बनाएँ जिसे आप एक अस्थायी स्थान पर चाहते हैं
  • आपके द्वारा शुरू की गई शाखा की जाँच करें: git checkout theBranchYouNoted
  • एक अस्थायी स्थान पर रखी गई फ़ाइल में प्रतिलिपि बनाएँ
  • अपने परिवर्तन के लिए प्रतिबद्ध करें: git commit -m "added file ?? from previous commit"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.