Довольно git графы ветвей

Я видел, что в некоторых книгах и статьях есть действительно красивые графические разделы ветвей и коммитов git. Как сделать высококачественные печатные изображения git истории?

Ответы

Ответ 1

Обновление: этот ответ получил гораздо больше внимания, чем он заслуживает. Это было изначально опубликовано, потому что я считаю, что графики выглядят красиво, и их можно было нарисовать в Illustrator для публикации, и лучшего решения не было. Но теперь есть гораздо более приемлемые ответы на этот вопрос, например fracz, Jubobs, или Гарри Ли! Пожалуйста, перейдите к ним!

Обновление 2: я опубликовал улучшенную версию этого ответа для Визуализации отраслевой топологии в git, так как это гораздо более уместно. Эта версия включает lg3, которая показывает как автора, так и информацию коммиттера, поэтому вы действительно должны это проверить. Оставив этот ответ на исторические (и, я соглашусь, реплики) причины, хотя я действительно соблазн просто удалить его.

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

[alias]
lg1 = 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(bold yellow)%d%C(reset)' --all
lg2 = 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 yellow)%d%C(reset)%n''          %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all
lg = !"git lg1"

git lg/git lg1 выглядит следующим образом:
git lg1

и git lg2 выглядит следующим образом:
git lg2

Ответ 2

Многие из ответов здесь хороши, но для тех, кто просто хочет получить ответ в одну строку без указания псевдонимов или чего-то еще, вот он:

git log --all --decorate --oneline --graph

Не все будут делать git log все время, но когда вам это нужно, просто помните:

"Собака"= мерзавец журнал - это LL - д ecorate - о neline - г Раф

enter image description here

Ответ 3

Для текстового вывода вы можете попробовать:

git log --graph --abbrev-commit --decorate --date=relative --all

или:

git log --graph --oneline --decorate --all

или: здесь  псевдоним graphviz для рисования графа DAG.

Я лично использую gitx, gitk --all и gitnub.

Ответ 4

Gitgraph.js позволяет рисовать красивые ветки Git без хранилища. Просто напишите код Javascript, который настраивает ваши ветки и коммиты и отображает их в браузере.

var gitGraph = new GitGraph({
   template: "blackarrow",
   mode: "compact",
   orientation: "horizontal",
   reverseArrow: true
});

var master = gitGraph.branch("master").commit().commit();
var develop = gitGraph.branch("develop").commit();
master.commit();
develop.commit().commit();
develop.merge(master);

sample graph generated with Gitgraph.js

или с шаблоном metro:

GitGraph.js metro theme

или с сообщениями о фиксации, авторами и тегами:

GitGraph with commit messages

Проверьте это с помощью JSFiddle.

Создайте его с помощью Git Grapher от @bsara.

Ответ 5

Построено поверх TikZ и PGF, gitdags представляет собой небольшой пакет LaTeX, который позволяет вам без особых усилий создавать графики графической графики и т.д.

Автоматическая генерация существующего графика фиксации репозитория не является целью gitdags; графики, которые он производит, предназначены только для образовательных целей.

Я часто использую его для создания графиков для ответов на вопросы Git в качестве альтернативы графикам фиксации ASCII:

Вот пример такого графика, демонстрирующего эффекты простой перестановки:

enter image description here

\documentclass{article}

\usepackage{subcaption}
\usepackage{gitdags}

\begin{document}

\begin{figure}
  \begin{subfigure}[b]{\textwidth}
    \centering
    \begin{tikzpicture}
      % Commit DAG
      \gitDAG[grow right sep = 2em]{
        A -- B -- { 
          C,
          D -- E,
        }
      };
      % Tag reference
      \gittag
        [v0p1]       % node name
        {v0.1}       % node text
        {above=of A} % node placement
        {A}          % target
      % Remote branch
      \gitremotebranch
        [origmaster]    % node name
        {origin/master} % node text
        {above=of C}    % node placement
        {C}             % target
      % Branch
      \gitbranch
        {master}     % node name and text 
        {above=of E} % node placement
        {E}          % target
      % HEAD reference
      \gitHEAD
        {above=of master} % node placement
        {master}          % target
    \end{tikzpicture}
    \subcaption{Before\ldots}
  \end{subfigure}

  \begin{subfigure}[b]{\textwidth}
    \centering
    \begin{tikzpicture}
      \gitDAG[grow right sep = 2em]{
        A -- B -- { 
          C -- D' -- E',
          {[nodes=unreachable] D -- E },
        }
      };
      % Tag reference
      \gittag
        [v0p1]       % node name
        {v0.1}       % node text
        {above=of A} % node placement
        {A}          % target
      % Remote branch
      \gitremotebranch
        [origmaster]    % node name
        {origin/master} % node text
        {above=of C}    % node placement
        {C}             % target
      % Branch
      \gitbranch
        {master}      % node name and text 
        {above=of E'} % node placement
        {E'}          % target
      % HEAD reference
      \gitHEAD
        {above=of master} % node placement
        {master}          % target
    \end{tikzpicture}
    \subcaption{\ldots{} and after \texttt{git rebase origin/master}}
  \end{subfigure}
  \caption{Demonstrating a typical \texttt{rebase}}
\end{figure}

\end{document}

Ответ 6

Gitg - это клон Gitk и GitX для GNOME (он также работает на KDE и т.д.), который показывает довольно цветной график.

Он активно развивается (с 2012 года). Он позволяет сортировать коммиты (узлы графа) либо в хронологическом порядке, либо топологически, и скрывать коммиты, которые не приводят к выбранной ветке.

Он отлично работает с большими репозиториями и сложными графиками зависимостей.

Пример скриншотов, показывающих репозитории linux- git и linux-2.6:

linux-git

linux-2.6

Ответ 7

SourceTree - действительно хороший. Он распечатывает хорошо выглядящую и среднюю историю и график ветвей: (в экспериментальном проекте Git выполняется следующее, чтобы увидеть некоторые ветки). Поддерживает Windows 7+ и Mac OS X 10.6 +.

enter image description here

http://www.sourcetreeapp.com/

Ответ 8

Я только что написал один инструмент, который может генерировать симпатичный git фиксирует граф, используя HTML/Canvas.

И создайте плагин jQuery, который упростит его использование.

[github] https://github.com/tclh123/commits-graph

Предварительный просмотр:

preview

Ответ 9

git-forest - отличный perl script, который я использую больше года, и вряд ли использую git log команды напрямую.

Вот некоторые из вещей, которые мне нравятся в этом script:

  • Он использует символы Юникода для рисования линий на графике, что дает более постоянный вид линий графика.
  • Вы можете объединить --reverse с графическим выходом, что невозможно с помощью регулярной команды git log.
  • Он использует git log внутри, чтобы захватить список коммитов, поэтому все параметры, которые вы передаете на git log, также можно передать и на этот script.

У меня есть псевдоним, использующий git-forest следующим образом:

[alias]
tree = "forest --pretty=format:\"%C(red)%h %C(magenta)(%ar) %C(blue)%an %C(reset)%s\" --style=15 --reverse"

Вот как выглядит вывод на терминале:

enter image description here

Ответ 10

Основываясь на скрипте Graphviz, который я нашел в ответе на связанный вопрос, я взломал скрипт ruby, который создает сводное представление хранилища git. Он исключает всю линейную историю и просто показывает "интересные" коммиты, то есть те, у которых несколько родителей, несколько детей или на которые указывает ветка или тег. Вот фрагмент графика, который он генерирует для jquery:

jquery sample

git-big-picture и BranchMaster - похожие инструменты, которые пытаются показать только высокоуровневую структуру графика, показывая только то, как связаны теги, ветки, слияния и т.д.

У этого вопроса есть еще несколько вариантов.

Ответ 11

Я написал веб-инструмент для преобразования журналов git в красивые SVG-графики: Bit-Booster - инструмент для рисования графиков в автономном режиме

Загрузите вывод из git log --pretty='%h|%p|%d' прямо в инструмент, а затем нажмите ссылку "download graph.svg".

Этот инструмент предназначен исключительно для клиентской части, поэтому никакие ваши данные Git не передаются на мой сервер. Вы также можете сохранить HTML + JS локально и запустить его, используя URL "file:///". Проверено на Chrome 48 и Firefox 43 на Ubuntu 12.04.

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

http://bit-booster.blogspot.ca/

Вот скриншот образца HTML файла, сгенерированного инструментом:

http://bit-booster.com/graph.html (инструмент)

Ответ 12

В зависимости от того, как они выглядели. Я использую gitx, который делает такие снимки:

simple plot

Вы можете сравнить git log --graph vs. gitk с 24-way octopus merge (первоначально из http://clojure-log.n01se.net/date/2008-12-24.html):

24-way git octopus merge. Original URL was <code>http://lwn.net/images/ns/kernel/gitk-octopus.png</code>

Ответ 13

Я добавил три команды: git tree, git stree и git vtree. Я пойду через них в таком порядке.

[alias]
    tree = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset) %C(auto)%d%C(reset)\n         %C(black)[%cr]%C(reset)  %x09%C(black)%an: %s %C(reset)'

enter image description here

С git stree и git vtree я использую bash, чтобы помочь с форматированием.

[alias]
    logx = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset)+%C(dim black)(%cr)%C(reset)+%C(auto)%d%C(reset)++\n+++       %C(bold black)%an%C(reset)%C(black): %s%C(reset)'
    stree = !bash -c '"                                                                             \
        while IFS=+ read -r hash time branch message; do                                            \
            timelength=$(echo \"$time\" | sed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\");     \
            timelength=$(echo \"16+${#time}-${#timelength}\" | bc);                                 \
            printf \"%${timelength}s    %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"\";          \
        done < <(git logx && echo);"'

git_stree


[alias]
    logx = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset)+%C(dim black)(%cr)%C(reset)+%C(auto)%d%C(reset)++\n+++       %C(bold black)%an%C(reset)%C(black): %s%C(reset)'
    vtree = !bash -c '"                                                                             \
        while IFS=+ read -r hash time branch message; do                                            \
            timelength=$(echo \"$time\" | sed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\");     \
            timelength=$(echo \"16+${#time}-${#timelength}\" | bc);                                 \
            printf \"%${timelength}s    %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"$message\";  \
        done < <(git logx && echo);"'

git_vtree


EDIT: Это работает с git версией 1.9a. Значение цвета "auto", по-видимому, дебютирует в этом выпуске. Это приятное дополнение, потому что имена ветвей получат другой цвет. Это упрощает различие между локальными и удаленными ветвями, например.

Ответ 14

Для получения более подробного текстового вывода попробуйте:

git log --graph --date-order -C -M --pretty=format:"<%h> %ad [%an] %Cgreen%d%Creset %s" --all --date=short

Вы можете написать псевдоним в $HOME/.gitconfig

[alias]
    graph = log --graph --date-order -C -M --pretty=format:\"<%h> %ad [%an] %Cgreen%d%Creset %s\" --all --date=short

Ответ 15

gitg: просмотрщик репозитория на основе gtk, новый, но интересный и полезный http://git.gnome.org/browse/gitg
Я использую его в настоящее время

Ответ 16

Это мое мнение по этому вопросу:

Скриншот:

Screenshot

Использование:

git hist - Показать историю текущей ветки

git hist --all - Показать график всех ветвей (включая удаленные)

git hist master devel - Показать отношения между двумя или более ветвями

git hist --branches - Показать все локальные ветки

Добавить --topo-order сортировки --topo-order топологически, а не по дате (по умолчанию в этом псевдониме)

Выгоды:

  • Выглядит как обычный --decorate, поэтому с разными цветами для разных названий веток
  • Добавляет адрес коммитера
  • Добавляет фиксированную относительную и абсолютную дату
  • Сортирует совершает по дате

Настроить:

git config --global alias.hist "log --graph --date-order --date=short \
--pretty=format:'%C(auto)%h%d %C(reset)%s %C(bold blue)%ce %C(reset)%C(green)%cr (%cd)'"

Ответ 17

Хотя иногда я использую gitg, всегда возвращаюсь в командную строку:

[alias]
    #quick look at all repo
    loggsa = log --color --date-order --graph --oneline --decorate --simplify-by-decoration --all
    #quick look at active branch (or refs pointed)
    loggs  = log --color --date-order --graph --oneline --decorate --simplify-by-decoration
    #extend look at all repo
    logga  = log --color --date-order --graph --oneline --decorate --all
    #extend look at active branch
    logg   = log --color --date-order --graph --oneline --decorate
    #Look with date
    logda  = log --color --date-order --date=local --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ad%Creset %C(auto)%d%Creset %s\" --all
    logd   = log --color --date-order --date=local --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ad%Creset %C(auto)%d%Creset %s\"        
    #Look with relative date
    logdra = log --color --date-order --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ar%Creset %C(auto)%d%Creset %s\" --all
    logdr = log --color --date-order --graph --format=\"%C(auto)%h%Creset %C(blue bold)%ar%Creset %C(auto)%d%Creset %s\"  

    loga   = log --graph --color --decorate --all

    # For repos without subject body commits (vim repo, git-svn clones)
    logt  = log --graph --color --format=\"%C(auto)%h %d %<|(100,trunc) %s\"
    logta  = log --graph --color --format=\"%C(auto)%h %d %<|(100,trunc) %s\" --all        
    logtsa = log --graph --color --format=\"%C(auto)%h %d %<|(100,trunc) %s\" --all --simplify-by-decoration 

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

  • - цвет: прозрачный внешний вид
  • - график: визуализировать родителей
  • - дата-порядок: наиболее понятный взгляд на репо
  • - украсить: кто есть кто
  • - oneline: много раз все, что вам нужно знать о фиксации
  • - упростить оформление: базовый для первого взгляда (только теги, соответствующие слияния, ветки)
  • - все: сохранение нажатий клавиш со всем псевдонимом с этой опцией и без нее.
  • - date = relative (% ar): понимать активность в репо (иногда ветка немного коммитируется рядом с мастером, но месяцев назад от него).

См. в последней версии git (1.8.5 и выше), вы можете использовать% C (auto) в украшении заполнителя% d

Отсюда вам нужно хорошо понять gitrevisions, чтобы фильтровать все, что вам нужно (что-то вроде master..develop, где -simplify-merges может помощь с длинными ветвями)

Сила за командной строкой - это быстрая конфигурация, основанная на ваших потребностях (понять, что репо не является уникальной конфигурацией журнала ключей, поэтому иногда требуется добавить -numstat или -raw или -name-status. Здесь git log и aliases бывают быстрыми, мощными и (со временем) самым красивым графиком, который вы можете достичь. Более того, с выходом, показанным по умолчанию через пейджер (скажем, меньше), вы всегда можете быстро искать результаты внутри. всегда может анализировать результат с помощью таких проектов, как gitgraph

Ответ 18

Слегка подправив Слиппу потрясающий ответ, вы можете использовать его псевдонимы для входа только в одну ветку:

[alias]
lgBranch1 = log --graph --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(bold white)— %an%C(reset)%C(bold yellow)%d%C(reset)' --abbrev-commit --date=relative
lgBranch2 = log --graph --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n''          %C(white)%s%C(reset) %C(bold white)— %an%C(reset)' --abbrev-commit
lg = !"git lg1"

Оставив --all теперь вы можете сделать

git lgBranch1 <branch name>

или даже

git lgBranch1 --all

Ответ 19

У меня есть псевдоним git log в ~/.gitconfig для просмотра истории графа:

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

При этом git l выведет что-то вроде:

enter image description here

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

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

Ответ 20

GitGraph

Создает PNG или SVG-представление вашей истории фиксации репозитория Git.

https://code.google.com/p/gitgraph

Ответ 21

Я предлагаю tig https://github.com/jonas/tig, намного лучший инструмент командной строки для git.

Вы можете использовать homebrew для установки TIG на MacOS:

$ brew install tig
$ tig

enter image description here

Ответ 22

Попробовали ли вы gitk или gitk --all? Однако у него нет функции print/save img as.

Ответ 23

git -c core.pager='less -SRF' log --oneline --graph --decorate

Это моя терминальная вариация, похожая на многие ответы здесь. Мне нравится корректировать флаги, переданные в less, чтобы предотвратить перенос слов.

example output

Я установил это для псевдонима для быстрого доступа, так как команда немного громоздка.

Ответ 24

Попробуйте Дитаа. Он может преобразовать любую диаграмму ASCII в изображение. Хотя он не был разработан с учетом веток Git, я был впечатлен результатами.

Источник (текстовый файл):

        +--------+
        | hotfix |
        +---+----+
            |
--*<---*<---*
       ^ 
       |
       \--*<---*
               |
           +---+----+
           | master |
           +--------+

Команда:

java -jar ditaa0_9.jar ascii-graph.txt

Результат:

enter image description here

Он также поддерживает фоновые цвета, пунктирные линии, различные формы и многое другое. Смотрите примеры.

Ответ 25

Там фанк Git commit graph как одна из демонстраций Raphael веб-графической библиотеки.

Демонстрация статична, но достаточно легко взять код и поменять свои статические данные на живой набор данных - я думаю, что он просто Git фиксирует данные в формате JSON.

Демо здесь: http://dmitrybaranovskiy.github.io/raphael/github/impact.html

Ответ 26

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

  • Перейдите в представление графика вашего репозитория, например, https://gitlab.com/gitlab-org/gitter/webapp/network/develop

  • Прокрутите график вниз до дна (ленивый загружает коммиты!)

  • Используйте инспектор браузера, чтобы скопировать элемент SVG в новый файл

  • Откройте его в выбранном вами рендерере, например, Inkscape

enter image description here

Ответ 27

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

Ответ 28

некоторые псевдонимы в ~/.oh-my-zsh/plugins/git/git.plugin.zsh

gke='\gitk --all $(git log -g --pretty=%h)'
glg='git log --stat'
glgg='git log --graph'
glgga='git log --graph --decorate --all'
glgm='git log --graph --max-count=10'
glgp='git log --stat -p'
glo='git log --oneline --decorate'
glog='git log --oneline --decorate --graph'
gloga='git log --oneline --decorate --graph --all'
glol='git log --graph --pretty='\''%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\'' --abbrev-commit'
glola='git log --graph --pretty='\''%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\'' --abbrev-commit --all'

Ответ 29

Для пользователей OSX я применил пример @gospes и немного изменил его для gsed (gnu-sed, установленный через homebrew) и скорректировал цвета (для работы с черным фоном, не уверен, как может выглядеть исходный пример как это делается в примере, поскольку он указывает черный текст на терминале с черным фоном).

[alias]
    # tree, vtree, stree support
    logx = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset)+%C(bold black)(%cr)%C(reset)+%C(auto)%d%C(reset)++\n+++       %C(bold black)%an%C(reset)%C(bold black): %s%C(reset)'
    tree = log --all --graph --decorate=short --color --format=format:'%C(bold blue)%h%C(reset) %C(auto)%d%C(reset)\n         %C(bold black)[%cr]%C(reset)  %x09%C(bold black)%an: %s %C(reset)'
    stree = !bash -c '" \
    while IFS=+ read -r hash time branch message; do \
        timelength=$(echo \"$time\" | gsed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\"); \
        timelength=$(echo \"16+${#time}-${#timelength}\" | bc); \
        printf \"%${timelength}s    %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"\"; \
    done < <(git logx && echo);"' | less -r
    vtree = !bash -c '" \
    while IFS=+ read -r hash time branch message; do \
      timelength=$(echo \"$time\" | gsed -r \"s:[^ ][[]([0-9]{1,2}(;[0-9]{1,2})?)?m::g\"); \
      timelength=$(echo \"16+${#time}-${#timelength}\" | bc); \
      printf \"%${timelength}s    %s %s %s\n\" \"$time\" \"$hash\" \"$branch\" \"$message\"; \
    done < <(git logx && echo);"' | less -r

Ключ для OSX - это сначала установить gnu sed (у которого есть опция -r). Наиболее легко сделать с помощью доморощенного, который не перезапишет установленный системой sed, а вместо этого установит gnu sed как "gsed". Надеюсь, это поможет @SlippD.Thompson, который прокомментировал выше о том, что OSX не работает.

Ответ 30

Глядя на этот разговор, попытался использовать мою любимую git-cola & git-dag. Запуск View->DAG... из git-cola и замена Log: master -- на --all показывает симпатичный график со всеми ветвями.