git branching-and-merging git-merge

Как найти ветки Git со статусом unmerged?

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

263
5
5 ответов

Попробуйте так:

git branch --merged master

Он делает то, что написано на tin (перечисляет ветви, которые были объединены в master). Вы также можете подтянуть ресерс этой команды:

git branch --no-merged master

Если Вы не укажите ветку master

git branch --merged

то он покажет вам ветки, которые были объединены в текущий HEAD (так что если Вы на мастере, то это эквивалентно первой команде; если вы на foo, то это эквивалентно git branch --merged foo).

Вы также можете сравнить ветки вверх по течению, указав флаг -r и ссылку для сравнения, которые могут быть локальными или удаленными:

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

Также можно использовать параметр -r для отображения удаленных ветвей, которые не были объединены в мастер:

git branch -r --merged master

git branch -r --no-merged

Если ветка уже слита, то повторное слияние ничего не даст. Так что вам не нужно беспокоиться о "повторном слиянии" уже слитых ветвей.

Чтобы ответить на ваш вопрос, вы можете просто выполнить

 git branch --merged

чтобы увидеть слитые ветки или

 git branch --no-merged

чтобы увидеть не слитые ветки. Ваша текущая ветка используеться по умолчанию, но при желании Вы можете указать другие ветки.

 git branch --no-merged integration

покажет вам ветки, которые еще не объединены в ветвь integration.

Следующий скрипт найдет все ветви 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

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;