ファイルを変更した最新のgit commitを見つけるにはどうすればよいですか?


180

ソースファイルを変更した最新のコミットを見つけたいのですが。

を使用git blameして、コミットのすべての日付を各行で確認できますが、ファイルに最後に触れたコミットがどれかを正確に確認することは困難です。

gitリポジトリ内の特定のファイルに影響を与えた最後のコミットをどのように見つけることができますか?

回答:


230

git log 特定のファイル(およびディレクトリ)の履歴の参照をサポートしているため、次のように呼び出すことができます。

git log my/file.c

スクリプトで使用するなど、本当に最新のコミットを1つだけリストしたい場合は、次の-n 1オプションを使用します。

git log -n 1 --pretty=format:%H -- my/file.c

--pretty=format:%hgit logコミットハッシュのみを表示するように指示します。--区切りは、それが曖昧だ念のために、コミット名として解釈取得からファイル名を停止します。


12
ブランチに関係なくファイルが最後に変更された時刻を知りたい場合は、--allオプションを追加してすべてのブランチを考慮することができます。
KC

44

あなただけしたい場合は見つける最新のは、あなたが望んでいない、コミットgit-logしたい、git-rev-list最新のもの(時系列)で始まる、パスをコミットすることで、そのファイルを、変更するオブジェクトをコミットしているリスト、。簡単に言えば:

git rev-list -1 <commit> <filename>

git-rev-listあなたの場合のために、あなたは単に供給します:

  • 含めるコミットの数、または最新のもののみの場合は-1
  • 振り返りを開始するブランチ(またはコミットID)、すでにブランチにいる場合はHEAD、既知のすべてのコミットが必要な場合は--all、および
  • ファイルへの相対パス。

これは、現在のブランチで最新のコミットIDを返し、そのファイルを変更するだけです。例: 215095e2e338525be0baeeebdf66bfbb304e7270

より複雑な例として、タグ名やリモート参照を使用し、ワイルドカードを使用して相対パス名を含めることができます。例:

git rev-list origin/user/bob/testbranch -1 src/bfiles/*.txt

...これは、そのブランチの履歴におけるワイルドカードの一致に対する最新の変更点を示しています。rev-listのオプションは極端です。これは最も重要な配管コマンドの1つであるため、想像できるほぼすべての基準で包含または除外できます。

もちろん、git-rev-list(1)マニュアルページを参照してください


あなたは本当に使用git-logが劣っている理由を説明しませんでした。
Piotr Dobrogost

7
デフォルトでは無関係な情報を提供するだけで、劣るとは言いません。git-rev-listはコミットIDを返すだけです。これは、応答をスクリプトまたはその他の自動化プロセスにフィードする場合に必要なものです。git-logは、最初にgit-rev-listを使用してコミットIDを収集し、次に各コミットに関する情報を収集することにより、選択したコミットに関する情報を返します。コミット情報をフィルターで除外し、IDを使用する場合は、最初にgit-rev-listを使用できます。ログはrev-listに基づいているため、同じフィルターパラメーターのほとんどを取ります。
マイケルエリクソン2016年

3
git-log磁器、git-rev-list配管です。
blitzen9872 2017

27

特定のファイルセットを変更するために最新のコミットのハッシュを取得したい場合(そしてを避けたいawk場合)は、次のコマンドを使用できます。

git log -n 1 --pretty=format:%h -- <path>

これは、後でで使用するためのコミットハッシュを取得するのに役立ちgit describeます。

たとえば(誰にとっても便利な場合)…

ソースファイルを変更する最新のコミットを検討して、現在のバージョンIDを作成します(バージョンにのようなタグを付けたと仮定mycode-1.2.1):

COMMIT=$(git log -n 1 --pretty=format:%h -- *.c *.h)
if VN=$(git describe --always --abbrev=5 --match "mycode-*" $COMMIT 2>/dev/null) &&
case "$VN" in
mycode-*)
    git update-index -q --refresh
    test -z "$(git diff-index --name-only HEAD *.c *.h)" ||
    VN="$VN-mod" ;;
*) VN="mycode-unknown-g$VN" ;;
esac
then
    continue
else
VN="mycode-unknown"
fi

これにより、次のようなIDが生成されます。

  • mycode-1.2.1 -ソースファイルの現在の状態がタグ付きバージョンに対応する場合
  • mycode-1.2.1-g3k7s2 -ソースファイルの現在の状態がタグ付きバージョンに続くコミットに対応する場合
  • mycode-1.2.1-g3k7s2-mod -ソースファイルの現在の状態が、タグ付けされたバージョンに続く最後のコミット以降に変更されたとき
  • mycode-unknown -バージョンタグがまだ作成されていない場合

5
$VNある種の悪夢のアンデッドSVNのように見えます
ThorSummoner

10

これがあなたが望むものであるかどうかはわかりませんが、git log <thefile>そのファイルを変更したコミットを取得するために行うかどうかはわかりません。一番上のものを選ぶことができます。それはあなたが探しているものでなければなりません。


4
使用する場合git log -n1 -- <thefile>(またはhead -1リソースを無駄にしたい場合は、出力をパイプ処理する)、手動で一番上の行を選択する必要はありません(Jo Lissの回答を参照)
Tobias Kienzler

4
いい視点ね。スキップして直接-n使用-1することもできると思います。
Noufal Ibrahim

3

1行の参照のみを取得するには、次のことを試してください。

git log -n1 --oneline <path> | awk '{print $1;}'

2

使用して確認したいコミットのSHA IDを取得したら、その特定のコミットに対して何をしたかを確認git log FILENAMEできるはずgit show SHA_ID_HEREです。ID全体を入力する必要さえありません。最初の6文字で十分です。


4
それだもう少しOPはを求めたが、FYIあなたはワンライナーにこれを組み合わせることができますより:git show $(git log -1 --pretty="%H" -- FILENAME)
トビアスKienzler
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.