2009-12-07 5 views
13

私はファイルA.cppを持っていて、ファイルの15行目にエラーがあることに気が付きました。エラーが、メンバ変数へのポインタを返す関数の "const"であるとしましょう。つまり、関数のconstを使用することは技術的には正しいが、意味的に間違っているとします。変更を行った作者とのセマンティクスについて議論したいと思います。gitを使ってファイルの特定の行にトークンを初めて導入する

gitを使って、どのリビジョンが "const"トークンを導入したかを知る方法はありますか?具体的には、誰がトークンを導入したのかを知りたい。

"git blame"は、誰が最後の変更を行ったかを示していますが、実際にはトークンを含む最初のコミットを探しています。

+0

各リビジョンが表示されるまで差分をとることはできませんか?申し訳ありませんが、私はGitについてよく分かりませんが、それは私が他のソース管理システムのためにやることです。 –

+0

はい、それは非常に時間がかかるかもしれません...リポジトリの履歴は、このファイルで数千回コミットして少なくとも3年前に戻ります。これはかなり一般的な作業のようですが、これを行うより良い方法があるようです。 – paxos1977

+0

[git:文字列を導入したコミットを見つける](http://stackoverflow.com/questions/5816134/git-finding-a-commit-that-introduced-a-string)も参照してください。 –

答えて

13

git bisectはあなたが探しているものです。このコマンドを使うと、constを導入したものを素早く見つけることができます。

git bisect startでプロセスを開始し、constなしでgit bisect goodとし、現在のバージョンをbisect badとしてマークします。それから、システムは途中のバ​​ージョンにあなたを送ります。あなたは邪悪なconstが存在するかどうかを確認し、それに応じてそのバージョンを良いか悪いかをマークすることができます。その後、プロセスは、あなたが悪いコミットを見つけるまで繰り返されます。

+4

定数がある場合(つまり「悪い」状態)に1で終了する単純なスクリプトを書くことができれば、 'git bisect run myscript'と呼んで、座って仕事をしているgitを楽しんでください... –

1

私はこのためにQGitを使用し、対象の行を選択し、それをフィルタリングすると、その行の変更の一覧のみが表示されます。 1行の場合、いくつかのリビジョンを飛び越える必要はありません。

経由:

  • オープンQGitリポジトリ
  • 開くには、ツリービュー
  • ファイル検索に関心のセレクトライン
  • 押して '選択した行のフィルタ改正'
  • 検索ライン
  • ボタンは、漏斗のように見えます。
2

ラインは、いくつかの中constトークンなしで存在していた場合、あなたが知っていることをコミット、あなたはそこに開始し、ラインがconstトークンを持っていなかったの最後のリビジョンを見つけるためにはgit-非難に--reverseフラグを使用することができます。その後、ファイルの次のリビジョンを見てください。

4

変更が常にA.cppの15行目にあるとは限りませんので、周囲のコンテキストを使用してください。すべてのA.cppに触れ、現在のブランチにコミットし、問題のパターンが含まれている最初のものを見つけて

git grep 'const *int *foobar' \ 
    $(git log --reverse --pretty=format:%H -- A.cpp) -- \ 
    A.cpp | head -1 

これが時間内に前方検索します。それはconst int foobarの定義だったと言います。出力は、コミットのSHA-1とそのリビジョンの一致行A.cppになります。

コミットを知ったら、git showを使用して著者を学んでください。

28

可能な方法はいくつかあります。

  • git blame、またはあなたがコミット適切な見つける までの歴史に戻って、ラインの歴史を閲覧するためのより良いグラフィカル非難ツール(のようなgit gui blameまたはgit instaweb/gitwebで非難ビュー )。

  • はそう (リストに)与えられたトークンの数は(通常 与えられたトークンが追加または削除された場所を意味する)に変更されたすべてのコミット、例えばを見つけるために、すなわちgit log -S適切なトークン/正規表現と、「つるはし検索」と呼ばれます: 「悪いが、」「CONST」どこそこが (例えばgrepのを使用してテスト)すべきではないとの1を意味しますコミット

    git log --reverse -p -S'const int foobar' -- A.cpp 
    
  • git bisect

関連する問題