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 says "many (38)" or something like that. I need to know the full list, or at least whether certain branches contain the commit.
-
5See also: How to list all tags that contain a commit?.Andrew Marshall– Andrew Marshall2013-01-18 17:51:30 +00:00Commented Jan 18, 2013 at 17:51
-
Related question for an equivalent commit per comments: stackoverflow.com/questions/16304574/…UpAndAdam– UpAndAdam2015-02-25 16:38:30 +00:00Commented Feb 25, 2015 at 16:38
3 Answers
From the git-branch manual page:
git branch --contains <commit>
Only list branches which contain the specified commit (HEAD if not specified). Implies
--list. (Use'-a'option before'--contains'to look in all branches that you haven't checked out. e.g.git branch -a --contains <commit>)
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
--containstag 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 <[email protected]>
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 cherrycompares the changeset rather than the commit id (sha1), you can usegit cherryto 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>.)
18 Comments
tests and master - master is the current branch, therefore the asterisk.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." kernel.org/pub/software/scm/git/docs/git-cherry.html-a parameter to also check remote branches.git tag --contains <commit>. See Searching for all tags that contain a commit?.git cherry part @UpAndAdam asked the question here: stackoverflow.com/questions/16304574/…, alas, the question has not (yet) been answered.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
5 Comments
git log <SHA1>..master --ancestry-path --merges --oneline | tail -n1 to get this in one linegit log <SHA1>..master --ancestry-path --merges --oneline -1A..B commit range, just dont use a range like so:: git log HEAD --oneline -1 > 82c12a9 (HEAD, origin/remote-branch-name, origin/master, origin/dev, origin/HEAD, master, dev) commit message.master is always preferred if it's in this list. From there it's less clear. You could try and read git branch from .gitmodules file: git config -f .gitmodules submodule.src/foo/submodule.branch. This could be a long standing fork/pr. You can cd to repo root and run git config submodule.src/foo/submodule.branch. You can also use the superprojects current git branch.git config submodule.src/foo/submodule.branch Can be influenced by any variety of git configs, including a repo-local .gitconfig file. (requires running git config --local include.path ./path/to/your/.gitconfig)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.
1 Comment
git commit --add.