Возможно, есть более простой способ сделать это, но я не нашел ни одного в прошлый раз, когда проверял, поэтому я придумал этот фрагмент сценария.Он отформатирован как «псевдоним» для помещения в файл gitconfig.Если вам это не интересно, удалите очевидный префикс псевдонима и '!'в начале и && true в конце.
[alias]
unmer-excl = !git rev-list --all --no-merges --not `git rev-parse HEAD` $* | xargs -L1 git name-rev | grep -oE '[0-9a-f]{40}\\s[^\\~\\^]*' | grep -vE '\\stags/' && true
Название этого слова означает " git unmer ged- excl usive".
При добавлении к псевдонимам эта команда работает следующим образом:
git unmer-excl
# ^ give me all not yet merged into current branch
111111 feature1
444444 feature1
222222 remotes/origin/experiment2
555555 remotes/origin/infrastructure
888888 remotes/origin/experiment2
333333 feature1
999999 remotes/origin/experiment2
, как видите, эта команда выводит список коммитов вместе с их лучшими - угадал название филиалаВы можете добавить ветви, чтобы исключить:
git unmer-excl feature1 origin/experiment2
# ^ ...excluding anything that was already merged into feature1 or experiment2
555555 remotes/origin/infrastructure
Это исключает не только свежее содержимое в указанных ветвях, но и все, что уже было объединено в эту ветвь.
Выходные данные перечислены в порядке, отсамый последний коммит на самый старый.Вот почему это обычно выглядит некрасиво, если вы к этому не привыкли, но преимущества заключаются в следующем:
- самые последние сначала!
- показывает коммиты, поэтому вы видите, «сколько работы»"ожидает слияния (несколько строк идентификаторов коммитов? пятнадцать экранов?)
простой вывод, легко вырезать | cut -d' ' -f2 | sort | uniq
, и вы получите список неслитых веток
git unmer-исключая |cut -d '' -f2 |сортировать |uniq feature1 пульты / origin / эксперимент2 пульты / origin / инфраструктура
Что касается последнего, вы можете даже добавить его до && true для псевдонима, я не хотел его по умолчанию, поскольку это делает это, простая сортировка повреждений по самым последним и использует простую сортировку имен вместо.
Для вашего исходного примера:
FC-01-02(b3)-03-04(b1)
\ /
05-06-07(b4)
|\
| 08-09(b6)-10-11-12(b2)
| \ /
| 13-14(b7)
|
15-16(b5)
Я изменил o
с номерами коммитов для лучшегоудостоверение личности.Приведенные ниже примеры могут отличаться по выходным параметрам в порядке упорядочения элементов и имен веток (если коммит № 14 может быть помечен как B2 или B4 и т. Д.)
git checkout (somewhere not on B5)
git unmer-excl b1 b2 | cut -d' ' -f2 | sort | uniq
b5
git checkout b4
git unmer-excl | cut -d' ' -f2 | sort | uniq
b1
b2
b5
git checkout FC
git unmer-excl b1 b2
15 b5
16 b5
git checkout b6
git unmer-excl b3 b4
03 b1
04 b1
10 b2
11 b2
12 b2
13 b2
14 b2
15 b5
16 b5