How to find commit when line was deleted/removed?

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

git log doesn't show a diff for merge commits by default. Try the -c or --cc flags.

More discussion/explanation:
https://git-scm.com/docs/git-log
nabble.com

From the git-log docs:

-c With this option, diff output for a merge commit shows the differences from each of the parents to the merge result simultaneously instead of showing pairwise diff between a parent and the result one at a time. Furthermore, it lists only files which were modified from all parents.

--cc This flag implies the -c option and further compresses the patch output by omitting uninteresting hunks whose contents in the parents have only two variants and the merge result picks one of them without modification.


Quick and dirty way #2 - use a for loop.

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

This will include all merge changes because it explicitly specifies the base commit for the diff. I came up with this because git log -c -S... was giving me a bunch of false-positives. Also, when I specified a filepath in the initial git log command, it skipped the commit I was looking for.

Since this may run for a while, you can specify -n on the git log command or put an && break at the end of the loop if you only need 1 result.


There is a great answer to this on Super User: Git: How do I find which commit deleted a line?

git blame --reverse START.. file.ext

This will show, for each line, the last commit where the line was present - say hash 0123456789. The next commit to follow will be the one which removed it. Use git log and search for hash 0123456789 and then its successor commit.

Tags:

Git

Git Log