How to grep (search) committed code in the Git history

后端 未结 15 1234

I have deleted a file or some code in a file sometime in the past. Can I grep in the content (not in the commit messages)?

A very poor solution is to grep the log:

15条回答
  •  旧时难觅i
    2020-11-22 06:59

    To search for commit content (i.e., actual lines of source, as opposed to commit messages and the like), you need to do:

    git grep  $(git rev-list --all)
    

    git rev-list --all | xargs git grep will work if you run into an "Argument list too long" error.

    If you want to limit the search to some subtree (for instance, "lib/util"), you will need to pass that to the rev-list subcommand and grep as well:

    git grep  $(git rev-list --all -- lib/util) -- lib/util
    

    This will grep through all your commit text for regexp.

    The reason for passing the path in both commands is because rev-list will return the revisions list where all the changes to lib/util happened, but also you need to pass to grep so that it will only search in lib/util.

    Just imagine the following scenario: grep might find the same on other files which are contained in the same revision returned by rev-list (even if there was no change to that file on that revision).

    Here are some other useful ways of searching your source:

    Search working tree for text matching regular expression regexp:

    git grep 
    

    Search working tree for lines of text matching regular expression regexp1 or regexp2:

    git grep -e  [--or] -e 
    

    Search working tree for lines of text matching regular expression regexp1 and regexp2, reporting file paths only:

    git grep -l -e  --and -e 
    

    Search working tree for files that have lines of text matching regular expression regexp1 and lines of text matching regular expression regexp2:

    git grep -l --all-match -e  -e 
    

    Search working tree for changed lines of text matching pattern:

    git diff --unified=0 | grep 
    

    Search all revisions for text matching regular expression regexp:

    git grep  $(git rev-list --all)
    

    Search all revisions between rev1 and rev2 for text matching regular expression regexp:

    git grep  $(git rev-list ..)
    

提交回复
热议问题