क्या फ़ाइल का पुराना संस्करण देखने के लिए एक त्वरित Git कमांड है?


1509

वहाँ Git में एक कमांड को देखने के लिए (या तो stdout में फेंक दिया, या में है $PAGERया $EDITOR) एक विशेष फ़ाइल का एक विशेष संस्करण?



यदि आप इस सवाल पर आए हैं क्योंकि आप एक बाइनरी फ़ाइल (उदाहरण के लिए एक छवि) के पुराने संस्करण की जांच करना चाहते हैं, तो पुरानी प्रतिबद्ध के लिए एक चेकआउट करने के लिए बेहतर है, जो आपको देखने की आवश्यकता है उसे देखें, और फिर एचईएडी पर वापस आएं। git checkout <sha1-of-the-commit-you-need>उसके लिए , बाद में,git checkout HEAD
होमेरो एस्मराल्डो

जवाबों:


1730

आप git showरिपॉजिटरी की जड़ से ( ./या ../सापेक्ष पथ के लिए) पथ का उपयोग कर सकते हैं :

$ git show REVISION:path/to/file

REVISIONअपने वास्तविक संशोधन के साथ बदलें (Git प्रतिबद्ध SHA हो सकता है, एक टैग नाम, एक शाखा का नाम, रिश्तेदार का नाम, या Git में एक कमिट की पहचान करने का कोई अन्य तरीका)

उदाहरण के लिए, फ़ाइल का संस्करण <repository-root>/src/main.c4 कमिट्स से पहले देखने के लिए , उपयोग करें:

$ git show HEAD~4:src/main.c

विंडोज के लिए गिट को वर्तमान निर्देशिका के सापेक्ष पथ में भी आगे की ओर स्लैश की आवश्यकता होती है । अधिक जानकारी के लिए, के लिए मैन पेज देखें git-show


5
यह वास्तव में काम नहीं करता है - क्या आपने इसे आज़माया है? "Git show HEAD: path / to / file.c" के लिए, मुझे "अस्पष्ट तर्क" त्रुटि मिलती है।
माइक

2
पूरा रास्ता होना चाहिए, ऊपर से गिट रेपो
रिचैक

20
यदि आप खिड़कियों पर हैं, तो यह एक पथ विभाजक हो सकता है; अगर मैं git शो HEAD: dir \ subdir \ file करता हूं, तो मुझे अस्पष्ट तर्क मिलता है। अगर मैं git शो HEAD: dir / subdir / file करता हूं, तो यह उम्मीद के मुताबिक काम करता है।
मैट मैकिन जूल

12
के बाद आपको जो रास्ता प्रदान करना चाहिए, वह गिट रिपॉजिटरी की जड़ से है। (यह एक जवाब के रूप में नीचे दिया गया था, लेकिन मुझे लगता है कि यह इस जवाब पर एक टिप्पणी के रूप में इरादा था)
मैट्रिक्स

9
यदि आप इसे विम विभाजन में देखना चाहते हैं ताकि वे एक साथ स्क्रॉल करें, मैंने एक छोटा ब्लॉग पोस्ट लिखा है जिसमें दिखाया गया है कि यह कैसे करना है।
फ्लाविउ

257

तिथि के अनुसार ऐसा करना इस तरह दिखता है:

git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt

ध्यान दें कि HEAD@{2013-02-25}इस रिपॉजिटरी में "जहां HEAD 2013-02-25 था" ( रिफ्लग का उपयोग करते हुए ), "इतिहास में इस शाखा में 2013-02-25 से पहले अंतिम प्रतिबद्ध नहीं"।


5
बहुत बढ़िया। गितुब जाने और कमिट देखने के बजाय मेरा बहुत समय बचता है।
फेजर खान

फ़ाइल पथ पर "डॉट" मेरा मुद्दा था। धन्यवाद!
तोमाश्राद

5
इस आदेश के साथ उपयोगी है masterबजाय HEAD@{2013-02-25}, यदि आप एक शाखा पर हैं
funroll

1
क्या आप समय, ला ला शामिल कर सकते हैं git log --since='2016-04-28 23:59:59 +0100'?
dumbledad

7
तथ्य यह है कि इस सिंटैक्स का उपयोग रिफ्लॉग महत्वपूर्ण है और इसे दृढ़ता से हाइलाइट किया जाना चाहिए, क्योंकि रिफ्लॉग में सभी कमिट नहीं होते हैंब्लॉग
ऐलिस हेटन

113

यदि आपको GUI पसंद है, तो आप gitk का उपयोग कर सकते हैं:

  1. के साथ gitk शुरू करें:

    gitk /path/to/file
    
  2. विवरण या तिथि के अनुसार, स्क्रीन के ऊपरी भाग में संशोधन चुनें। डिफ़ॉल्ट रूप से, स्क्रीन का निचला हिस्सा उस संशोधन के लिए भिन्न दिखाता है, ("पैच" रेडियो बटन के अनुरूप)।

  3. चयनित संशोधन के लिए फाइल देखने के लिए:

    • "पेड़" रेडियो बटन पर क्लिक करें। यह उस संशोधन में फ़ाइल ट्री की जड़ दिखाएगा।
    • अपनी फ़ाइल के लिए नीचे ड्रिल करें।

7
यह भी बाघ के साथ काम करता है , जो एक शाप देने वाला रेपो दर्शक है।
मैथ्यू जी

1
@ पाओल स्लोकम: हो सकता है क्योंकि यह कमांड एक पारंपरिक कमांड नहीं है, बिल्ट-इन-गेट नहीं है। मुझे लगता है कि यह कमांड केवल विंडोज के लिए काम करती है।
Envil

ध्यान दें कि यह केवल तभी काम करता है जब आप अपने गिट रिपॉजिटरी की जड़ से शुरू करते हैं।
मार्क

यदि आप गिट के साथ एक निश्चित संशोधन के खिलाफ जांच करना चाहते हैं तो आप इस शॉर्टकट का भी उपयोग कर सकते हैं gitk REVISION /path/to/file:। यह तब काम आ सकता है जब आप उदाहरण के लिए एक निश्चित संस्करण के खिलाफ जांच करना चाहते हैं।
क्रिश्चियन।

89

आप कमांड के साथ एक commit hash(अक्सर भी कहा जाता है commit ID) निर्दिष्ट कर सकते हैं ।git show


संक्षेप में

git show <commitHash>:/path/to/file


क्रमशः

  1. दी गई फ़ाइल के लिए सभी परिवर्तनों का लॉग दिखाएं git log /path/to/file
  2. दिखाए गए परिवर्तनों की सूची में, यह इस commit hashतरह दिखाता है commit 06c98...(06c98 ... प्रतिबद्ध हैश होना)
  3. की प्रतिलिपि बनाएँ commit hash
  4. चरण 3 और चरण 1 के git show <commitHash>:/path/to/fileउपयोग से कमांड चलाएँ ।commit hashpath/to/file

नोट:./ जब एक रिश्तेदार पथ निर्दिष्ट करना जोड़ना महत्वपूर्ण लगता है, अर्थात git show b2f8be577166577c59b55e11cfff1404baf63a84:./flight-simulation/src/main/components/nav-horiz.html


1
यदि आपको फाइल करने का रास्ता नहीं पता है, तो git show <SHA1> --name-onlyइसे पाने के लिए उपयोग करें।
टिआना

यह कमांड ऑप - यहां तक ​​कि ऑटो मेमोरी से पूरा होता है - एक डिलीट डायरेक्टरी पर टेस्ट किया जाता है ... उस जीजी से ज्यादा ऑप्शन नहीं पा सकते हैं
treyBake

43

के अलावा जिम Hunziker के जवाब है,

आप संशोधन के रूप में फ़ाइल को निर्यात कर सकते हैं,

git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt > old_fileInCurrentDirectory.txt

उम्मीद है की यह मदद करेगा :)


23

किसी फ़ाइल के पुराने संशोधन के साथ अंतर को जल्दी से देखने के लिए:

git show -1 filename.txt > फ़ाइल के अंतिम संशोधन के खिलाफ तुलना करने के लिए

git show -2 filename.txt > दूसरे अंतिम संशोधन के खिलाफ तुलना करने के लिए

git show -3 fielname.txt > अंतिम 3 अंतिम संशोधन के खिलाफ तुलना करने के लिए


18
वे कमांड मेरे लिए वर्तमान संस्करण के साथ अंतर दिखाते हैं लेकिन पूरी फ़ाइल नहीं दिखाते हैं।
जीन पॉल

18

git log -pआपको केवल कमिट लॉग ही नहीं दिखाएगा, बल्कि प्रत्येक कमिट (मर्ज कमिट को छोड़कर) का विस्तार भी करेगा। फिर आप दबा सकते हैं /, फ़ाइल नाम दर्ज करें और दबाएं enter। प्रेस करें nया pअगली / पिछली घटना पर जाएं। इस तरह आप न केवल फ़ाइल में बदलाव देखेंगे, बल्कि प्रतिबद्ध जानकारी भी देखेंगे।


3
लगता है कि git log -pmमर्ज कमिट भी दिखाएगा।
sanbor

2
आप git log -p -- filename.txtइतिहास को केवल वांछित फ़ाइल तक सीमित करने के लिए भी चल सकते हैं ।
जीन पॉल

3

आप एक स्क्रिप्ट का उपयोग इस तरह कर सकते हैं कि किसी फाइल के सभी संस्करणों को अलग-अलग फाइलों में डंप करें:

जैसे

git_dump_all_versions_of_a_file.sh path/to/somefile.txt

इसी तरह के एक और प्रश्न के उत्तर के रूप में यहां स्क्रिप्ट प्राप्त करें


1
git_root, git_log_shortऔर git_log_message_for_commitगायब हैं।
मोगसी

अच्छी पकड़! मैंने इस उत्तर को 2 अलग-अलग स्थानों पर पोस्ट किया, और बस इस एक को हटा दिया और दूसरे से जुड़ा, जहां लोगों ने मुझे इस बारे में पहले बताया ... धन्यवाद @mogsie!
ब्रैड पार्क्स

यह स्क्रिप्ट बहुत उपयोगी है!
XMAN

3

WAY 1: (मैं इस तरह से पसंद करता हूं)

  1. इसके साथ कमिट आईडी खोजें :git reflog
  2. फाइलों को कमिट से लिस्ट करें git diff-tree --no-commit-id --name-only -r <commitHash>

उदाहरण: git diff-tree --no-commit-id --name-only -r d2f9ba4// "d2f9ba4", "1." से आईडी है

  1. कमांड के साथ आवश्यक फ़ाइल खोलें:

git show <commitHash>:/path/to/file

उदाहरण: git show d2f9ba4:Src/Ext/MoreSwiftUI/ListCustom.swift// "Src / ..." "2." से फ़ाइल पथ है

रास्ता 2:

  1. इसके साथ कमिट आईडी खोजें :git reflog
  2. इस प्रतिबद्ध के लिए हार्ड रीसेट करें: git reset --hard %commit ID%

जीआईटी रीसेट - भार c14809fa

  1. कोई भी अनावश्यक परिवर्तन करें और आवश्यक शाखा में नए सिरे से प्रतिबद्ध करें :)

0

किसी दिए गए संशोधन से कई फ़ाइलों को लाने के लिए हेल्पर

मर्ज संघर्षों को हल करने की कोशिश करते समय, यह सहायक बहुत उपयोगी है:

#!/usr/bin/env python3

import argparse
import os
import subprocess

parser = argparse.ArgumentParser()
parser.add_argument('revision')
parser.add_argument('files', nargs='+')
args = parser.parse_args()
toplevel = subprocess.check_output(['git', 'rev-parse', '--show-toplevel']).rstrip().decode()
for path in args.files:
    file_relative = os.path.relpath(os.path.abspath(path), toplevel)
    base, ext = os.path.splitext(path)
    new_path = base + '.old' + ext
    with open(new_path, 'w') as f:
        subprocess.call(['git', 'show', '{}:./{}'.format(args.revision, path)], stdout=f)

गिटहब ऊपर

उपयोग:

git-show-save other-branch file1.c path/to/file2.cpp

परिणाम: निम्न में फ़ाइलों के वैकल्पिक संस्करण हैं:

file1.old.c
path/to/file2.old.cpp

इस तरह, आप फ़ाइल एक्सटेंशन को रखते हैं ताकि आपके संपादक को शिकायत न हो, और आसानी से पुरानी फ़ाइल को नए के बगल में ढूंढा जा सके।


यदि आप एक बेहतर क्रियान्वयन के साथ एक ही इंटरफ़ेस प्राप्त कर सकते हैं, तो #MickeyPerlstein, मैं सभी कान हूँ।
सिरो सेंटिल्ली 冠状 病毒 iro i 法轮功 '24

शायद मुझे समझ में नहीं आता (और यदि ऐसा है, तो मेरी माफी) लेकिन क्या यह सिर्फ इतना नहीं है: "git show version: /। path> new_athath"?
मिकी पेरेलस्टीन

@MickeyPerlstein हाय, हाँ, मेरा कमांड उस CLI को जेनरेट करता है, लेकिन यह कई फाइलों पर लूप करता है और इनपुट से आउटपुट नाम पैदा करता है, इसलिए आपको बहुत ज्यादा टाइप करने की जरूरत नहीं है। बेशक कुछ भी क्रांतिकारी नहीं है, लेकिन सुविधाजनक है।
सिरो सेंटिल्ली 冠状 病毒 iro 事件 法轮功 '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.