古いバージョンのファイルを表示する簡単なGitコマンドはありますか?


1510

Gitに特定のファイルの特定のバージョンを(標準出力にダンプするか、$PAGERまたはで$EDITOR)表示するコマンドはありますか?



古いバージョンのバイナリファイル(イメージなど)をチェックするためにこの質問にアクセスした場合は、古いコミットをチェックアウトして、必要なものを確認してから、HEADに戻ってください。そのためにはgit checkout <sha1-of-the-commit-you-need>、その後、git checkout HEAD
Homero Esmeraldo

回答:


1731

git showリポジトリのルートからのパス(./または../相対パス)を使用できます。

$ git show REVISION:path/to/file

REVISION実際のリビジョンで置き換えます(GitコミットSHA、タグ名、ブランチ名、相対コミット名、またはGitでコミットを識別するその他の方法)

たとえば<repository-root>/src/main.c、4コミット前のファイルのバージョンを表示するには、次のコマンドを使用します。

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

Git for Windowsでは、現在のディレクトリからの相対パスであってもスラッシュが必要です。詳細については、のマニュアルページを参照してくださいgit-show


5
それは実際には機能していないようです-試しましたか?「git show HEAD:path / to / file.c」の場合、「あいまいな引数」エラーが発生します。
マイク

2
gitリポジトリの上からの完全なパスでなければなりません
richq '12

20
Windowsを使用している場合は、パスの区切り文字になる可能性があります。git show HEAD:dir \ subdir \ fileを実行すると、あいまいな引数が表示されます。git show HEAD:dir / subdir / fileを実行すると、期待どおりに動作します。
Matt McMinn 2010

12
:の後に指定する必要があるパスは、gitリポジトリのルートからのものです。(これは回答として以下に示しましたが、この回答に対するコメントとして意図されたと思います)
MatrixFrog

9
Vimで分割して一緒にスクロールできるようにしたい場合は、その方法を示す短いブログ投稿を書きました。
Flaviu

257

これを日付で行うと、次のようになります。

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

これHEAD@{2013-02-25}は、「reflogを使用し)このリポジトリの「HEADが2013-02-25にあった場所」ではなく、「このブランチの履歴における2013-02-25より前の最後のコミット」ではないことに注意してください。


5
驚くばかり。githubに行ってコミットを確認する代わりに時間を節約できます。
Fizer Khan

ファイルパスの「ドット」が私の問題でした。ありがとう!
tomascharad

5
このコマンドは、ブランチを使用している場合にのmaster代わりに役立ちHEAD@{2013-02-25}ます
funroll

1
時間、アラを含めることができますgit log --since='2016-04-28 23:59:59 +0100'か?
dumbledad 2016年

7
この構文はreflogを使用するという事実は重要であり、reflogにはすべてのコミットが含まれているわけではないため強く強調する必要があります。blog.endpoint.com/2014/05/git-checkout-at-specific-date.htmlを
アリスヒートン

113

GUIが好きな場合は、gitkを使用できます。

  1. gitkを起動します:

    gitk /path/to/file
    
  2. 画面上部のリビジョンを、説明や日付などで選択します。デフォルトでは、画面下部にそのリビジョンの差分が表示されます(「パッチ」ラジオボタンに対応)。

  3. 選択したリビジョンのファイルを表示するには:

    • 「ツリー」ラジオボタンをクリックします。これにより、そのリビジョンのファイルツリーのルートが表示されます。
    • ファイルにドリルダウンします。

7
これは、curses git repoビューアであるtigでも機能します。
Matthew G

1
@Paul Slocum:このコマンドは従来のコマンドではなく、gitの組み込みではないためです。このコマンドはWindowsでのみ機能すると思います。
イービル

これは、gitリポジトリのルートから開始した場合にのみ機能するようです。
マルク

gitkで特定のリビジョンをチェックしたい場合は、次のショートカットを使用することもできます:gitk REVISION /path/to/file。これは、たとえば特定のバージョンをチェックする場合などに便利です。
Christian.D

89

コマンドでcommit hash(通常はとも呼ばれますcommit ID)を指定することもできます。git show


手短に

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


一歩一歩

  1. 特定のファイルのすべての変更のログを表示します git log /path/to/file
  2. 表示される変更のリストでは、(06c98 ...コミットハッシュである)commit hashなどが表示されcommit 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して取得します。
Tiina

このコマンド
op-


23

ファイルの古いリビジョンとの違いをすばやく確認するには:

git show -1 filename.txt >ファイルの最終リビジョンと比較する

git show -2 filename.txt >最後の2番目のリビジョンと比較する

git show -3 fielname.txt >最後の3番目の最後のリビジョンと比較する


18
これらのコマンドでは、現在のバージョンとの違いが表示されますが、ファイル全体は表示されません。
Jean Paul

18

git log -pコミットログだけでなく、各コミットの差分も表示されます(マージコミットを除く)。次に、を押し/、ファイル名を入力してを押しenterます。nまたはpを押して、次/前のオカレンスに移動します。これにより、ファイルの変更だけでなく、コミット情報も表示されます。


3
git log -pmマージコミットも表示されるようです。
sanbor 2016年

2
実行git log -p -- filename.txtして、目的のファイルのみに履歴を制限することもできます。
Jean Paul

3

次のようなスクリプトを使用して、ファイルのすべてのバージョンを別のファイルにダンプできます。

例えば

git_dump_all_versions_of_a_file.sh path/to/somefile.txt

別の同様の質問への回答としてここスクリプトを取得します


1
git_rootgit_log_shortおよびgit_log_message_for_commit不足しています。
mogsie

良いキャッチ!私はこの回答を2つの異なる場所に二重に投稿し、これを削除して、他の場所にリンクしました。他の場所にリンクされていました。前に人々がこれについて教えてくれました...ありがとう@mogsie!
ブラッドパークス

このスクリプトは非常に便利です。
XMAN 2018

3

方法1:(私はこの方法を好む)

  1. コミットIDを見つける: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」からのコミットIDです。

  1. コマンドで必要なファイルを開きます:

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

例:git show d2f9ba4:Src/Ext/MoreSwiftUI/ListCustom.swift//「Src / ...」は「2」からのファイルパスです。

方法2:

  1. コミットIDを見つける:git reflog
  2. このコミットをハードリセットします: git reset --hard %commit ID%

git reset --hard 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)

GitHubアップストリーム

使用法:

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

結果:以下は、ファイルの代替バージョンを含みます。

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

このようにして、ファイル拡張子を保持することで、エディターが文句を言わないようにし、新しいファイルのすぐ隣に古いファイルを簡単に見つけることができます。


@MickeyPerlsteinあなたがより良い実装で同じインターフェースを達成することができるなら、私はすべて耳です。
Ciro Santilli冠状病毒审查六四事件法轮功

多分私は理解していないかもしれませんが(そうであれば、私の謝罪です)、それだけではありません: "git show version:./ path> new_path"?
ミッキーペルシュタイン

@MickeyPerlsteinこんにちは、はい、私のコマンドはそのCLIを生成しますが、複数のファイルをループして入力から出力名を生成するため、あまり入力する必要はありません。もちろん革新的なものは何もありませんが、便利です。
Ciro Santilli冠状病毒审查六四事件法轮功
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.