- search for changes involving
foo and bar :
If you add --pickaxe-regex, the argumet to -S will be treated as a regexp :
git log --pickaxe-regex -S "foo|bar"
(see "a note about -S" below)
- search for changes involving foo and bar :
you can use git log to list all potential commits, and then refine from there (see "About your second point" below)
- include commits from archived and non-archived branches :
simply add --all to git log :
git log --all --pickaxe-regex -S "foo|bar"
About your first point :
a note about -S :
-S spots commits that change the number of lines matching the pattern. So using -S "foo|bar" (with regexes on) would overlook a commit where one line containing foo is turned into one line containing bar.
If that's not what you wish, you may be looking for -G, or you may want to make something out of the output of the two commands git log -S foo and git log -S bar.
About your second point :
if you add --pretty=%H to your git log command, you will have, as an output, only a list of hashes, for all the commits that may interest you.
To list the files within those commits that may interest you, you may either add --name-only to the git log command, or take these commits one by one, and re-run them through git diff --pickaxe-regex -S "foo|bar" --name-only <sha>.
Once you have a list of target commits, and a list of file names for all commits, you can check the content of each file within its target commit to see if it has both foo and bar within its content.
You can for example use git grep -l -e foo <sha> -- <list of files> and git grep -l -e bar <sha> -- <list of files> and combine the outputs to see what files contain both patterns.
You may also want to check the content of each file before the commit ; e.g : do you want to keep a file where foo was changed to bar ?
If such is the case, file could contain only bar in the target commit (<sha>), and could contain only foo in the parent commit : <sha>^ :
# you may want to check the content of target files in the parent commit :
git grep ... <sha>^
You will need some scripting on top of those git commands to get a complete solution.