git branch --no-merged - PullRequest
       2

git branch --no-merged

0 голосов
/ 25 октября 2018

У меня есть 2 основные ветви master & archive.Если какая-то работа была приостановлена, и в будущем она может понадобиться, я заархивирую эту работу, объединив ее в ветку archive.Маркировка незаконченной работы, которую необходимо сохранить, не подходит для меня из-за некоторых проблем с маркировкой.

Я хочу выяснить ветви, которые не объединены ни в одной из двух ветвей (branch1 & branch2).Я хотел бы запустить что-то вроде

git branch -a --no-merged branch1 branch2

Когда я бегу таким образом, это вроде как работает, но результат не то, что мне нужно.Я знаю одну ветку, которая не была объединена ни с одной из этих двух веток, и она мне вообще ничего не возвращает.Когда я начинаю играть с двумя другими ветками, он возвращает некоторые результаты.

Более подробный пример

FC-o-o(b3)-o-o(b1)
  \         /
   o-o-o(b4)
   |\
   | o-o(b6)-o-o-o(b2)
   |  \       /
   |   o-o(b7)
   |     
   o-o(b5)             

FC - first commit
o - a commit
o(bN) - a branchN(one of the branch1,...,branch7) at a certain commit

Итак, если я запускаю оператор

git branch -a --no-merged branch1 branch2

Я хотелчтобы получить одну отдельную ветку5, потому что она не была объединена ни с одной из двух ветвей branch1 и branch2.Обратите внимание, что я не нашел ничего в документации, что должно произойти, если я укажу 2 ветки после --no-merged.Это именно то, что я пытался запустить, чтобы проверить, даст ли это то, что я ожидаю.

branch3, branch4, branch6 и branch7 отсутствуют в выводе, потому что

  • branch3 изменяетсянаходятся в филиале1
  • филиал4 был объединен с филиалом1
  • филиал6 изменения находятся в филиале2
  • филиал7 был объединен в филиал2

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Возможно, есть более простой способ сделать это, но я не нашел ни одного в прошлый раз, когда проверял, поэтому я придумал этот фрагмент сценария.Он отформатирован как «псевдоним» для помещения в файл 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
0 голосов
/ 25 октября 2018

Я не знаю, помогает ли это вам, но вы также можете попытаться показать разницу коммитов из branch1 и branch2 командой: git log branch1..branch2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...