Find a Git branch containing changes to a given file

I have 57 local branches. I know I made a change to a certain file in one of them, but I’m not sure which one. Is there some kind of command I can run to find which branches contain changes to a certain file?

  • Adding Git notes to a blob
  • Git & redirections
  • git add adding ignored files
  • 'git add .' doesn't work
  • How to make Git properly display UTF-8 encoded pathnames in the console window?
  • Why does git see whole files as changed when copying files overtop of other files?
  • git reset --hard error: Could not parse object
  • `git flow release finish` non-interactively
  • How to keep git in Visual Studio from consuming constant 35% CPU?
  • Can someone explain to me what difference git diff is seeing here?
  • bad configuration option in git
  • Getting git to work with a proxy server
  • 3 Solutions collect form web for “Find a Git branch containing changes to a given file”

    Find all branches which contain a change to FILENAME (even if before the (non-recorded) branch point)

    FILENAME="<filename>"
    git log --all --format=%H $FILENAME | while read f; do git branch --contains $f; done | sort -u
    

    Manually inspect:

    gitk --all --date-order -- $FILENAME
    

    Find all changes to FILENAME not merged to master:

    git for-each-ref --format="%(refname:short)" refs/heads | grep -v master | while read br; do git cherry master $br | while read x h; do if [ "`git log -n 1 --format=%H $h -- $FILENAME`" = "$h" ]; then echo $br; fi; done; done | sort -u
    

    All you need is

    git log --all -- path/to/file/filename 
    

    If you want to know the branch right away you can also

    git log --all --format=%5 -- path/to/file/filename | xargs -I{} -n 1 echo {} found in && git branch --contains {}
    

    Further, if you had any renames, you may want to include --follow for the git log command.

    hope this helps.

    This is an inelegant brute-force method but I expect it should work. Make sure you’ve stashed any uncommitted changes first as it will switch which branch you are currently on.

    for branch in $(git for-each-ref --format="%(refname:short)" refs/heads); do
        git checkout $branch && git grep SOMETHING
    done
    
    Git Baby is a git and github fan, let's start git clone.