Bir dosyanın eski sürümünü görmek için hızlı Git komutu var mı?


1509

Git'te belirli bir dosyanın belirli bir sürümünü ( stdout'a ya da $PAGERveya içine $EDITOR) görmek için bir komut var mı ?



Bir ikili dosyanın (örneğin bir görüntü) eski bir sürümünü kontrol etmek istediğiniz için bu soruya geldiyseniz, eski taahhüdün bir kontrolünü yapmak daha iyi, ne görmeniz gerektiğini görün ve ardından HEAD'e geri dönün. Bunun için git checkout <sha1-of-the-commit-you-need>, sonradan,git checkout HEAD
Homero Esmeraldo

Yanıtlar:


1730

Sen kullanabilirsiniz git show(depo kökünden bir yol ile ./ya da ../göreli pathing için):

$ git show REVISION:path/to/file

REVISIONGerçek düzeltmenizle değiştirin (Git taahhüdü SHA'sı, etiket adı, şube adı, göreli taahhüt adı veya Git'teki taahhüdü tanımlamanın başka bir yolu olabilir)

Örneğin, <repository-root>/src/main.c4 işlemden önceki dosya sürümünü görüntülemek için şunu kullanın:

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

Windows için Git , geçerli dizine göre yollarda bile eğik çizgi gerektirir . Daha fazla bilgi için kılavuz sayfasına göz atın git-show.


5
Aslında işe yaramıyor gibi - denedin mi? "Git show HEAD: path / to / file.c" için "belirsiz bir argüman" hatası alıyorum.
mike

2
Git
deposunun

20
Pencerelerde iseniz, bir yol ayırıcı şey olabilir; git show HEAD: dir \ subdir \ file yaparsam, açık argüman alırım. Git HEAD: dir / subdir / file komutunu gösterirsem beklendiği gibi çalışır.
Matt McMinn

12
: Öğesinden sonra girmeniz gereken yol git deposunun kök dizinindendir. (bu aşağıda bir cevap olarak verildi, ancak bu cevaba bir yorum olarak tasarlandığını düşünüyorum)
MatrixFrog

9
Bir Vim ayrımında görmek için birlikte kaydırmak istiyorsanız, bunu nasıl yapacağınızı gösteren kısa bir blog yazısı yazdım .
Flaviu

257

Bunu tarihe göre yapmak şöyle görünür:

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

Bunun HEAD@{2013-02-25}, "depoda tarihin bu dalında 2013-02-25 tarihinden önceki son taahhüt" değil, " depoda" HEAD'in 2013-02-25'te olduğu yer "anlamına geldiğini unutmayın .


5
Muhteşem. Github'a gitmeye ve taahhüde bakmak yerine zamanımı kurtarır.
Fizer Khan

Dosya yolundaki "nokta" benim sorunumdu. Teşekkürler!
tomascharad

5
Bu komut, bir masterHEAD@{2013-02-25}
daldaysanız

1
Zamanı ekleyebilir git log --since='2016-04-28 23:59:59 +0100'misiniz?
dumbledad

7
Bu sözdiziminin reflog'u kullanması önemlidir ve vurgulanması gerekir, çünkü reflog tüm taahhütleri içermez . Bkz. Blog.endpoint.com/2014/05/git-checkout-at-specific-date.html
Alice Heaton

113

GUI'leri beğendiyseniz, gitk'i kullanabilirsiniz:

  1. gitk ile şununla başla:

    gitk /path/to/file
    
  2. Ekranın üst kısmındaki düzeltmeyi, örneğin açıklama veya tarihe göre seçin. Varsayılan olarak, ekranın alt kısmı bu revizyonun farkını gösterir ("yama" radyo düğmesine karşılık gelir).

  3. Seçilen düzeltmenin dosyasını görmek için:

    • "Ağaç" radyo düğmesine tıklayın. Bu, bu düzeltmede dosya ağacının kökünü gösterir.
    • Dosyanıza inin.

7
Bu aynı zamanda bir lanetler git repo görüntüleyicisi olan tig ile de çalışır .
Matthew G

1
@Paul Slocum: Bunun nedeni, bu komutun git komutunun yerleşik olmaması değil, geleneksel bir komut olmaması olabilir. Bu komutun yalnızca Windows için çalıştığını düşünüyorum.
Envil

Bu sadece git deponuzun kökünden başlarsanız işe yarar görünüyor.
Marc

Eğer siz de bu kısayolu kullanabilirsiniz gitk ile belli revizyon karşı kontrol etmek istiyorsanız: gitk REVISION /path/to/file. Bu, örneğin belirli bir sürüme karşı kontrol etmek istediğinizde kullanışlı olabilir.
Christian.D

89

Ayrıca komutla bir commit hash(genellikle de denir commit ID) belirtebilirsiniz .git show


Kısaca

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


Adım adım

  1. Belirli bir dosya için tüm değişikliklerin günlüğünü git log /path/to/file
  2. Gösterilen değişiklikler listesinde gösterir commit hashgibi commit 06c98...(06c98 ... karma tamamlama olmak üzere)
  3. Kopyala commit hash
  4. Komutunu çalıştırın git show <commitHash>:/path/to/filekullanarak commit hash3. adımda & ait path/to/fileaşama 1.

Not:./ göreceli bir yol belirtirken eklenmesi önemli gibi görünür git show b2f8be577166577c59b55e11cfff1404baf63a84:./flight-simulation/src/main/components/nav-horiz.html.


1
dosya yolunu bilmiyorsanız git show <SHA1> --name-onlyalmak için kullanın .
Tiina

Bu komut op - hatta otomatik olarak bellekten tamamlanır - silinmiş bir dizinde test edilir ... o
gg'den

43

Jim Hunziker'in cevabına ek olarak ,

dosyayı revizyondan dışa aktarabilirsiniz,

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

Bu yardımcı olur umarım :)


23

Bir dosyanın eski sürümlerindeki farkları hızlı bir şekilde görmek için:

git show -1 filename.txt > dosyanın son revizyonuyla karşılaştırmak için

git show -2 filename.txt > son revizyon ile karşılaştırmak

git show -3 fielname.txt > son 3. son düzeltmeyle karşılaştırmak


18
Bu komutlar benim için geçerli sürümle olan farkları gösterir ancak dosyanın tamamını göstermez.
Jean Paul

18

git log -pyalnızca taahhüt günlüklerini değil, aynı zamanda her bir taahhüdün farkını da gösterir (birleştirme taahhütleri hariç). Ardından tuşuna /basıp dosya adını girebilir ve tuşuna basabilirsiniz enter. Sonraki / önceki tekrarlamaya gitmek için nveya tuşuna basın p. Bu şekilde sadece dosyadaki değişiklikleri değil, aynı zamanda taahhüt bilgisini de göreceksiniz.


3
git log -pmBirleştirme taahhütlerini de gösterecek gibi görünüyor .
sanbor

2
git log -p -- filename.txtGeçmişi yalnızca istenen dosyayla sınırlamak için de çalıştırabilirsiniz .
Jean Paul

3

Bir dosyanın tüm sürümlerini dosyaları ayırmak için dökmek için şöyle bir komut dosyası kullanabilirsiniz:

Örneğin

git_dump_all_versions_of_a_file.sh path/to/somefile.txt

Komut dosyasını benzer başka bir sorunun cevabı olarak buradan alın


1
git_root, git_log_shortVe git_log_message_for_commiteksik.
mogsie

İyi yakalama! Bu cevabı iki farklı noktaya iki kez gönderdim ve sadece bu cevabı kaldırdım ve insanların daha önce bana bundan bahsettiği diğerine bağladım ... teşekkürler @mogsie!
Brad Parks

Bu komut dosyası çok kullanışlıdır!
XMAN

3

YOL 1: (Bu yolu tercih ederim)

  1. İle taahhüt numarasını bulun :git reflog
  2. Taahhütteki dosyaları listele git diff-tree --no-commit-id --name-only -r <commitHash>

örnek: git diff-tree --no-commit-id --name-only -r d2f9ba4// "d2f9ba4", "1" öğesinden taahhütlü kimliktir.

  1. Gerekli dosyayı komutla aç:

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

örnek: git show d2f9ba4:Src/Ext/MoreSwiftUI/ListCustom.swift// "Src / ...", "2" nin dosya yoludur.

YOL 2:

  1. İle taahhüt numarasını bulun :git reflog
  2. bu taahhüdü sıfırlayın: git reset --hard %commit ID%

git reset --hard c14809fa

  1. gereksiz herhangi bir değişiklik yapın ve gerekli şubeye taze taahhüt yapın :)

0

Belirli bir düzeltmeden birden fazla dosya almak için yardımcı

Birleştirme çakışmalarını çözmeye çalışırken, bu yardımcı çok faydalıdır:

#!/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)

GitHub akış yukarı .

Kullanımı:

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

Sonuç: aşağıdakiler dosyaların alternatif sürümlerini içerir:

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

Bu şekilde, dosya uzantısını editörünüz şikayet etmeyecek ve eski dosyayı daha yenisinin hemen yanında bulabilecek şekilde tutarsınız.


@MickeyPerlstein Eğer daha iyi bir uygulama ile aynı arayüzü elde edebilirsiniz, ben tamamen kulaklarım.
Ciro Santilli 法轮功 病毒 审查 六四 事件

belki anlamıyorum (ve eğer öyleyse, özür dilerim) ama sadece değil: "git show version: ./ path> new_path"?
Mickey Perlstein

@MickeyPerlstein merhaba, evet, komutum bu CLI'yi oluşturuyor, ancak birden fazla dosya üzerinde döngü yapıyor ve girişten çıktı adı üretiyor, bu yüzden çok fazla yazmak zorunda değilsiniz. Devrim niteliğinde bir şey yok, ama kullanışlı.
Ciro Santilli 法轮功 病毒 审查 六四 事件
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.