13

ファイル A.cpp があり、ファイルの 15 行目にエラーがあるとします。エラーがメンバー変数へのポインターを返す関数の「const」であるとしましょう。つまり、関数で const を使用することは技術的には正しいが、意味的には間違っています。変更を行った作成者とセマンティクスについて話し合いたいと思います。

git を使用して、「const」トークンを導入したリビジョンを見つける方法はありますか? 具体的には、誰がトークンを導入したのか知りたいです。

「git Blame」は、行を最後に変更したのは誰かを示していますが、実際にはトークンを含む最初のコミットを見つけたいと思っています。

4

5 に答える 5

28

いくつかの方法が考えられます。

  • git blame、または適切なコミットが見つかるまで履歴をさかのぼって、行の履歴を参照するためのより優れたグラフィカルな非難ツール (git gui blameまたは / gitweb の非難ビューなど)。git instaweb

  • いわゆる「つるはし検索」、つまりgit log -S適切なトークン/正規表現を使用して、特定のトークンの数が変更されたすべてのコミットを検索 (リスト) します (通常、特定のトークンが追加または削除された場所を意味します)。

    git log --reverse -p -S'const int foobar' -- A.cpp
    
  • git bisectここで、「悪い」コミットとは、あるべきではない「const」を持つコミットを意味します(たとえば、grepを使用したテスト)。

于 2009-12-08T01:31:20.677 に答える
13

git bisectが探しているものです。このコマンドを使用すると、const を導入したコミットをすばやく見つけることができます。

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

于 2009-12-07T22:43:09.217 に答える
4

変更は常に の 15 行目にあるとは限らないA.cppため、周囲のコンテキストを使用してください。の定義だったとしましょうconst int foobar:

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

これは、現在のブランチ上のすべてのコミットを前方に検索しA.cpp、問題のあるパターンを含む最初のコミットを見つけます。出力は、コミットの SHA-1 と、そのリビジョンの一致する行になりA.cppます。

コミットがわかったら、作成git show者を知るために使用します。

于 2009-12-07T23:02:50.653 に答える
1

これにはQGitを使用し、関心のある行を選択してフィルタリングすると、その行の変更のリストのみが表示されます. 1 行の場合、いくつかのリビジョンを飛び回る必要はありません。

経由:

  • リポジトリで QGit を開く
  • ツリービューを開く
  • ファイルを見つける
  • 行を見つける
  • 関心のある行を選択
  • 「選択した行のフィルター リビジョン」ボタンを押すと、じょうごのように見えます。
于 2009-12-07T22:40:14.963 に答える
1

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

于 2009-12-07T22:41:44.850 に答える