Визуализация топологии ветки в git

Я играю с git изолированно на своей собственной машине, и мне трудно поддерживать ментальную модель всех моих ветвей и коммитов. Я знаю, что могу сделать git log чтобы увидеть историю коммитов, откуда я, но есть ли способ увидеть всю топографию ветки, что-то вроде этих карт ascii, которые, кажется, используются повсеместно для объяснения ветвей?

      .-A---M---N---O---P
     /     /   /   /   /
    I     B   C   D   E
     \   /   /   /   /
      `-------------'

Такое ощущение, что кто-то придет и попытается забрать мой репозиторий, будет трудно точно понять, что происходит.

Я думаю, что на меня влияет потоковый браузер AccuRev...

34 ответа

Решение

git log --graph или же gitk, (Оба также принимают --all, который покажет все ветви, а не только текущую.)

Редактировать: для названий ветвей и компактного вида, попробуйте: git log --graph --decorate --oneline

2 ¢: у меня есть 3 псевдонима (и 4 псевдонима для быстрого использования), которые я обычно добавляю ~/.gitconfig файл:

[alias]
    lg = !"git lg1"
    lg1 = !"git lg1-specific --all"
    lg2 = !"git lg2-specific --all"
    lg3 = !"git lg3-specific --all"

    lg1-specific = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(auto)%d%C(reset)'
    lg2-specific = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(auto)%d%C(reset)%n''          %C(white)%s%C(reset) %C(dim white)- %an%C(reset)'
    lg3-specific = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset) %C(bold cyan)(committed: %cD)%C(reset) %C(auto)%d%C(reset)%n''          %C(white)%s%C(reset)%n''          %C(dim white)- %an <%ae> %C(reset) %C(dim white)(committer: %cn <%ce>)%C(reset)'

git lg / git lg1 выглядит так:

мерзавец LG1

git lg2 выглядит так:

мерзавец LG2

а также git lg3 выглядит так:

мерзавец LG3

Примечание. Ответ скопирован и улучшен в ответе на /questions/38120306/simpatichnyie-grafyi-vetok/38120313#38120313, поскольку он гораздо более уместен здесь, чем был там. Оставьте копию по другому вопросу по историческим причинам - сейчас она закрыта, а на ответ ссылается куча других ответов.

Я обычно использую

git log --graph --full-history --all --pretty=format:"%h%x09%d%x20%s"

С цветами (если ваша оболочка Bash):

git log --graph --full-history --all --color \
        --pretty=format:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s"

Это напечатает текстовое представление следующим образом:

* 040cc7c       (HEAD, master) Mannual is NOT built by default
* a29ceb7       Removed offensive binary file that was compiled on my machine and was hence incompatible with other machines.
| * 901c7dd     (cvc3) cvc3 now configured before building
| * d9e8b5e     More sane Yices SMT solver caller
| | * 5b98a10   (nullvars) All uninitialized variables get zero inits
| |/
| * 1cad874     CFLAGS for cvc3 to work succesfully
| *   1579581   Merge branch 'llvm-inv' into cvc3
| |\
| | * a9a246b   nostaticalias option
| | * 73b91cc   Comment about aliases.
| | * 001b20a   Prints number of iteration and node.
| |/
|/|
| * 39d2638     Included header files to cvc3 sources
| * 266023b     Added cvc3 to blast infrastructure.
| * ac9eb10     Initial sources of cvc3-1.5
|/
* d642f88       Option -aliasstat, by default stats are suppressed

(Вы могли бы просто использовать git log --format=oneline, но он будет связывать сообщения коммитов с числами, что выглядит менее симпатично, ИМХО).

Чтобы сделать ярлык для этой команды, вы можете отредактировать ~/.gitconfig файл:

[alias]
  gr = log --graph --full-history --all --color --pretty=tformat:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s%x20%x1b[33m(%an)%x1b[0m"

Однако, как Daniel Ralston в комментариях, такую ​​длинную команду форматирования трудно запомнить. Обычно это не проблема, так как вы можете ~/.gitconfig файл. Однако, если вам иногда приходится входить на удаленную машину, где вы не можете изменить файл конфигурации, вы можете использовать более простую, но более быструю версию:

git log --graph --oneline

К любому из этих рецептов (на основе git log или gitk) вы можете добавить --simplify-by-decoration свернуть неинтересные линейные части истории. Это делает намного больше видимой топологии сразу. Теперь я могу понять большие истории, которые были бы непостижимы без этой опции!

Я чувствовал необходимость опубликовать это, потому что это не так хорошо известно, как должно быть. Его нет в большинстве вопросов о переполнении стека, связанных с визуализацией истории, и мне потребовалось немало поисков, чтобы найти - даже после того, как я понял, что хочу этого! Я наконец нашел это в отчете об ошибках Debian. Первое упоминание о переполнении стека, по-видимому, является ответом Антуана Пелисса.

Gitk иногда мне больно читать.

Мотивировать меня, чтобы написать GitVersionTree.

Взгляните на Gitkraken - кроссплатформенный графический интерфейс, который показывает топологию в ясной форме.

Топология

Вот краткий видеоурок о некоторых дополнительных функциях.

"99,999% моего времени ищут истории git lg и 0,001% на git log"

Просто хочу поделиться 2 псевдонимами журнала, которые могут быть полезны. (настроить из.gitconfig)

[Alias]
     lg = log --graph --pretty=format:'%Cred%h%Creset %ad %s %C(yellow)%d%Creset %C(bold blue)<%an>%Creset' --date=short
     hist = log --graph --full-history --all --pretty=format:'%Cred%h%Creset %ad %s %C(yellow)%d%Creset %C(bold blue)<%an>%Creset' --date=short
  • git lg увидим текущую ветку истории.
  • git hist увидим всю ветку истории.

Мне нравится, с git log, сделать:

 git log --graph --oneline --branches

(также с --all, для просмотра удаленных веток)

Работает с последними выпусками Git: выпущено с 1.6.3 ( четверг, 7 мая 2009 г.)

  • " --pretty=<style> msgstr "опция для семейства команд журнала теперь может быть записана как" --format=<style> ".
    К тому же, --format=%formatstring это сокращение для --pretty=tformat:%formatstring,

  • " --oneline "является синонимом для" --pretty=oneline --abbrev-commit ".

PS D:\git\tests\finalRepo> git log --graph --oneline --branches --all
* 4919b68 a second bug10 fix
* 3469e13 a first bug10 fix
* dbcc7aa a first legacy evolution
| * 55aac85 another main evol
| | * 47e6ee1 a second bug10 fix
| | * 8183707 a first bug10 fix
| |/
| * e727105 a second evol for 2.0
| * 473d44e a main evol
|/
* b68c1f5 first evol, for making 1.0

Вы также можете ограничить интервал отображения журнала (количество коммитов):

PS D:\git\tests\finalRepo> git log --graph --oneline --branches --all -5
* 4919b68 a second bug10 fix
* 3469e13 a first bug10 fix
* dbcc7aa a first legacy evolution
| * 55aac85 another main evol
| | * 47e6ee1 a second bug10 fix

(показать только последние 5 коммитов)


Что мне не нравится в текущем выбранном решении:

 git log --graph

Это отображало слишком много информации (когда я хочу только посмотреть на краткое резюме):

PS D:\git\tests\finalRepo> git log --graph
* commit 4919b681db93df82ead7ba6190eca6a49a9d82e7
| Author: VonC <vonc@laposte.net>
| Date:   Sat Nov 14 13:42:20 2009 +0100
|
|     a second bug10 fix
|
* commit 3469e13f8d0fadeac5fcb6f388aca69497fd08a9
| Author: VonC <vonc@laposte.net>
| Date:   Sat Nov 14 13:41:50 2009 +0100
|
|     a first bug10 fix
|

gitk отлично, но вынуждает меня покинуть сессию оболочки для другого окна, тогда как отображение последних n коммитов достаточно часто.

Gitg - отличный инструмент для Linux, похожий на Gitx для OS X. Просто запустите 'gitg' в командной строке где-то внутри древовидной структуры вашего хранилища (то же самое с gitx).

Хороший веб-инструмент - неопрятный. Он работает на любой платформе, которую поддерживает node.js & git. Есть видео о том, как это работает для тех, кому такие вещи легче читать, чем читать...

Я нашел "git-big-picture" довольно полезным: https://github.com/esc/git-big-picture

Он создает симпатичные 2D-графики с использованием dot/graphviz вместо довольно линейных, "одномерных" представлений, которые создают gitk и друзья. С опцией -i он показывает точки ветвления и коммиты слияния, но пропускает все промежуточное.

Посмотрите на BranchMaster.

Я написал это, чтобы визуализировать сложную структуру веток, сворачивая все коммиты между ними в одну строку. Цифры указывают количество коммитов.

Я нашел это сообщение в блоге, которое показывает краткий путь:

git log --oneline --abbrev-commit --all --graph --decorate --color

Я обычно создаю псевдоним для вышеуказанной команды:

alias gg='git log --oneline --abbrev-commit --all --graph --decorate --color'

и просто просто использовать gg,

Я использую редактор кода Visual Studio , и мне очень понравилось его расширение Git Graph , созданное mhutchie. (И я не одинок, у расширения 1 миллион пользователей!).

Если вам понравился редактор, просто перейдите на вкладку расширения (ячейки слева посередине), введите «Git Graph» и установите

Чтобы использовать его, перейдите на вкладку Git control и нажмите кнопку View Git Graph.

Никто не упомянул tig? Это не сворачивает ветви как "BranchMaster", но...

Это быстро, работает в терминале.

Потому что это так быстро (+ управление с клавиатуры), вы получаете отличный UX, это почти как мой "ls"для каталогов, содержащих git-репозитории.

https://jonas.github.io/tig/

У него есть обычные ярлыки, / искать и т.д.

Граф ревизий

(ps. это терминал на фоне этого скриншота, в настоящее время он выглядит лучше, но мой компьютер отказывается делать скриншот, извините)

(pps. Я тоже использую gitkraken и у меня действительно четкие визуализации, но он намного тяжелее, чем tig)

Для пользователей Mac: закажите (не каламбур) бесплатный инструмент с открытым исходным кодом GitUp: http://gitup.co/

Мне нравится способ отображения графиков, он понятнее, чем некоторые другие инструменты, которые я видел.

Проект находится здесь: https://github.com/git-up/GitUp

GitUp скриншот

Хихикает рисует красивые графики

У Tortoise Git есть инструмент под названием "График ревизий". Если вы работаете в Windows, это так же просто, как щелкнуть правой кнопкой мыши по вашему репозиторию -> Tortoise Git -> Revision Graph.

Для тех, кто использует текстовый редактор VSCode, рассмотрим расширение Git History от D. Jayamanne:

введите описание изображения здесь

Я использую следующие псевдонимы.

[alias]
    lol = log --graph --decorate --pretty=oneline --abbrev-commit
    lola = log --graph --decorate --pretty=oneline --abbrev-commit --all

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

Со скриншотами и полным описанием здесь: http://blog.kfish.org/2010/04/git-lola.html

У меня есть это git log псевдоним в ~/.gitconfig чтобы просмотреть историю графика:

[alias]
l = log --all --graph --pretty=format:'%C(auto)%h%C(auto)%d %s %C(dim white)(%aN, %ar)'

С псевдонимом на месте, git l покажет что-то вроде этого:

В Git 2.12 + вы даже можете настроить цвета линий графика, используя log.graphColors Вариант конфигурации.

Что касается формата журналов, он похож на --oneline, с добавлением имени автора (с уважением .mailmap) и относительная дата автора. Обратите внимание, что %C(auto) синтаксис, который говорит Git использовать цвета по умолчанию для хэша коммита и т. д., поддерживается в Git> = 1.8.3.

Еще одна команда git log. Этот с фиксированной шириной столбцов:

git log --graph --pretty=format:"%x09%h | %<(10,trunc)%cd |%<(25,trunc)%d | %s" --date=short

Gitx также фантастический инструмент визуализации, если вы оказались на OS X.

Мой личный любимый псевдоним через.gitconfig:

graph = log --graph --color --all --pretty=format:"%C(yellow)%H%C(green)%d%C(reset)%n%x20%cd%n%x20%cn%x20(%ce)%n%x20%s%n"

Старый пост, но проверить SmartGit, Он очень напоминает визуализацию ветки Tortoise HG и бесплатен для некоммерческого использования.

Мне показалось невероятным, что среди многих ответов не упоминается Gitviz, доступный для Window / Linux / Mac.
Помимо предоставления двухмерного представления веток и фиксации, он прослушивает ваши команды git и сам изменяет график.

Я хочу поделиться своим compactпредустановка для команды:
(зеленый - мой цвет консоли по умолчанию)

Он спроектирован так, чтобы быть максимально компактным и похожим на таблицу (без добавления лишних пробелов), но при этом информативным и легким для чтения. По сути, это компактная версия по умолчанию. medium формат.

Функции:

  • Фиксированные позиции предметов;
  • Цвета по умолчанию для хэша коммита и имен ссылок;
  • Дата автора коммита находится в местном часовом поясе;
  • Сообщение о фиксации заключено в 128 символов с отступом;
  • Также отображается расширенное сообщение фиксации (если есть) с удаленными завершающими символами новой строки.

Вы можете добавить его в свой конфигурационный файл, используя следующие команды:
(обратите внимание, что они изменят формат даты для всех форматов!)

      $ git config --global log.date 'format-local:%d %b %Y %H:%M'
$ git config --global pretty.compact '%C(auto)%h %C(cyan)%<(17,trunc)%an%C(auto) %D%n        %C(cyan)%ad%C(auto) %w(128,0,26)%s%w(0,0,26)%+b%-(trailers:key=FAKE)'

... а затем использовать его так (с --graph, --all или любые другие варианты):

      $ git log --graph --pretty=compact

Если вы также хотите установить его по умолчанию, вы можете сделать это с помощью этой команды:

      $ git config --global format.pretty compact

Или, если вам нравятся псевдонимы:

      $ git config --global alias.logc "log --date=format-local:'%d %b %Y %H:%M' --pretty='%C(auto)%h %C(cyan)%<(17,trunc)%an%C(auto) %D%n        %C(cyan)%ad%C(auto) %w(128,0,26)%s%w(0,0,26)%+b%-(trailers:key=FAKE)'"

Если вы хотите внести какие - либо изменения, смотрите раздел PRETTY ФОРМАТОВ из git log Справка.

Встроенные инструменты Git (без надстроек) с форматированием даты и времени

Ни один из существующих ответов не показывает, как изменить формат даты и времени с помощью встроенного git logоснастка. Поскольку документация немного запутана с этой функцией, я добавил два псевдонима, которые я использую для этого в качестве примера.

git tree- Журнал всех коммитов с отметками времени

      # Tools for analyzing the merge history of a repo using tree-like graphics
[alias]
    tree = log --no-show-signature --graph --date=format-local:%H:%M:%S --all \
        --pretty="'%C(#ffe97b ul)%h%C(reset) %C(#568ea6)%cs %C(#305f72)%cd%C(reset)%C(auto)%d%C(reset) %s %C(yellow)(%C(reset)%C(#1abc9c)%an%C(reset)%C(yellow),%C(reset) %C(#007055)%cr%C(reset)%C(yellow))%C(reset)'"

git tree.branches– Журнал всех веток/тегов с отметками времени

      # Some refinements to normal 'git tree' output for alternative perspectives.
[alias "tree"]
    branches = tree --simplify-by-decoration

Цветовой код

Самые популярные ответы, показывающие git log команды как любимые решения.

Если вам нужен вывод в виде таблицы, скажем, столбца, вы можете использовать свои потрясающие команды журнала git с небольшими изменениями и некоторыми ограничениями с помощью фрагмента.gitconfig alias.tably ниже.

Модификации:

  • ты должен использовать %><(<N>[,ltrunc|mtrunc|trunc]) перед каждым заполнителем фиксации
  • добавить уникальный разделитель в качестве разделителя столбцов
  • добавлять --color возможность цветного вывода

Ограничения:

  • вы можете разместить график git в каждом столбце, если вы не используете непустые символы новой строки %n...
  • последний заполнитель фиксации любой новой строки может использоваться без %><(<N>[,trunc])
  • если для украшения нужны дополнительные символы, например (committer:, < а также >) в

    ...%C(dim white)(committer: %cn% <%ce>)%C(reset)...

    чтобы получить табличный вывод, они должны быть написаны непосредственно до и после заполнителя фиксации

    ...%C(dim white)%<(25,trunc)(committer: %cn%<(25,trunc) <%ce>)%C(reset)...

  • если --format=format: вариант не последний закройте его %C(reset) как обычно

  • по сравнению с обычным выводом журнала git, этот медленный, но приятный

Пример взят с этого сайта:

thompson1     = log --all --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(auto)%d%C(reset)'

будет с ^ как разделитель и без добавленных символов

thompson1-new = log --all --graph --color --abbrev-commit --decorate --format=format:'^%C(bold blue)%<(7,trunc)%h%C(reset)^%C(bold green)%<(21,trunc)%ar%C(reset)^%C(white)%<(40,trunc)%s%C(reset)^%C(dim white)%<(25,trunc)%an%C(reset)^%C(auto)%d%C(reset)'

который сравнивается как

или с перемещением графика в столбец 5

Для этого добавьте следующее в свой.gitconfig и вызовите псевдоним журнала с помощью git tably YourLogAlias

[color "decorate"]
    HEAD = bold blink italic 196
    branch = 214
    tag = bold 222

[alias]

    # delimiter used as column seperator
    delim = ^
    # example thompson1
    thompson1     = log --all --graph         --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(auto)%d%C(reset)'
    # modified thompson1 example
    thompson1-new = log --all --graph --color --abbrev-commit --decorate --format=format:'^%C(bold blue)%<(7,trunc)%h%C(reset)^%C(bold green)%<(21,trunc)%ar%C(reset)^%C(white)%<(40,trunc)%s%C(reset)^%C(dim white)%<(25,trunc)%an%C(reset)^%C(auto)%d%C(reset)'
    # set a column for the graph
    thompson1-new-col = 1

tably     = !bash -c '"                                                                                                              \
              declare -A col_length;                                                                                                 \
              delim=$(git config alias.delim);                                                                                       \
              git_log_cmd=$(git config alias.$1);                                                                                    \
              git_tre_col=${2:-$(git config alias.$1-col)};                                                                          \
                                                                                                                                     \
              i=0;                                                                                                                   \
              n=0;                                                                                                                   \
              while IFS= read -r line; do                                                                                            \
                ((n++));                                                                                                             \
                while read -d\"$delim\" -r col_info;do                                                                               \
                  ((i++));                                                                                                           \
                  [[ -z \"$col_info\" ]] && col_length[\"$n:$i\"]=${col_length[\"${last[$i]:-1}:$i\"]} && ((i--)) && continue;       \
                  [[ $i -gt ${i_max:-0} ]] && i_max=$i;                                                                              \
                  col_length[\"$n:$i\"]=$(grep -Eo \"\\([0-9]*,[lm]*trunc\\)\" <<< \"$col_info\" | grep -Eo \"[0-9]*\" | head -n 1); \
                  [[ -n \"${col_length[\"$n:$i\"]}\" ]] && last[$i]=$n;                                                              \
                  chars_extra=$(grep -Eo \"\\trunc\\).*\" <<< \"$col_info\");                                                        \
                  chars_extra=${chars_extra#trunc)};                                                                                 \
                  chars_begin=${chars_extra%%\\%*};                                                                                  \
                  chars_extra=${chars_extra#*\\%};                                                                                   \
                  case \" ad aD ae aE ai aI al aL an aN ar as at b B cd cD ce cE ci cI cl cL cn cN cr                                \
                          cs ct d D e f G? gd gD ge gE GF GG GK gn gN GP gs GS GT h H N p P s S t T \" in                            \
                   *\" ${chars_extra:0:2} \"*)                                                                                       \
                     chars_extra=${chars_extra:2};                                                                                   \
                     chars_after=${chars_extra%%\\%*};                                                                               \
                     ;;                                                                                                              \
                   *\" ${chars_extra:0:1} \"*)                                                                                       \
                     chars_extra=${chars_extra:1};                                                                                   \
                     chars_after=${chars_extra%%\\%*};                                                                               \
                     ;;                                                                                                              \
                   *)                                                                                                                \
                     echo \"No Placeholder found. Probably no tablelike output.\";                                                   \
                     continue;                                                                                                       \
                     ;;                                                                                                              \
                  esac ;                                                                                                             \
                  if [[ -n \"$chars_begin$chars_after\" ]];then                                                                      \
                    len_extra=$(echo \"$chars_begin$chars_after\" | wc -m);                                                          \
                    col_length["$n:$i"]=$((${col_length["$n:$i"]}+$len_extra-1));                                                    \
                  fi;                                                                                                                \
                                                                                                                                     \
                done <<< \"${line#*=format:}$delim\";                                                                                \
                i=1;                                                                                                                 \
              done <<< \"$(echo -e \"${git_log_cmd//\\%n/\\\\n}\")\";                                                                \
                                                                                                                                     \
              while IFS= read -r graph;do                                                                                            \
                chars_count=$(sed -nl1000 \"l\" <<< \"$graph\" | grep -Eo \"\\\\\\\\\\\\\\\\|\\||\\/|\\ |\\*|_\" | wc -l);           \
                [[ ${chars_count:-0} -gt ${col_length["1:1"]:-0} ]] && col_length["1:1"]=$chars_count;                               \
              done < <([[ -n \"$(grep -F graph <<< \"$git_log_cmd\")\" ]] && git log --all --graph --pretty=format:\" \" && echo);   \
                                                                                                                                     \
              l=0;                                                                                                                   \
              while IFS= read -r line;do                                                                                             \
                c=0;                                                                                                                 \
                ((l++));                                                                                                             \
                [[ $l -gt $n ]] && l=1;                                                                                              \
                while IFS= read -d\"$delim\" -r col_content;do                                                                       \
                  ((c++));                                                                                                           \
                  if [[ $c -eq 1 ]];then                                                                                             \
                    [[ -n \"$(grep -F \"*\" <<< \"$col_content\")\" ]] || l=2;                                                       \
                    chars=$(sed -nl1000 \"l\" <<< \"$col_content\" | grep -Eo \"\\\\\\\\\\\\\\\\|\\||\\/|\\ |\\*|_\" | wc -l);       \
                    whitespaces=$((${col_length["1:1"]}-$chars));                                                                    \
                    whitespaces=$(seq -s\" \" $whitespaces|tr -d \"[:digit:]\");                                                     \
                    col_content[1]=\"${col_content[1]}$col_content$whitespaces\n\";                                                  \
                  else                                                                                                               \
                    col_content[$c]=\"${col_content[$c]}$(printf \"%-${col_length[\"$l:$c\"]}s\" \"${col_content:-\"\"}\")\n\";      \
                  fi;                                                                                                                \
                done <<< \"$line$delim\";                                                                                            \
                for ((k=$c+1;k<=$i_max;k++));do                                                                                      \
                  empty_content=\"$(printf \"%-${col_length[\"$l:$k\"]:-${col_length[\"${last[$k]:-1}:$k\"]:-0}}s\" \"\")\";         \
                  col_content[$k]=\"${col_content[$k]}$empty_content\n\";                                                            \
                done;                                                                                                                \
              done < <(git $1 && echo);                                                                                              \
                                                                                                                                     \
              while read col_num;do                                                                                                  \
                if [[ -z \"$cont_all\" ]];then                                                                                       \
                  cont_all=${col_content[$col_num]};                                                                                 \
                else                                                                                                                 \
                  cont_all=$(paste -d\" \" <(echo -e \"$cont_all\") <(echo -e \"${col_content[$col_num]}\"));                        \
                fi;                                                                                                                  \
              done <<< $(seq 2 1 ${git_tre_col:-1};seq 1;seq $((${git_tre_col:-1}+1)) 1 $i_max);                                     \
              echo -e \"$cont_all\";                                                                                                 \
              "' "git-tably"

Это более или менее только часть моего ответа /questions/38120306/simpatichnyie-grafyi-vetok/55111015#55111015, где вы можете найти более подробные объяснения, но здесь тоже хорошо подходит к этому вопросу.

Если есть проблемы с вашими командами git log, оставьте комментарий.

Мы можем сделать это более сложным?

Как насчет простого git log --all --decorate --oneline --graph (помните A Dog = --Все --Украсить --Oneine --Graph)

Другие вопросы по тегам