2011-01-24 8 views
102

ソースファイルを変更した最新のコミットを探したい。ファイルを修正した最新のgit commitを見つけるにはどうすればよいですか?

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

私のgitリポジトリ内の特定のファイルにアクセスした最後のコミットを見つける方法はありますか?あなたがこれを書くことができるように

答えて

122

git logは、特定のファイル(やディレクトリ)の歴史を見てサポートしています。

git log my/file.c 

あなたが本当にのみを使用するたとえば、最新のコミットを一覧表示したい場合そのスクリプトで、あなたは-n 1を使用することができます。

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

--pretty=format:%hはコミットのハッシュ(TheBamfのおかげで)表示するようにgit logに指示します。 --セパレータは、あいまいな場合に備えて、ファイル名がコミット名として解釈されるのを止めます。

+4

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

8

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

+3

'git log -n1 - 'を使うと(リソースを浪費したい場合は出力を 'head -1'にパイプする)、手動でトップラインを選択する必要はありません(Jo Lissの[answer] http://stackoverflow.com/questions/4784575/how-do-i-find-the-most-recent-git-commit-that-modified-a-file/4784629#4784629)) –

+3

良い点。私は '-n'をスキップして' -1'を直接使うこともできると思います。 –

1

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

+3

これはOPの要求より少し上ですが、これを1つのライナーにまとめることができます: 'git show $(git log -1 --pretty ="%H " - ファイル名)' –

+0

ああ、そうですさらに簡単に。先端に感謝します。 – Joe

0

、1本のライン上のちょうど参照を取得しようとする:

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

あなただけの最新のハッシュを取得したい場合は、ファイルの特定のセットを変更するためにコミット(およびawkを避けたい)あなたがすることができます使用:

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

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

(場合には、それは誰のために便利です)...

私は、最新の(あなたがmycode-1.2.1のようなタグでバージョンをマークすると仮定して)すべてのソースファイルを変更するためにコミット考慮することによって、現在のバージョンIDを作成します。

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-mod、次のコミットに該当する場合 - - ソースファイルの現在の状態が以降に変更された電子のソースファイルは、タグ付きバージョン
  • mycode-1.2.1-g3k7s2に対応します最後にタグ付けされたバージョン
  • mycode-unknownを、次のコミット - まだあなた場合はタグが
+3

'$ VN'は悪夢のような悪夢のようなものです。SVN – ThorSummoner

18

を作成したバージョンがあっていない場合の最新のコミットを見つけたら、git-logを望ましくない場合は、そのファイルを変更しているコミット・オブジェクトをリストするgit-rev-listが、そのコミット・パスで最新のものから順に(時系列に)開始します。簡単に言えば:git-rev-listについては

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

をあなたの場合、あなただけの供給に:含まれるように

  • コミットの数、または-1のみ、最新のため、
  • HEAD(すでにある場合)または--all(既知のコミットがすべて必要な場合)、
  • ファイルへの相対パス。 、あなたは、タグ名、さらにはリモート参照を使用することができ、より複雑な例については215095e2e338525be0baeeebdf66bfbb304e7270

    と相対含ま:

これはちょうど、最新のは、そのファイル、元を変更し、現在のブランチにIDをコミット返します元にワイルドカードを持つパス名、:

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

...最近の変更は、そのブランチの歴史の中で、ワイルドカードの試合に何であったかを教えてくれます。 rev-listのオプションは極端で、最も重要な配管コマンドの1つなので、あなたが想像できるどんな基準でも含めるか除外することができます。

もちろん、git-rev-list(1) Manual Pageを参照してください。

+0

' git-log'を使うのがなぜ劣るのかあなたは本当に説明しませんでした。 –

+3

私は劣等ではないと言っていますが、デフォルトでは無関係な情報を提供しています。 git-rev-listはコミットIDを返すだけです。これはスクリプトやその他の自動化プロセスにレスポンスを送る場合に必要なものです。 git-logは、選択されたコミットについての情報を返します。まず、git-rev-listを使用してコミットIDを収集し、次に各コミットに関する情報を収集します。コミット情報を除外してIDを使用する場合は、まずgit-rev-listを使用します。ログはrev-listに基づいているため、ほとんど同じフィルタパラメータを使用します。 –

+1

'git-log'は磁器で、' git-rev-list'は配管です。 – blitzen9872

関連する問題