查找未合并的Git分支?


276

我有一个包含许多分支的Git存储库,其中有些已经合并,有些还没有。由于分支的数量很大,如何确定尚未合并的分支?我想避免不得不进行“章鱼”合并和重新合并已经合并的分支。


1
首先,我在笑“章鱼合并”这个词。但是,如果您不知道像我这样的人:这是合并策略的正式名称:-)参见git-scm.com/docs/git-mergeatlassian.com/de/git/tutorials/using-branches/合并策略
观察员

Answers:


462

试试这个:

git branch --merged master

它会按照锡上的指示执行操作(列出已合并到中的分支master)。您也可以使用以下公式来反过来:

git branch --no-merged master

如果不指定master,例如。

git branch --merged

然后它将向您显示已合并到当前分支中的分支HEAD(因此,如果打开master,则等效于第一个命令;如果打开foo,则等效于git branch --merged foo)。

您还可以通过指定-r标志和要检查的引用来比较上游分支,可以是本地的也可以是远程的:

git branch -r --no-merged origin/master

5
如果您合并foomaster,它将出现在git branch --merged master列表中。但是,如果再次承诺会发生什么foo呢?它不再出现在该列表中,还是出现,即使它具有新的提交,但在某一时刻被合并到其中master
Craig Otis 2013年

11
@CraigOtis它将不再出现在列表中。--merged仅列出完全合并到给定分支中的分支。
2013年

并向gitk --remotes --not origin/master您显示尚未合并到master的每个分支上的提交。
yoyo

5
想象一下...一个易于理解和使用的git答案!
jleach

1
有没有一种方法可以在不检出分支的情况下获取列表?喜欢指向服务器然后获取列表?
xbmono19年

57

您还可以使用-r参数显示未合并到master中的远程分支:

git branch -r --merged master

git branch -r --no-merged

19
-a同时查看偏远地区和本地地区
Simon Forsberg 2014年

1
最后一个应该是git branch -r --no-merged master吗?
MortimerCat

28

如果分支已经合并,则再次合并将不会执行任何操作。因此,您不必担心已经合并的“重新合并”分支。

要回答您的问题,您只需发出

 git branch --merged

查看合并的分支机构或

 git branch --no-merged

看到未合并的分支。隐含当前分支,但您可以根据需要指定其他分支。

 git branch --no-merged integration

将显示尚未合并到integration分支的分支。


1

下面的脚本将查找origin/*当前分支之前的所有分支

#!/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

脚本的最新版本


0
Below script will fetch you unmerged branches and write results in .xls file 
#!/usr/bin/env bash
echo "getting list of unmerged_branches from the remote"
file_name=unmerged_branches.xls`enter code here`
current_time=$(date "+%Y.%m.%d-%H.%M.%S")
for branch in `git branch -r --no-merged | grep -v HEAD`;
do echo -e `git show --format="%cd  \\t%cr  \\t%ae" $branch | head -n 1` \\t$branch; 
done | sort -r >> $current_time.$file_name
echo "result is writtein in ";
echo $current_time.$file_name;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.