'How do I determine the source branch of a particular branch?

I have a branch in git and want to figure out from what branch it originally was branched and at what commit.

Github seems to know, since when you do a pull request it usually automatically sets up what branch it should go into, but I can't figure out how to do this manually from the command line.

Let me add a concrete example:

master -- ongoing development
2.2    -- stable maintenance

A feature branch feature was created (at commit B below) and worked on (B', C' & E') and merged against the source branch to pick up C and D

 feature branch:    B'-C'-C--D--E'
                   /     /       
 source branch: A--B--C--D--E-- ...

Now I want to merge feature back into its source, but I am not sure whether it was originally a branch off master or 2.2. In order to merge the feature into the correct source, is there a programmatic way to find out if source branch is master or 2.2?



Solution 1:[1]

git show-branch [--all]
git merge-base

The first will show you branches and give you merge information. The second will help you understand the relationship between two specific branches (where they last diverged).

Solution 2:[2]

git branch -r

With --contains, shows only the branches that contain the named commit (in other words, the branches whose tip commits are descendants of the named commit). With --merged, only branches merged into the named commit (i.e. the branches whose tip commits are reachable from the named commit) will be listed. With --no-merged only branches not merged into the named commit will be listed. If the argument is missing it defaults to HEAD (i.e. the tip of the current branch).

Considering that the previous commit has been already pushed to the remote branch, you can filter available remote branches using --contains key.

# git branch -r --contains HEAD~1
  origin/HEAD -> origin/master
  origin/master

or

git branch -r --contains refs/heads/<local_branch_name>~1

If you have 2 non-pushed commits yet than change the number accordingly in order to reach already pushed commit:

# git branch -r --contains HEAD~2
  origin/<parent_remote_branch>

If the amount of local non-pushed commits is unknown you may cycle through until you get the result, for example:

#!bin/bash

i=0;
res=; 
while [ -z "$res" ]; do 
    res=$(git branch -r --contains HEAD~$i); 
    echo "$i"; 
    i=$(($i+1)); 
done

echo "$res"

Of course you can limit iterations amount to be on safe side.

Solution 3:[3]

If you've created the branch in your system, you can use git reflog to check the source branch. It will have a line indicating your checkout action. For example:

6f52daa (origin/master, origin/HEAD, master) HEAD@{4}: checkout: moving from master to sample-branch

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Seth Robertson
Solution 2 Igor Tverdovskiy
Solution 3 therealak12