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

884

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

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

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

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

Benjol
источник
дубликат stackoverflow.com/questions/1064361/…
Лейф Грюнволдт
1
@ leif81, полудубликат для меня. @Masi явно исключил Гитк в своем вопросе.
Бенджол

Ответы:

1083

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

Для названий ветвей и компактного вида попробуйте:

git log --graph --decorate --oneline
jrockway
источник
47
Это даже не обозначает коммиты с ветками. Я бы не назвал это хорошей визуализацией как есть.
Роман Старков
7
Спасибо! Gitg также имеет --allопцию и также помечает коммиты. Я также никогда не видел в выпадающем списке, что вы можете выбрать все ветви там.
Томас,
210
Я бы порекомендовал git log --graph --decorate --oneline- показывает один коммит на строку, и украшает с именами веток.
слеске
8
ВИГ (а ncurse клиент мерзавца) также предоставляет --allопцию. Довольно удобно!
Пьер-Адриен Буассон,
5
Смотрите также ответ Андрея относительно --simplify-by-decorationварианта.
ruvim 14.11.16
483

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

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) Manual 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 successfully
| *   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"

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

git log --graph --oneline
П Швед
источник
10
Если вам нравятся даты: git log --graph --full-history --all --color --date = short --pretty = format: "% x1b [31m% h% x09% x1b [32m% d% x1b [ 0m% x20% ad% s "
sehugg
7
--oneline является более запоминающейся заменой всего этого красивого форматирования глубокой магии.
Даниэль Ральстон,
1
@SodeltheVociferous, действительно, я не подходил к проблеме с той стороны, о которой ты говоришь; Я расширил свой ответ.
P Shved
2
Примечание: --full-historyактуально только при использовании --simplify-by-decorationили указании пути к файлу.
Слипп Д. Томпсон
2
Могу я спросить, откуда вы взяли строку формата? Или как ты это придумал?
elliotwesoff
444

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

[alias]
    lg = lg1
    lg1 = lg1-specific --all
    lg2 = lg2-specific --all
    lg3 = 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

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

  1. Добавьте их в свой .gitconfig,
  2. Настройте по своему вкусу (разные цветовые решения, разное расположение линий для двух- и трехстрочных версий и т. Д.),
  3. А затем сохраните копию в Gist или другом инструменте фрагмента кода, чтобы вы могли скопировать и вставить его в .gitconfigs в будущем (или, конечно, в качестве альтернативного варианта управления вашими точечными файлами) .

Примечание. Ответ скопирован и улучшен в ответе на stackoverflow.com/questions/1057564/pretty-git-branch-graphs, поскольку он гораздо более уместен здесь, чем был там. Оставьте копию другого вопроса по историческим причинам - сейчас он закрыт, а на ответ ссылается куча других ответов.

Слипп Д. Томпсон
источник
10
Предложение: заменить %C(bold yellow)с %C(auto)за то, что различные цвета для HEAD, локальных и удаленных ветвей ( реф ).
Atcold
2
Обратите внимание, что вы можете избежать добавления отступа в строку формата вручную, используя %w(); таким образом, вы также можете правильно переносить строки или сообщения с многострочным коммитом, не мешая графику.
Чарлигрин
1
@ mbadawi23 Они избыточны для согласованности между платформами и установками Git. --abbrev-commitнаходится там, потому что 2-я и 3-я строки снабжены пробелами вручную, и я хотел быть абсолютно уверенным, что он будет использовать короткий SHA - так что лучше, чем потом сожалеть. --decorateтакже там, потому что, хотя настройки Git по умолчанию делают то же самое, они могут быть настроены по-разному или по-разному в разных версиях Git - для них я абсолютно хочу украшение. В конечном счете, дополнительные / избыточные флаги здесь неплохие - это происходит в файле; это не то, что вы печатаете все время.
Слипп Д. Томпсон
1
@TimothyPulliam В конце каждой строки, представляющей кончик каждой ветви / тега, вы увидите соответствующие имена ветвей / тегов в скобках - например, на скриншотах lg1& lg2вы можете увидеть (origin/test_on_10.8)показ удаленной ветви, а на lg2скриншоте вы можете см. (HEAD -> master, origin/master, origin/HEAD)показ как локальных, так и удаленных позиций masterфилиала и HEAD. Это соответствует тому, что делают популярные инструменты графического интерфейса для Git (gitk, SourceTree, TortoiseGit, Tower, Fork, GitX), хотя и с большей детализацией (некоторые инструменты GUI используют цветовое кодирование) .
Слипп Д. Томпсон
2
@TimothyPulliam Чтобы понять, какие коммиты являются «частью каждой ветви», вы должны визуально отследить цветную линию. Практически каждый инструмент не очень вам в этом помогает, потому что коммиты Git по своей природе не принадлежат какой-либо ветви - они подразумевают (во время графика-визуализации) принадлежность к любой ветви или тегу, который имеет их в родительской родословной. , Если нет ветки / тега, ссылающегося на коммит, и он исчезает (но не собирается сборщиком мусора около 2 недель); добавьте ветку / тег, ссылающийся на ранее не имеющий ссылок коммит, и он появится снова. Я надеюсь, что все это имеет смысл.
Слипп Д. Томпсон,
236

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

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

Эндрю
источник
3
Идеально - именно то, что я искал! Это должно получить больше голосов; почти все уже знают о gitk / gitg / git log --graph, но они совсем не очень полезны, если вы хотите визуализировать топологию веток и не заботиться об отдельных фиксациях.
Imolit
4
Это именно то, что мне нужно, фантастика. Это единственное, что помогло мне из всех ответов. --simplify-by-decorationтак ясно дает понять, что происходит.
Ela782
9
Это действительно должен быть ответ. git log --graph --all --simplify-by-decorationработает так же.
Ирфи
Если бы только мы могли использовать --simplify-by-decorationпри добавлении n коммитов до / после каждого децентрализованного коммита (как -Bи -Aдля grep).
июн
Я использую это решение так часто, что я называю его «git tree».
user16973
76

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

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

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

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

контрольная сумма
источник
3
@exhuma У меня есть пиар с автором, чтобы поддержать Mono (проверено на Ubuntu 13.10 против Mono 2.10)
Макс Эрлих,
1
Я обнаружил, что GitVersionTree сохраняет ветки в одном месте со временем, что облегчает просмотр изменений.
sfranky
48

99,999% моего времени смотрят на историю, git lgа 0,001% - на git log.

Я просто хочу поделиться двумя псевдонимами журнала, которые могут быть полезны (настроить из .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 увидим всю ветку истории.
Ео
источник
44

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

Топология

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

pylang
источник
6
Как у этого потока есть GitKraken, но у него нет более старого и бесплатного SourceTree? (Я знаю, я знаю, Atlassian не всегда понимает все правильно. Но SourceTree - отличный инструмент для визуализации.)
XML,
43

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

 git log --graph --oneline --branches

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

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

  • --pretty=<style>Параметр « » для семейства команд журнала теперь можно записать как « --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 коммитов достаточно часто.

VonC
источник
Я также выбрал этот метод, но я создал псевдоним, чтобы набирать «git graph» так же, как выполнять «git log --graph --decorate --oneline».
Уилл Пайк
@ConnerPike хорошая идея. У меня есть псевдоним 'lg': см. Stackoverflow.com/a/3667139/6309
VonC
35

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

Джек Сенечал
источник
3
В двух словах: у gitg есть выпадающее меню, где можно выбрать, какую ветвь визуализировать. В этом раскрывающемся меню также есть опция «Все».
Флукс
1
Или вы можете начать это с gitg --all, если вы хотите избежать осмотра в выпадающем меню.
imolit
25

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

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

Фрэнк Остерфельд
источник
довольно прост в использовании, если у вас мало коммитов и вы хотите простое решение, возможно, стоит попробовать.
Висвит
Он должен хорошо масштабироваться с количеством коммитов (если вы используете -i), он может стать нечитаемым, если у вас есть сложные ветки и слияния (но тогда, какой инструмент не имеет)
Фрэнк Остерфельд
1
С нашим проектом среднего масштаба это создает огромную картину с тоннами линий. Могу ли я ограничить глубину, до которой идет? Т.е. фиксируется за последние N дней или около того.
Ондра Жижка
25

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

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

Сардатрион - против злоупотребления SE
источник
21

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

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

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

stroyer
источник
1
Это то, что я ищу. Есть ли альтернативные команды / инструменты для этого?
Aalex Gabi
3
@AalexGabi Поместите это в ваш gitconfig, он делает то же самое, но в командной строке gbranch = log --graph --simplify-by-украшением --pretty = format: '% C (желтый)% h% C (белый)% d% C (жирный черный)% ar% C (сброс)% n '--all
kracejic
Как вы получаете данные для визуализации ветвей?
Снежная рыба
15

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

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

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

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

Имеются обычные ярлыки, /для поиска и т. Д.

Граф ревизий

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

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

провода
источник
Я любитель терминалов, и Tig (интерфейс текстового режима для Git) - хороший инструмент для взаимодействия с репозиториями Git, он очень полезен, включая просмотр графиков и историю Git. Я рекомендую его любителям терминалов в качестве дополнительного инструмента для командной строки Git.
hermeslm
15

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

CSN
источник
1
Какая фантастическая особенность, с помощью черепашьего мерзавца в течение длительного времени, но я не знаю эту функцию.
kreamik
Это намного проще. Спасибо.
Anoop
15

Хихикает рисует действительно хорошие графики.

Ренат
источник
Как и в Grittle , если вы используете OmniGraffle
New Alexandria
Попробовал, и я вижу строку на коммит, а не строку на ветку / тег. Это слишком подробно, когда у вас есть десятки веток / тегов.
Aalex Gabi
12

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

[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

Lokist
источник
12

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

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

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

GitUp скриншот

Эдвард Тан
источник
Это единственный график, на котором вы видите ветви на оси x и время на оси y. Это очень интуитивно понятно. GitUp абсолютно потрясающий! macOS больше нет, так что я перехожу на Windows и буду очень скучать по Gitup.
w00t
11

У меня есть этот 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 .

Евгений Ярмаш
источник
1
Это первый раз, когда я вижу реальное авторское свидание, и это довольно мило! спасибо, я добавлю это в мой gitconfig!
Саймон С.
пользователи Windows должны заменять одинарные кавычки на двойные
PierDipi
11

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

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

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

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

и просто просто использовать gl .

Вы также можете добавить псевдоним в конфигурацию git. Откройте ~/.gitconfigи добавьте следующую строку в [псевдоним]

[alias]
        lg = log --oneline --abbrev-commit --all --graph --decorate --color

и используйте это так: git lg

Sadegh
источник
8

Мой личный любимый псевдоним через .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"
ксеро
источник
6
Небольшое объяснение, как будет выглядеть команда, было бы здорово.
Макс
8

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

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

pylang
источник
На мой взгляд, это расширение довольно медленное. Он также не обновляется автоматически и выглядит неполированным. Но он хорошо выполняет визуализацию дерева коммитов ...
aljazerzen
2
Еще одно расширение для кода Visual Studio - это Git Graph от mhutchie. Я использую это вместе с GitLens.
Josef.B
7

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

Kend
источник
3
Гитк (для всех) очень похож. не совсем то же самое, но довольно похоже.
Xero
Есть пара вилок Gitx - эта (rowanj) кажется лучшей на данный момент.
rjmunro
7

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

git log --graph --pretty=format:"%x09%h | %<(10,trunc)%cd |%<(25,trunc)%d | %s" --date=short
Дэвид
источник
6

Проверьте SmartGit. Это очень напоминает мне визуализацию ветки TortoiseHg, и это бесплатно для некоммерческого использования.

Фредерик Струк-Шёнинг
источник
3

В Windows есть очень полезный инструмент, который вы можете использовать: расширения git. Это графический инструмент, который делает операции с Git очень простыми.

Также это с открытым исходным кодом.

http://gitextensions.github.io

loneshark99
источник
2

Я пробовал, --simplify-by-decorationно все мои слияния не отображаются. Поэтому я вместо этого просто обрезаю строки без символов «\» и «/» в заголовках, сохраняя при этом строки со знаком «(», указывающим ветви сразу после этого. При отображении истории ветвей я вообще не заинтересован в комментариях к коммитам, поэтому Я тоже их удаляю и получаю следующий псевдоним оболочки.

gbh () { 
    git log --graph --oneline --decorate "$@" | grep '^[^0-9a-f]*[\\/][^0-9a-f]*\( [0-9a-f]\|$\)\|^[^0-9a-f]*[0-9a-f]*\ (' | sed -e 's/).*/)/'
}
Исаак То
источник
2

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

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

пиксель
источник
1
Это так же, как принятый ответ. Однако реквизит для мнемоники
aljgom
1

Официальный сайт Git привлек некоторые сторонние инструменты графического интерфейса платформы. Нажмите здесь Инструменты git GUI для платформы Linux

Я использовал gitgи GitKrakenдля платформы Linux. Оба хорошо, чтобы понять дерево коммитов

rookie4evr
источник
0

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

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

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

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

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

  • если график не должен быть помещен в первый столбец, вы не можете добавить другие символы для украшения, как (committer:, <и >)как в

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

    чтобы получить табличный вывод

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

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 '"                                                                                                            \
              delim=$(git config alias.delim);                                                                                     \
              git_log_cmd=$(git config alias.$1);                                                                                  \
              git_tre_col=${2:-$(git config alias.$1-col)};                                                                        \
                                                                                                                                   \
              i=0;                                                                                                                 \
              while read -d\"$delim\" -r col_info;do                                                                               \
                ((i++));                                                                                                           \                   
                col_length[$i]=$(grep -Eo \"\\([0-9]*,[lm]*trunc\\)\" <<< \"$col_info\" | grep -Eo \"[0-9]*\" | head -n 1);        \
              done <<< \"$(grep -Eo \"(pretty|format)=format.*\" <<< \"$git_log_cmd$delim\")\";                                    \
                                                                                                                                   \
              while IFS= read -r graph;do                                                                                          \
                chars_count=$(sed -nl1000 \"l\" <<< \"$graph\" | grep -Eo \"\\\\\\\\\\\\\\\\|\\||\\/|\\ |\\*|_\" | wc -l);         \
                [[ ${chars_count:-0} -gt ${col_length[1]:-0} ]] && col_length[1]=$chars_count;                                     \
              done < <([[ -n \"$(grep -F graph <<< \"$git_log_cmd\")\" ]] && git log --all --graph --pretty=format:\" \" && echo); \
                                                                                                                                   \
              while IFS= read -r line;do                                                                                           \
                j=0;                                                                                                               \
                while IFS= read -d\"$delim\" -r col_content;do                                                                     \
                  ((j++));                                                                                                         \
                  if [[ $j -eq 1 ]];then                                                                                           \
                    chars=$(sed -nl1000 \"l\" <<< \"$col_content\" | grep -Eo \"\\\\\\\\\\\\\\\\|\\||\\/|\\ |\\*|_\" | wc -l);     \
                    whitespaces=$((${col_length[1]}-$chars));                                                                      \
                    whitespaces=$(seq -s\" \" $whitespaces|tr -d \"[:digit:]\");                                                   \
                    col_content[1]=\"${col_content[1]}$col_content$whitespaces\n\";                                                \
                  else                                                                                                             \
                    col_content[$j]=\"${col_content[$j]}$(printf \"%${col_length[$j]}s\" \"$col_content\") \n\";                   \
                  fi;                                                                                                              \
                done <<< \"$line$delim\";                                                                                          \
                for ((k=$j+1;k<=$i;k++));do                                                                                        \
                  col_content[$k]=\"${col_content[$k]}$(printf \"%${col_length[$k]}s\" \"\") \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);                                       \
              echo -e \"$cont_all\";                                                                                               \
            "' "git-tably"

Это более или менее только часть моего ответа https://stackoverflow.com/a/61487052/8006273, где вы можете найти более глубокие объяснения, но здесь тоже хорошо подходит этот вопрос.

еще один вопрос
источник