In following example tree:
A-B-C-D-E (master branch)
\\
F-G-H (xxx branch)
I\'m looking for F - the first commit in xxx branch. I
git cherry master -v | head -n 1
git cherry master -v | tail -1
however this will only give you the first commit on branch xxx that is not in master, not the first commit on branch xxx ever. the latter would be difficult if branch xxx has been deleted and/or re-created one or more times. it that case you could try the following:
git reflog | grep checkout | grep xxx | tail -1
If your branch (old one) once again merged back to master doesn't give expected result.I have using python script to find initial branch commit Id.
git rev-list --first-parent changeset
--first-parent follow only the first parent commit upon seeing a merge commit.
Iterate changeset's from above command until parent branch found.
def status_check(exec_command, exec_dir=None, background=False):
if exec_dir:
os.chdir(exec_dir)
res = subprocess.Popen(exec_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if not background:
result = res.communicate()
return result
def findNewBranchCommits(changeset=None):
cmd = "git rev-list --first-parent "+ changeset
rev_list = status_check(cmd,self.module_dir)
rev_list = str(rev_list[0]).split('\n')
rev_list = list(filter(None, rev_list))
for x in rev_list: # Iterate until branch base point
rev_cmd = "git branch --contains " + x
rev_cmd = status_check(rev_cmd,self.module_dir)
rev_cmd = str(rev_cmd[0]).split('\n')
if(len(rev_cmd) > 2):
print "First Commit in xxx branch",x
break
findNewBranchCommits(changeset)
You should use the merge-base
functionality which is designed to solve exactly this:
git merge-base remotes/origin/<branch> develop
git log master..branch --oneline | tail -1
Where "branch" is your specific branch name. The dot-dot gives you all of the commits that the branch has that master doesn't have. tail -1
returns the last line from the previous output.
I tried this command and it worked:
git log <source_branch> <feature_branch> --oneline | tail -1