Git tracking block of code moved/removed in a file

I have an old commit md5hash on myfile.extension with SOME CHANGE in the commit body (not the commit title/metadata).

How can I generate a list of commits with SOME CHANGE modified (not just present) in the commits leading up to HEAD from md5hash without having to inspect each diff? (of which there are unfortunately many in the current case.)

  • Git: Generate patch of all commits made on “feature” branch without referring to commit IDs
  • git svn dcommit always fails with “Cannot dcommit with a dirty index.”
  • How can I remove my last commit in my local git repository
  • git rebase remote, but keep changes locally for later commit
  • Only allow validated commits on master
  • eclipse errors when try to change to master git branch
  • I tried git rev-list --all | xargs git grep 'SOME CHANGE' but this seems to find all the commits with SOME CHANGE which is in the file.

    git blame seems useless as the lines have changed and SOME CHANGE has moved.

  • bitbucket branch or repository or folders?
  • Git merging within a line
  • Atom editor locking git
  • Cleaning my git branch of features in development
  • Git merge flattening
  • How to checkout jetty util jetty-util-8.1.17.v20150415 from git
  • 3 Solutions collect form web for “Git tracking block of code moved/removed in a file”

    I think the answer you’re looking for is git --no-pager log --pretty="%H" -G"SOME CHANGE" -- myfile.extension.

    At first I thought of git log -S but it only covers add/remove. git log -G would probably be close to what you want. Here you can see the difference between -S and -G, and I’ve included the full commit history as well so you can see what’s not covered. Read the commit messages for a description of what I did in the body.

    # git --no-pager log --oneline -S"SOME CHANGE"
    12e24ed Remove text
    9427ffc Add the text
    # git --no-pager log --oneline -G"SOME CHANGE"
    12e24ed Remove text
    6a33653 Change other text on same line
    ac09bbb Append other text to same line
    484b447 Move the text two lines down
    9427ffc Add the text
    # git --no-pager log --oneline
    12e24ed Remove text
    9c7f7d5 Change text on adjacent line
    6a33653 Change other text on same line
    ac09bbb Append other text to same line
    484b447 Move the text two lines down
    377936f Add other text on adjacent line
    9427ffc Add the text
    1929648 Initial commit
    

    To get it with just the hashes:

    # git --no-pager log --pretty="%H" -G"SOME CHANGE"
    12e24ed749e499bc2d8920c5d8a3ca98a6422e3f
    6a336532210ca85dea86968c34cef516345b8ab4
    ac09bbb5c95bbea65e7c99c730653d27f90397f4
    484b4478e4cb16c839dac558f3e958683b428a64
    9427ffc7dd60a3cfb1d9880083e6262faea0eefb
    

    This would still require a bit of wading through results, but this may get you closer:

    git rev-list --all | xargs git show | egrep '(^ ?[+-].*(SOME CHANGE)|^commit)' | egrep -B1 '^ ?[+-]' | uniq
    

    This shows the patch for each commit, shows the sha it’s looking at, and then spits out the line of code that matches. The relevant sha for the match is above the match.

    You could further the pipeline to cleanup the results even more if this is a viable way to go.

    I think you are looking for:

    git log -S<string>
    

    Look for differences that change the number of occurrences of the specified string (i.e. addition/deletion) in a file. Intended for the scripter’s use.

    It is useful when you’re looking for an exact block of code (like a struct), and want to know the history of that block since it first came into being: use the feature iteratively to feed the interesting block in the preimage back into -S, and keep going until you get the very first version of the block.

    Git Baby is a git and github fan, let's start git clone.