Найти неразделенные ветви Git?

276

У меня есть Git-репозиторий со многими ветками, некоторые из которых уже объединены, а некоторые нет. Поскольку число ветвей довольно велико, как я могу определить, какие ветви еще не были объединены? Я бы хотел избежать слияния и повторного слияния осьминога, которые уже были объединены.

fluca1978
источник
1
Сначала я смеялся над термином «слияние осьминога». Но если вы не знали, как я: это официальное название стратегии слияния :-) См. Git-scm.com/docs/git-merge или atlassian.com/de/git/tutorials/using-branches/ стратегия слияния
наблюдатель

Ответы:

463

Попробуй это:

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
Если вы сливаете fooв master, он появится в git branch --merged masterсписке. Но что произойдет, если вы совершите еще раз foo? Он больше не появляется в этом списке, или он, хотя и имеет новые коммиты, в какой-то момент был объединен master?
Крейг Отис
11
@CraigOtis больше не будет отображаться в списке. --mergedперечисляет только те ветви, которые полностью объединены с данной веткой.
Январь
и gitk --remotes --not origin/masterпокажет вам коммиты на каждой ветви, которые не были объединены с мастером.
Йо
5
Вообразите это ... мерзкий ответ, который легко понять и использовать!
jleach
1
Есть ли способ получить список без проверки ветки? Как указывать на сервер, а затем получить список?
xbmono
57

Вы также можете использовать -rпараметр, чтобы показать удаленные ветви, которые не были объединены в master:

git branch -r --merged master

git branch -r --no-merged

                         
NemoXP
источник
19
или -aчтобы увидеть и удаленный и локальный одновременно
Саймон Форсберг
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

Актуальная версия скрипта

moldcraft
источник
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;
user3915489
источник