Find unmerged Git branches?
Asked Answered
I

4

335

I have a Git repository with many branches, some of them already merged and some not. Since the number of branches is quite large, how can I determine which branches have not yet been merged? I would like to avoid having to do an "octopus" merge and re-merging branches that have already been merged.

Icon answered 5/9, 2012 at 6:53 Comment(1)
First I was laughing about the term of the "octopus merge". But in case you didn't know, like me: That's the official name of a merge strategy :-) See git-scm.com/docs/git-merge or atlassian.com/de/git/tutorials/using-branches/merge-strategyPresentday
A
570

Try this:

git branch --merged master

It does what it says on the tin (lists branches which have been merged into master). You can also pull up the inverse with:

git branch --no-merged master

If you don't specify master, e.g...

git branch --merged

then it will show you branches which have been merged into the current HEAD (so if you're on master, it's equivalent to the first command; if you're on foo, it's equivalent to git branch --merged foo).

You can also compare upstream branches by specifying the -r flag and a ref to check against, which can be local or remote:

git branch -r --no-merged origin/master
Accoutre answered 5/9, 2012 at 6:57 Comment(8)
If you merge foo into master, it will appear in the git branch --merged master list. But what happens if you commit once more to foo? Does it no longer appear in that list, or does it, as even though it has new commits, it was at one point merged into master?Tacye
@CraigOtis It will no longer appear in the list. --merged only lists branches that are completely merged into the given branch.Accoutre
and gitk --remotes --not origin/master will show you the commits on each branch that have not been merged to master.Antiquarian
Imagine this... a git answer that's easy to understand and use!Spoilsman
Is there a way to get the list without checking out the branch? Like pointing to the server and then get the list?Dialogism
As I found, the git branch --no-merged master shows only my local branches. It doesn't show any branch that was not checked out on my computer and created by someone else.Ghats
@AntonDanilchenko which is exactly as you'd expect. If you wanted to see remote branches as well use the --all flag.Versicular
Does this correctly find branches that have been squash merged into the target branch? Frequently squashes throw off tools that need direct paths between branches to work correctly, gitversion for example.Purdah
F
83

You can also use the -r parameter to show remote branches that were not merged into master:

git branch -r --merged master

git branch -r --no-merged

                         
Foltz answered 22/4, 2014 at 16:32 Comment(2)
or -a to see both remote and local at the same timeDamali
Should that last one be git branch -r --no-merged master ?Phyletic
O
31

If a branch is merged already, merging it again won't do anything. So you don't have to be worried about "re-merging" branches that are already merged.

To answer your question, you can simply issue

 git branch --merged

to see the merged branches or

 git branch --no-merged

to see the unmerged branches. Your current branch is implied but you can specify other branches if you wish.

 git branch --no-merged integration

will show you branches that are not yet merged into integration branch.

Oration answered 5/9, 2012 at 6:57 Comment(0)
T
1

The below script will find all origin/* branches that are ahead of current branch

#!/bin/bash

CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)

echo -e "Current branch: \e[94m$CURRENT_BRANCH\e[0m"
echo ''

git branch -a | grep remotes/origin/ | while read LINE
do
    CMD="git diff --shortstat remotes/origin/${CURRENT_BRANCH}...${LINE}"

    if $CMD | grep ' file' > /dev/null; then
        echo -e "\e[93m$LINE\e[0m" | sed 's/remotes\/origin\///'
        $CMD
        echo ''
    fi
done
Transcendence answered 13/7, 2017 at 12:26 Comment(1)
Link is dead.....Auston

© 2022 - 2024 — McMap. All rights reserved.