マージコミットに隠された変更について
マージコミットでは、Gitログ出力から変更が自動的に非表示になります。つるはしと逆責めの両方で変更は見つかりませんでした。だから私が欲しかった行が追加されて後で削除され、それを削除したマージを見つけたかったのです。ファイルgit log -p -- path/file
履歴には、追加されていることが示されているだけです。これが私が見つけた最良の方法です:
git log -p -U9999 -- path/file
変更を検索してから、「^ commit」を逆方向に検索します。最初の「^ commit」は、ファイルに最後にその行があったコミットです。2番目の「^ commit」は非表示になった後です。2番目のコミットはそれを削除したものかもしれません。これ-U9999
は、ファイルがすべて最大9999行であると想定して、(ファイルが変更されるたびに)ファイルの内容全体を表示するためのものです。
ブルートフォースを介して関連するマージを検索します(可能な各マージコミットを最初の親と比較し、大量のコミットに対して実行します)
git log --merges --pretty=format:"git diff %h^...%h | grep target_text" HEAD ^$(git merge-base A B) | sh -v 2>&1 | less
(リビジョンフィルターをさらに制限してみましたが、問題が発生したためお勧めしません。探していた追加/削除の変更は、異なる時点でマージされた異なるブランチにあり、A ... Bには含まれていませんでした変更が実際にメインラインにマージされたとき。)
次の2つのコミットを使用してGitツリーを表示します(複雑なGit履歴の多くを削除します)。
git log --graph --oneline A B ^$(git merge-base A B)
(Aは上記の最初のコミット、Bは上記の2番目のコミットです)
Aの履歴とBの履歴からAとBの両方の履歴を差し引いたものを表示します。
代替バージョン(通常のGit履歴ツリーではなく、より直線的にパスを表示するように見えますが、通常のgit履歴ツリーを好みます):
git log --graph --oneline A...B
2つのドットではなく3つ-3つのドットは「r1 r2 --not $(git merge-base --all r1 r2)を意味します。これは、r1(左側)またはr2(右側)のいずれかから到達可能なコミットのセットです。サイド)、しかし両方からではありません。」-ソース: "man gitrevisions"
git log -S<string> /path/to/file
-c
-cc