Gitに特定のファイルの特定のバージョンを(標準出力にダンプするか、$PAGER
またはで$EDITOR
)表示するコマンドはありますか?
git checkout <sha1-of-the-commit-you-need>
、その後、git checkout HEAD
Gitに特定のファイルの特定のバージョンを(標準出力にダンプするか、$PAGER
またはで$EDITOR
)表示するコマンドはありますか?
git checkout <sha1-of-the-commit-you-need>
、その後、git checkout HEAD
回答:
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
。
これを日付で行うと、次のようになります。
git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt
これHEAD@{2013-02-25}
は、「reflogを使用して)このリポジトリの「HEADが2013-02-25にあった場所」ではなく、「このブランチの履歴における2013-02-25より前の最後のコミット」ではないことに注意してください。
master
代わりに役立ちHEAD@{2013-02-25}
ます
git log --since='2016-04-28 23:59:59 +0100'
か?
GUIが好きな場合は、gitkを使用できます。
gitkを起動します:
gitk /path/to/file
画面上部のリビジョンを、説明や日付などで選択します。デフォルトでは、画面下部にそのリビジョンの差分が表示されます(「パッチ」ラジオボタンに対応)。
選択したリビジョンのファイルを表示するには:
gitk REVISION /path/to/file
。これは、たとえば特定のバージョンをチェックする場合などに便利です。
コマンドでcommit hash
(通常はとも呼ばれますcommit ID
)を指定することもできます。git show
git show <commitHash>:/path/to/file
git log /path/to/file
commit hash
などが表示されcommit 06c98...
ます。commit hash
git show <commitHash>:/path/to/file
を使用してコマンドを実行します。commit hash
path/to/file
注:./
相対パスを指定するときにを追加することが重要と思われgit show b2f8be577166577c59b55e11cfff1404baf63a84:./flight-simulation/src/main/components/nav-horiz.html
ます。
git show <SHA1> --name-only
して取得します。
ジム・フンジカーの答えに加えて、
リビジョンからファイルをエクスポートできます。
git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt > old_fileInCurrentDirectory.txt
お役に立てれば :)
git log -p
コミットログだけでなく、各コミットの差分も表示されます(マージコミットを除く)。次に、を押し/
、ファイル名を入力してを押しenter
ます。n
またはp
を押して、次/前のオカレンスに移動します。これにより、ファイルの変更だけでなく、コミット情報も表示されます。
git log -pm
マージコミットも表示されるようです。
git log -p -- filename.txt
して、目的のファイルのみに履歴を制限することもできます。
次のようなスクリプトを使用して、ファイルのすべてのバージョンを別のファイルにダンプできます。
例えば
git_dump_all_versions_of_a_file.sh path/to/somefile.txt
git_root
、git_log_short
およびgit_log_message_for_commit
不足しています。
方法1:(私はこの方法を好む)
git reflog
git diff-tree --no-commit-id --name-only -r <commitHash>
例:
git diff-tree --no-commit-id --name-only -r d2f9ba4
//「d2f9ba4」は「1」からのコミットIDです。
git show <commitHash>:/path/to/file
例:
git show d2f9ba4:Src/Ext/MoreSwiftUI/ListCustom.swift
//「Src / ...」は「2」からのファイルパスです。
方法2:
git reflog
git reset --hard %commit ID%
git reset --hard c14809fa
特定のリビジョンから複数のファイルを取得するヘルパー
マージの競合を解決しようとする場合、このヘルパーは非常に役立ちます。
#!/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
このようにして、ファイル拡張子を保持することで、エディターが文句を言わないようにし、新しいファイルのすぐ隣に古いファイルを簡単に見つけることができます。