Я видел, что в некоторых книгах и статьях есть действительно красивые графические разделы ветвей и коммитов 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 lg2 выглядит следующим образом: 
Ответ 2
Многие из ответов здесь хороши, но для тех, кто просто хочет получить ответ в одну строку без указания псевдонимов или чего-то еще, вот он:
git log --all --decorate --oneline --graph
 Не все будут делать git log все время, но когда вам это нужно, просто помните:
"Собака"= мерзавец журнал - это LL - д ecorate - о neline - г Раф
Ответ 3
Для текстового вывода вы можете попробовать:
git log --graph --abbrev-commit --decorate --date=relative --all
или:
git log --graph --oneline --decorate --all
или: здесь псевдоним graphviz для рисования графа DAG.
Ответ 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);

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

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

Проверьте это с помощью JSFiddle.
Создайте его с помощью Git Grapher от @bsara.
Ответ 5
Построено поверх TikZ и PGF, gitdags представляет собой небольшой пакет LaTeX, который позволяет вам без особых усилий создавать графики графической графики и т.д.
Автоматическая генерация существующего графика фиксации репозитория не является целью gitdags; графики, которые он производит, предназначены только для образовательных целей.
Я часто использую его для создания графиков для ответов на вопросы Git в качестве альтернативы графикам фиксации ASCII:
- Как я могу сделать исправление для мастера и интегрировать его в мои менее стабильные ветки?
- Как Git совершать -amend работать, точно?
- Почему Git скажите мне "Не в настоящее время в любом филиале" после того, как я запустил "git происхождение известа /<branch> "
- В чем разница между объединением мастера в ветку и объединением ветки в мастер?
- Git rebase -preserve-merges не удается
Вот пример такого графика, демонстрирующего эффекты простой перестановки:
 
\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:
Ответ 7
SourceTree - действительно хороший. Он распечатывает хорошо выглядящую и среднюю историю и график ветвей: (в экспериментальном проекте Git выполняется следующее, чтобы увидеть некоторые ветки). Поддерживает Windows 7+ и Mac OS X 10.6 +.
 
Ответ 8
Я только что написал один инструмент, который может генерировать симпатичный git фиксирует граф, используя HTML/Canvas.
И создайте плагин jQuery, который упростит его использование.
[github] https://github.com/tclh123/commits-graph
Предварительный просмотр:
 
Ответ 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"
Вот как выглядит вывод на терминале:
Ответ 10
Основываясь на скрипте Graphviz, который я нашел в ответе на связанный вопрос, я взломал скрипт ruby, который создает сводное представление хранилища git. Он исключает всю линейную историю и просто показывает "интересные" коммиты, то есть те, у которых несколько родителей, несколько детей или на которые указывает ветка или тег. Вот фрагмент графика, который он генерирует для jquery:
 
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, который делает такие снимки:
 
Вы можете сравнить git log --graph vs. gitk с 24-way octopus merge (первоначально из http://clojure-log.n01se.net/date/2008-12-24.html):
 
Ответ 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)'
С 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);"'
 
[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);"'
 
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
Это мое мнение по этому вопросу:
Скриншот:
Использование:
 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 выведет что-то вроде:
 В Git 2.12 + вы даже можете настроить цвета линий графика, используя  log.graphColors конфигурации  log.graphColors.
 Что касается формата журналов, он похож на  --oneline, с добавлением имени автора (относительно .mailmap) и относительной даты автора. Обратите внимание, что синтаксис %C(auto), который указывает Git использовать цвета по умолчанию для хэша коммита и т.д., Поддерживается в Git> = 1.8.3.
Ответ 20
GitGraph
Создает PNG или SVG-представление вашей истории фиксации репозитория Git.
Ответ 21
 Я предлагаю tig https://github.com/jonas/tig, намного лучший инструмент командной строки для git.
Вы можете использовать homebrew для установки TIG на MacOS:
$ brew install tig
$ tig
Ответ 22
Попробовали ли вы gitk или gitk --all? Однако у него нет функции print/save img as.
Ответ 23
git -c core.pager='less -SRF' log --oneline --graph --decorate
Это моя терминальная вариация, похожая на многие ответы здесь. Мне нравится корректировать флаги, переданные в less, чтобы предотвратить перенос слов.
Я установил это для псевдонима для быстрого доступа, так как команда немного громоздка.
Ответ 24
Попробуйте Дитаа. Он может преобразовать любую диаграмму ASCII в изображение. Хотя он не был разработан с учетом веток Git, я был впечатлен результатами.
Источник (текстовый файл):
        +--------+
        | hotfix |
        +---+----+
            |
--*<---*<---*
       ^ 
       |
       \--*<---*
               |
           +---+----+
           | master |
           +--------+
Команда:
java -jar ditaa0_9.jar ascii-graph.txt
Результат:
Он также поддерживает фоновые цвета, пунктирные линии, различные формы и многое другое. Смотрите примеры.
Ответ 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 
Ответ 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 показывает симпатичный график со всеми ветвями.












