2013-07-22 11 views
21

ファイル内の特定の行の以前のすべてのバージョンを行番号でリストすることは可能ですか?GITの履歴にある特定の行番号のすべてのバージョンを一覧表示する

私が有用と思うのは、記録されたスタックトレースレポートに基づいて問題を簡単にトラブルシューティングできるようにするためです。

つまり、特定のファイルの行100にログされたundefined method exceptionがあります。このファイルは、コミットされたものにたくさん含まれているため、変更を加えなくても、指定された行はファイルを「移動」した可能性があります。

最後のx回のコミットで、特定のファイルの行100の内容をどのように出力しますか?

+0

また、[git history of source line](http://stackoverflow.com/q/10854370) – CharlesB

+0

@MRT:私の答えは、最後の行の変更。 –

+1

重複した質問に新しい[answer](http://stackoverflow.com/a/17803860/946850)を投稿しました。この質問が閉じられない場合に備えて、コピーと同じ回答をここに保持します。 – krlmlr

答えて

9

これは、ファイル$FILEの行$LINE示すために、すべての意味の改正ためgit blameを呼び出します:

いつものように
git log --format=format:%H $FILE | xargs -L 1 git blame $FILE -L $LINE,$LINE 

を、非難は、各行の先頭にあるリビジョン番号を示します。

| sort | uniq -c 

を追加して、この行を変更したコミットのリストのような結果を得ることができます。 (コードが移動されただけでは、行の内容によって同じコミットIDが2回表示される可能性があります)さらに詳細な分析を行うには、隣接するコミットに対してgit blameの結果を比較する必要があります。 ?

それは

NAME 
     git-blame - Show what revision and author last modified each line of a file 

SYNOPSIS 
     git blame [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental] [-L n,m] 
        [-S <revs-file>] [-M] [-C] [-C] [-C] [--since=<date>] [--abbrev=<n>] 
        [<rev> | --contents <file> | --reverse <rev>] [--] <file> 

DESCRIPTION 
     Annotates each line in the given file with information from the revision which last modified the line. Optionally, start annotating from the given revision. 
+0

ありがとう、これは仕事をしているようです。 xargsオプションで大文字の 'L'を使うだけでした:' git log --format = format:%H $ FILE | xargs -L1 git blame $ FILE -L $ LINE、$ LINE' – mrt

+0

@MRT:正しく、 'xargs'への' -l'スイッチは、POSIXに従って廃止されました。私のシステムで作業しましたが、 '-L'が良いです。 – krlmlr

+0

'git blame'の' -L'引数を使って、行番号ではなくコードを見つけることができます。これは、例えば、移動した関数を見つけるのに便利です(しかし、名前が変更されたときではありません)。 –

7

あなたが求めているのは正確ではありませんが、git blame <file>では最後にすべての行を修正したコミットを見ることができます。

$ git blame my-file.txt 
65126918 (David Pärsson 2013-07-22 12:53:02 +0200 1) Heading 
c6e6d36d (David Pärsson 2013-07-22 12:53:10 +0200 2) ======= 
65126918 (David Pärsson 2013-07-22 12:53:02 +0200 3) 
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 4) Text on first line 
8b3d2e15 (David Pärsson 2013-07-22 12:49:49 +0200 5) Text on second line 
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 6) Text on third line 

あなたは、例えば改正を供給することにより最後の変更を超えを見ることができます:

示し最初の列はIDをコミット

$ git blame my-file.txt -L 4,+3 
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 4) Text on first line 
8b3d2e15 (David Pärsson 2013-07-22 12:49:49 +0200 5) Text on second line 
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 6) Text on third line 

詳細と巧妙なトリックがgit-blame man page上で見つけることができます:あなたはまた、このように、-L引数を指定して特定の行選択することができます

$ git blame 8b3d2e15 my-file.txt 

+1

リビジョンも指定することができます。つまり、すべての行を変更した* last *コミットだけでいいわけではありません。 –

+3

関数fooが定義されている場所から10行分の行を非難するために、 '-L/void foo /、+ 10'を行100から10行分奪うための' -L100、+ 10'オプションを忘れないでください。 – sehe

1

あなたはgit blameの後にいると思います。それは、各行を追加したコミットを示しています。

git blame the-file-that-has-that-line.txtを実行して100行目に移動すると、コミットされたこと(コミットされたときと誰によって)が表示されます。

2

git blame <file> -L <line>,<line>

-2

使用git blame 。試してみてください

git gui blame <file> 

「旅行を戻す」リンクの横にあるリビジョンをクリックすることができます。

+0

すでに3回提案されていますが、OPが探しているものではありません... – krlmlr

2

を動作するかどうか、特定の行がどのように変化するかを見るために時間を前後に移動することが容易になりGitリポジトリに同梱されて派手なGUIが実際にあります参照を達成するために)

3

だけでなく、この短いチュートリアルをチェックアウト:http://zsoltfabok.com/blog/2012/02/git-blame-line-history/
を(すでにデビッドParssonの答えに特に示唆されているように、git blame)基本的には、それが特定の行を変更コミットかを確認するためにgit blamegit showの組み合わせをガイドしますとどのようにその行の変更(git show <commit-id>)。したがって、コミットを繰り返すと、git blame <commit-id>git show <commit-id>は、ファイルの特定の行の完全な履歴を提供します。
また、別のファイルから行がコピーされていると思われる場合は、git blame -Mを忘れないようにしてください。からhttps://www.kernel.org/pub/software/scm/git/docs/git-blame.html

-M | num |
ファイル内の移動またはコピーされた行を検出します。コミットが行のブロックを移動またはコピーすると(元のファイルにはAとBがあり、コミットによってBとAに変更されます)、伝統的な非難アルゴリズムは動作の半分にしか気づきませんでした。 (すなわちB)を親に移動し、子コミットに移動した行(つまりA)に責任を割り当てます。このオプションを使用すると、検査の余分なパスを実行することによって、両方のグループのグループが親に告発されます。

numはオプションですが、gitがファイル内で移動/コピーとして検出する必要がある英数字の数の下限で、それらの行を親コミットに関連付けるために使用されます。デフォルト値は20です。

関連する問題