Как свернуть ветки при выполнении `git log --graph`? - PullRequest
0 голосов
/ 30 октября 2019

Можно ли свернуть полностью объединенные ветви при использовании git log --graph?

Вместо отображения git log --graph --branches:

*   16bb2c5 (HEAD, dev) Merge branch f
|\
| * 4571fbd Commit 14
| * de845ac Commit 13
|/
| * aba23a5 (branch e) Commit 12
|/
*   305d031 Merge branch c
|\
| | * 80c47c6 (branch d) Commit 11
| | * dbc182e Commit 10
| | * 18bb013 Commit 9
| |/
| * 879e64a Commit 8
| * b9a1413 Commit 7
| * ddd92f9 Commit 6
|/
*   2e94cc8 Merge branch b
|\
| * 852ddaf Commit 5
| * 88cdaf9 Commit 4
| * d1d7c7b Commit 3
|/
| * bd1557a (branch a) Commit 2
|/
o e740474 (master) Commit 1

С ветвями a и cбыли полностью объединены (и удалены, поэтому --branches не пытается их показать), я хотел бы иметь (с комментариями # COLLAPSED или без них):

*   16bb2c5 (HEAD, dev) Merge branch f ### COLLAPSED
| * aba23a5 (branch e) Commit 12
|/
*   305d031 Merge branch c
|\
| | * 80c47c6 (branch d) Commit 11
| | * dbc182e Commit 10
| | * 18bb013 Commit 9
| |/
| * 879e64a Commit 8 ### DO NOT COLLAPSE THOSE COMMITS SINCE BRANCH D ISN'T MERGED
| * b9a1413 Commit 7
| * ddd92f9 Commit 6
|/
*   2e94cc8 Merge branch b ### COLLAPSED
| * bd1557a (branch a) Commit 2
|/
o e740474 (master) Commit 1


Мое использованиеДело в следующем. Я хотел бы иметь псевдоним для отображения всех локальных коммитов, которые я еще не слил, из списка локальных веток, начиная с master, если только они не являются потомками первого родителя (рекурсивно) dev. РЕДАКТИРОВАТЬ: Цель состоит в том, чтобы дифференцировать то, что интегрировано, и то, что все еще находится в процессе исследования.

Обратите внимание, что git log --graph --branches --first-parent отображает все коммиты, которые я хочу, но не включает связи между всемивидимые родители всех коммитов (879e64a Commit 8 не связан как второй родительский элемент 305d031 Merge branch c).

*   16bb2c5 (HEAD, dev) Merge branch f
| * aba23a5 (branch e) Commit 12
|/
*   305d031 Merge branch c ### MISSING LINK WITH 879e64a Commit 8
| * 80c47c6 (branch d) Commit 11
| * dbc182e Commit 10
| * 18bb013 Commit 9 
| * 879e64a Commit 8 ### MISSING LINK WITH 305d031 Merge branch c
| * b9a1413 Commit 7
| * ddd92f9 Commit 6
|/
*   2e94cc8 Merge branch b
| * bd1557a (branch a) Commit 2
|/
o e740474 (master) Commit 1

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Я нашел хакерский способ сделать это (и он поддерживает цвета).

Я добавил следующий псевдоним в ~/.gitconfig

graph = !sh -c '~/scripts/gitgraph --boundary master..  "$@"' -

, и я создал следующий скриптв ~/scripts/gitgraph

#!/usr/bin/env sh
# Display a graph of all umerged branches
# All arguments will be passed to git log

# Use color if output is not connected to a terminal
COLOR=''
[ -t 1 ] && COLOR='--color'

# Note: each ASCII_CODES create two capture group
ASCII_CODES="$(printf "\\\\(\\\\(\033\\\\[[^m]*m\\\\)*\\\\)")"·

#1: Replace color of |\ and |/
#2: Display first-parents
#3: Display non-merged commits whitch aren't first-parents
#4: Replace commit message of merged commits witch aren't first parents with "..."
#uniq: Squash multiples consecutive lines created by #4
git log --graph --oneline --decorate --branches ${COLOR} "$@" | sed -n \
    -e "s/^${ASCII_CODES}|${ASCII_CODES}\\([\\\\\\/]\\)${ASCII_CODES} */\\1|\\5\\6/p" \
    -e "/^${ASCII_CODES}|${ASCII_CODES}\\\\/ , /^${ASCII_CODES}|${ASCII_CODES}\\// "'!p' \
    -e "/^${ASCII_CODES}|${ASCII_CODES}\\\\/ , /^${ASCII_CODES}|${ASCII_CODES}\\// { /^${ASCII_CODES}|${ASCII_CODES} \\*/"' !p }' \
    -e "/^${ASCII_CODES}|${ASCII_CODES}\\\\/ , /^${ASCII_CODES}|${ASCII_CODES}\\// { s/^${ASCII_CODES}|${ASCII_CODES} \\*.*/\\1| ...\\3/p }" \
| uniq 

Пример (примечание: префиксы # 1 - # 4 соответствуют строке в sed, которая будет их изменять)

#1 * 87842c1 Commit 17
#1 * 1ab18c1 Commit 16
#1 *   16bb2c5 (HEAD, dev) Merge branch f
#2 |\
#4 | * 4571fbd Commit 15
#4 | * de845ac Commit 14
#2 |/
#3 | * 12afeee (branch e) Commit 13
#3 | * aba23a5 Commit 12
#2 |/
#1 *   305d031 Merge branch c
#2 |\
#3 | | * 80c47c6 (branch d) Commit 11
#3 | | * dbc182e Commit 10
#3 | | * 18bb013 Commit 9
#3 | |/
#4 | * 879e64a Commit 8
#4 | * b9a1413 Commit 7
#4 | * ddd92f9 Commit 6
#2 |/
#1 *   2e94cc8 Merge branch b

станет

* 87842c1 Commit 17
* 1ab18c1 Commit 16
*   16bb2c5 (HEAD, dev) Merge branch f
|\
| * 4571fbd Commit 15
| * de845ac Commit 14
|/
| * 12afeee (branch e) Commit 13
| * aba23a5 Commit 12
|/
*   305d031 Merge branch c
|\
| | * 80c47c6 (branch d) Commit 11
| | * dbc182e Commit 10
| | * 18bb013 Commit 9
| |/
| * ...
|/
*   2e94cc8 Merge branch b

0 голосов
/ 30 октября 2019

все локальные коммиты, которые я еще не выдвинул

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

Лучшей стратегией могло бы быть сравнение ветвей и использование этой информации в качестве основы для принятия решения о том, что необходимо интегрировать.

Таким образом, вы могли бы толкнуть все (да! Теперь это безопасно).


Впереди / позади

Вы могли бы оформить Git вперед / позади информации между мастером и веткой? .

Некоторые онлайн-инструменты дают «вперед» / «позади» для каждой ветви «бесплатно»:

enter image description here

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