Git:git履歴全体にわたって、指定されたファイルの1行に対するさまざまな変更をすべて表示します


112

私は見回しましたが、これが可能かどうかはわかりませんが、次のようになります。

次のように、変数に一意の識別子を割り当てた(javascript)ファイル(たとえば/lib/client.js)があります。 var identifier = "SOME_IDENTIFIER";

識別子はバージョン番号のようなものと考えることができます。定期的に、この変数を新しい識別子に変更します。

私がしたいことは、これまでに使用したすべての一意の識別子を見つけることです。どうすればgitでこれを行うことができますか?

gitの履歴を検索して、行の一致を出力する方法があると思い"var identifier ="ます。このリストは手動で重複除外できます。

とにかく、私はここでどんな洞察にも感謝します。ありがとう。


回答:


106

git 1.8.4以降、質問に直接答える方法があります。

その行110がと言っている行であるとするとvar identifier = "SOME_IDENTIFIER";、次のようにします。

git log -L110,110:/lib/client.js

これにより、そのコード行に関連するすべてのコミットが返されます。

[ Gitドキュメント( "-L"コマンドラインパラメータを参照)]


49

git-logおよびのマニュアルページを参照してくださいgitdiffcore。このコマンドでうまくいくと思いますが、正しくない場合があります。

git log -G "var identifier =" file.js

編集:実際の行を表示するbashスクリプトの大まかなスタートは次のとおりです。これはあなたが探しているものよりも多いかもしれません。

for c in $(git log -G "something" --format=%H -- file.js); do
    git --no-pager grep -e "something" $c -- file.js
done

git log -G興味深いコミットを見つけるために使用し--format=%H、コミットハッシュのリストを生成するために使用します。次に、対象のコミットごとに反復しgit grep、そのコミットからの行と、コミットハッシュで始まる正規表現を含むファイルを表示するように求めます。


編集:コメントで提案されている-G代わりに使用するように変更-Sされました。


@Rob-ありがとう-スクリプトを少し編集します-ファイル名だけを入力すると、そのファイルに影響するコミットのみが表示されます-コミットが他のファイルを参照している場合、リストされていない
Adrian Cornish

@AdrianCornish-お役に立ててうれしいです。OPは1つのファイルだけを見たいと思ったと思いますが、ファイル名を削除することはおそらくより一般的に有用なスクリプトであることは間違いありません。
rob

もっと難しい状況です。問題のファイルはpaht_a / fileからpath_b / fileに移動しました。ここで、path_bでそれを実行すると、ファイルがpath_aからpath_bに移動するまでの変更のみが表示されます。path_aでそれを行うと、致命的です:あいまいな引数 'file':作業ツリーにない不明なリビジョンまたはパス。
アンディソング

@AndySong-検索する文字列が十分に一意である場合、おそらくファイル名を省略しても、探しているものを取得できます。
2013

場所は各コミットの後に空白行、列挙行: -私のために、より便利だったsfile=path/to/some_file; sfind='string_to_find'; for c in $(git log -G $sfind --format=%H -- $sfile); do git --no-pager grep -e $sfind -n $c -- $sfile; echo; done
John_West

14

これはgitkでも実行できます。

gitk file.js

[commit]ドロップダウンで[adding / removing string:]を選択し、その横のテキストボックスに「var identifier = "」と入力すると、その文字列を含む行を追加または削除するコミットが強調表示されます。


これは、 "var identifier ="を含む行が追加されたコミットを特定するのに役立ちましたが、この行を変更した後続のコミットは表示されません。
findchris 2012年

2
試しましたgit blame file.jsgit gui blame file.js
Ethan Brown

1
git blameの機能は知っています。単一の差分ではなく、改訂の完全な履歴を探しています。
findchris 2012年

1
git gui blame file.jsそれを行います...ファイルのすべてのリビジョンと誰が変更したかを表示します。履歴を逆方向にクリックするだけです。
Ethan Brown

最終的にはgitkで視覚的にステップスルーしました。これにはエレガントなgitテクニックがあると思いますが、gitkで十分でした。ありがとう。
findchris

9

@robの答えを少しだけ変更git logすると、視覚的な比較だけが必要な場合は、基本的にこれが行われます。

git log -U0 -S "var identifier =" path/to/file

-U0は、パッチモード(-p)での出力を意味し、パッチの前後にゼロ行のコンテキストを表示します。

ブランチ間でこれを行うこともできます。

git log -U0 -S "var identifier =" branchname1 branchname2 -- path/to/file

差分ヘッダーを抑制する方法があるかもしれませんが、私はそれを知りません。


私のために働いた!ありがとう。
Roberto Bonini 2015

3

ではmagit、あなたがこれを行うことができます

l, =L

次に、ファイルを要求し、行を開始および終了します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.