111

Gitリポジトリのファイルに削除された行があります。欠落しているテキストの一部とそれが含まれているファイルを知っていたので、を使用しgit log -S'missingtext' /path/to/fileました。

ただし、戻ってきたのは、欠落しているテキストを含む行を追加したコミットだけでした。テキストはHEADに存在せず、それを追加したコミットが私のブランチに存在していたので、私のブランチの履歴にあるコミットの1つがテキストを削除したに違いないことを知っていましたが、表示されませんでした。

手動で検索したところ、マージの競合を解決しているときに誤って行が削除されたことが判明しました。だから私は疑問に思っています:

  1. これが、pickaxeが行を削除したコミットを見つけられなかった理由ですか?
  2. 履歴を手動で調べずに、「欠落しているテキスト」が削除された場所をどのように見つけることができますか?

#1についての洞察は素晴らしいでしょう(私はそれgit log -Sが私の答えを与えると思いました)が、将来これを避けたいので、私の本当の質問は#2です。

4

3 に答える 3

148

git log -c -S'missingtext' /path/to/file

git logデフォルトでは、マージコミットの差分は表示されません。-cまたは--ccフラグを試してください。

詳細なディスカッション/説明:
https :
//git-scm.com/docs/git-log nabble.com

git-logドキュメントから:

-cこのオプションを使用すると、マージコミットのdiff出力は、親と結果のペアごとの差分を一度に表示するのではなく、各親からの差分をマージ結果に同時に表示します。さらに、すべての親から変更されたファイルのみが一覧表示されます。

--ccこのフラグは、-cオプションを意味し、親のコンテンツに2つのバリアントしかなく、マージ結果が変更なしでそのうちの1つを選択する、興味のないハンクを省略して、パッチ出力をさらに圧縮します。

于 2012-09-25T21:47:56.123 に答える
22

スーパーユーザーにはこれに対する素晴らしい答えがあります: Git:どのコミットが行を削除したかを見つけるにはどうすればよいですか?

git blame --reverse START.. file.ext

これにより、各行について、その行が存在した最後のコミット(たとえば、ハッシュ0123456789)が表示されます。次に続くコミットは、それを削除したコミットになります。git logハッシュ0123456789を使用して検索し、その後のコミットを実行します。

于 2017-04-18T04:37:34.127 に答える
6

迅速で汚い方法#2-forループを使用します。

for commit in $(git log --pretty='%H'); do
    git diff -U0 --ignore-space-change "$commit^" "$commit" | grep '^-.*missingtext' > /dev/null && echo "$commit"
done

これには、diffのベースコミットが明示的に指定されているため、すべてのマージ変更が含まれます。私はこれを思いついたgit log -c -S...のは、私にたくさんの誤検知を与えていたからです。また、最初のgit logコマンドでファイルパスを指定すると、探していたコミットがスキップされました。

これはしばらくの間実行される可能性があるため-n、コマンドで指定するか、結果が1つだけ必要な場合はループの最後にをgit log置くことができます。&& break

于 2015-04-07T01:55:02.237 に答える