How to list branches that contain a given commit?

前端 未结 3 1731
闹比i
闹比i 2020-11-22 02:23

How can I query git to find out which branches contain a given commit? gitk will usually list the branches, unless there are too many, in which case it just say

相关标签:
3条回答
  • 2020-11-22 02:59

    From the git-branch manual page:

     git branch --contains <commit>
    

    Only list branches which contain the specified commit (HEAD if not specified). Implies --list.


     git branch -r --contains <commit>
    

    Lists remote tracking branches as well (as mentioned in user3941992's answer below) that is "local branches that have a direct relationship to a remote branch".


    As noted by Carl Walsh, this applies only to the default refspec

    fetch = +refs/heads/*:refs/remotes/origin/*
    

    If you need to include other ref namespace (pull request, Gerrit, ...), you need to add that new refspec, and fetch again:

    git config --add remote.origin.fetch "+refs/pull/*/head:refs/remotes/origin/pr/*"
    git fetch
    git branch -r --contains <commit>
    

    See also this git ready article.

    The --contains tag will figure out if a certain commit has been brought in yet into your branch. Perhaps you’ve got a commit SHA from a patch you thought you had applied, or you just want to check if commit for your favorite open source project that reduces memory usage by 75% is in yet.

    $ git log -1 tests
    commit d590f2ac0635ec0053c4a7377bd929943d475297
    Author: Nick Quaranto <nick@quaran.to>
    Date:   Wed Apr 1 20:38:59 2009 -0400
    
        Green all around, finally.
    
    $ git branch --contains d590f2
      tests
    * master
    

    Note: if the commit is on a remote tracking branch, add the -a option.
    (as MichielB comments below)

    git branch -a --contains <commit>
    

    MatrixFrog comments that it only shows which branches contain that exact commit.
    If you want to know which branches contain an "equivalent" commit (i.e. which branches have cherry-picked that commit) that's git cherry:

    Because git cherry compares the changeset rather than the commit id (sha1), you can use git cherry to find out if a commit you made locally has been applied <upstream> under a different commit id.
    For example, this will happen if you’re feeding patches <upstream> via email rather than pushing or pulling commits directly.

               __*__*__*__*__> <upstream>
              /
    fork-point
              \__+__+__-__+__+__-__+__> <head>
    

    (Here, the commits marked '-' wouldn't show up with git cherry, meaning they are already present in <upstream>.)

    0 讨论(0)
  • 2020-11-22 03:01

    The answer for git branch -r --contains <commit> works well for normal remote branches, but if the commit is only in the hidden head namespace that GitHub creates for PRs, you'll need a few more steps.

    Say, if PR #42 was from deleted branch and that PR thread has the only reference to the commit on the repo, git branch -r doesn't know about PR #42 because refs like refs/pull/42/head aren't listed as a remote branch by default.

    In .git/config for the [remote "origin"] section add a new line:

    fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
    

    (This gist has more context.)

    Then when you git fetch you'll get all the PR branches, and when you run git branch -r --contains <commit> you'll see origin/pr/42 contains the commit.

    0 讨论(0)
  • 2020-11-22 03:06

    You may run:

    git log <SHA1>..HEAD --ancestry-path --merges
    

    From comment of last commit in the output you may find original branch name

    Example:

           c---e---g--- feature
          /         \
    -a---b---d---f---h---j--- master
    
    git log e..master --ancestry-path --merges
    
    commit h
    Merge: g f
    Author: Eugen Konkov <>
    Date:   Sat Oct 1 00:54:18 2016 +0300
    
        Merge branch 'feature' into master
    
    0 讨论(0)
提交回复
热议问题