Досить git гілки графіки


1385

Я бачив, що в деяких книгах і статтях є дуже гарні графіки гітів і коміксів. Як я можу зробити якісні зображення для друку з історії git?


4
Я створив сценарій python, щоб створити графік! Поглянь. github.com/chode/git-graph
Стефан Бехтер

4
Якщо ви хочете якісно та друкувати , мій інструмент ( bit-booster.com/graph.html ) перетворює "git log" у SVG. Для отримання додаткової інформації дивіться мою відповідь .
Г. Сільві Девіс

2
Ви шукаєте інструмент для візуалізації власної історії git - або - інструмент для створення графіків, який має спосіб намалювати досить "гіт Git"?
Урі Абрамсон


5
Я б видалив тег спрямовано-ациклічних графіків, оскільки це питання не має значення
Максим Дмитрієв

Відповіді:


1843

Оновлення: Ця відповідь привернула набагато більше уваги, ніж заслуговує. Спочатку він був розміщений, тому що я думаю, що графіки виглядають добре, і їх можна було переписати в Illustrator для публікації - і не було кращого рішення. Але зараз існує набагато більш застосовні відповіді на це питання, такі як фракц , джубоби або Гаррі Лі ! Будь ласка, перейдіть на пропозицію !!

Оновлення 2: Я опублікував вдосконалену версію цієї відповіді на візуалізацію топології гілки у питанні git , оскільки там набагато доречніше. Ця версія включає в себе відомості lg3про автора та інформацію про виконавця, тому вам слід перевірити це. Залишаючи цю відповідь з історичних (& rep, я визнаю) причин, хоча я дуже спокусився просто її видалити.

Мій 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


35
Так, я. Звичайними та яскравими / жирними кольорами є: чорний #202020/ #555555, червоний: #5d1a14/ #da4939, зелений: #424e24/ #a5c261, жовтий: #6f5028/ #ffc66d, синій: #263e4e/ #6d9cbe, пурпурний: #3e1f50/ #a256c7, блакитний: #234e3f/ #62c1a1та білий: #979797/ #ffffff.
Сліпп Д. Томпсон

3
@Turbo: Для мене кольори змінюються в налаштуваннях профілю мого термінального додатка (Terminal.app). Термінальна програма, яку ви використовуєте, може або не підтримує зміну кольорів, що відображаються для заданих кольорів ANSI. Також тире (em dash, точно) було створено за допомогою параметра-shift- [клавіша-мінус]. Я припускаю, що я помилково припустив, що всі поточні платформи були зрівняні з Unicode.
Сліп Д. Томпсон

3
Ваші --date=relativeі --abbrev-commitзайві, оскільки ви явно використовуєте %crі %h, відповідно.
сірий

6
Я б додав %C(auto)модифікатор до імен ( %d), щоб отримати більш приємні кольори. Див stackoverflow.com/questions/5889878/color-in-git-log / ...
Josef Eisl

2
Чудова відповідь. Я змінив команду, щоб більше нагадувати вихід --oneline --decorate зlg = log --graph --abbrev-commit --decorate --format=format:'%C(yellow)%h%C(reset)%C(auto)%d%C(reset) %C(normal)%s%C(reset) %C(dim white)%an%C(reset) %C(dim blue)(%ar)%C (reset)' --all
Craig P. Motlin

1196

Багато відповідей тут чудові, але для тих, хто просто хоче простий один рядок до точкової відповіді, не потрібно встановлювати псевдоніми або щось додаткове, ось це:

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

Далеко не кожен би займався git logпостійно, але коли вам це потрібно, просто пам’ятайте:

« Собака » = мерзотник журнал - LL - д ecorate - про neline - г Раф

enter image description here


252
git config --global alias.adog "log --all --decorate --oneline --graph"
fracz

4
Я так довго шукав, що --allзбираюся плакати (T_T) ДЯКУЮ!
Феліпе Джерард

2
- в Git 1.6.3 була введена одна лінія : github.com/git/git/blob/… --pretty = oneline буде працювати з версіями Git до 1.6.3
Пат Майрон

13
найкраща відповідь на ТАК. Дякуємо за те, що зберігаєте це.
Tobias

4
Я думаю, що "--decorate" тепер включений за замовчуванням. Але я все одно пам’ятаю абревіатуру таким чином!
JosiahYoder-deactive за винятком ..

378

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

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

або:

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

або: ось графічний псевдонім для малювання графіка DAG.

Я особисто використовую gitx, gitk --allі gitnub.


14
Я б додав --abbrev-commit --decorate, і тоді це ідеально!
асиметричний

6
--abbrev-коміція мається на увазі під --oneline, ні?
dwineman

4
@dwineman так, --abbrev-commitякщо вам не потрібно--oneline
Thomas

2
Схоже , що у вашій другому рядку аргумент марно. Я не бачу жодної дати в журналі. git log --graph --oneline --decorate --date=relative --all--date
Лернер Чжан

дата не відображається, коли - вказана
лінія

253

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);

зразковий графік, згенерований за допомогою Gitgraph.js

або з metroшаблоном:

Тема метро GitGraph.js

або з повідомленнями, авторами та тегами фіксування:

GitGraph з повідомленнями фіксування

Перевірте його за допомогою JSFiddle .

Створіть це за допомогою Git Grapher від @bsara.


3
Так, це абсолютно дивовижно! Опублікував це у скрипці jsfiddle.net/guan1oz1, щоб ви могли перевірити це відразу.
berkus

14
Стрілки повинні вказувати на батьків (ів), проте не на дітей.
jub0bs

4
@Jubobs: Добре. Це звичайна перешкода для людей, які намагаються зрозуміти Git: вони думають про послідовність часу замість спадкування. Пояснюючи, що (майже) все в git є відносним до чогось попереднього, допомагає всім іншим творам стати на місце.
Сліп Д. Томпсон

6
Щодо напрямку стрілки, з документів: @ @param {Boolean} [options.reverseArrow = false] - Зробіть стрілки вказівними на предків, якщо це правда
Скотт

2
FYI, побачивши цю публікацію та погравши з gitgraph.js, вирішив створити невеликий інструмент, який в основному додає інтерфейс користувача до gitgraph.js. Це не закінчено, і інтерфейс користувача не є там, де я хочу, щоб це було ще, але внески вітаються! погляньте: github.com/bsara/git-grapher
bsara

123

Побудований на вершині TikZ & PGF , gitdagsце невеликий пакет LaTeX, який дозволяє без особливих зусиль виробляти графіки фіксації векторної графіки тощо.

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

Я часто використовую його для отримання графіків для моїх відповідей на питання Git, як альтернативу графікам ASCII:

Ось приклад такого графіка, що демонструє ефекти простої бази даних:

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

\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}

1
@Це чудово виглядає! Я також хотів би кілька рядків про те, як ним користуватися: розглянемо користувача Windows, у якого LaTeX взагалі не встановлений. Як скласти графік з нуля?
VonC

1
@VonC Я не впевнений, але якщо ви не хочете встановлювати LaTeX, ви, можливо, зможете скласти свої графіки на ShareLatex і WriteLaTeX , і подібні. Я :)
загляну

Це чудові речі! Я напишу підручник у якийсь момент, але поки що я просто хотів зазначити, що ви можете після обробки ваших графіків використовувати окремий документ-клас (я використовую функцію обрізання), використовувати latex input.texдля створення двигунів, а потім, нарешті, використовувати dvisvgm input.dviдля створення SVG з прозорістю. Перетворити з SVG в растровий формат, як PNG, досить легко convert -antialias -density 300 -background none input.svg output.png. До речі, ці зображення виглядають приголомшливо при повній прозорості. Все ще працюю над проблемою шрифту ... i.imgur.com/1Xu2Ry5.png
vmrob

5
Мені знадобилось певний час, щоб це працювало, тому я написав покроковий посібник, як змусити gitdags працювати з нуля на Ubuntu 14.04
ChrisFreeman

1
@AndreaPolci Для прикладу злиття див. Github.com/Jubobs/gitdags/isissue/3 . Документація gitdagsна дорогу!
jub0bs

79

Gitg - це клон Gitk та GitX для GNOME (він також працює на KDE тощо), який показує досить кольоровий графік.

Він активно розвивається (станом на 2012 рік). Це дозволяє сортувати коміти (графічні вузли) або хронологічно, або топологічно , і приховати комітети, які не призводять до обраної гілки.

Він добре працює з великими сховищами та складними графіками залежностей.

Зразкові скріншоти, що показують сховища linux-git та linux-2.6:

linux-git

linux-2.6


60

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

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

http://www.sourcetreeapp.com/


Він також доступний у App Store, тому оновлення має працювати автоматично.
WebOrCode

Я люблю графік sourcetree, але я вважаю за краще використовувати командний рядок, а параметри sourcetree завжди псуються з моїми репостами.
SgtPooki

SourceTree наполягає на тому, що ви створите обліковий запис Atlassian (або скористайтеся своїм обліковим записом google та наділіть Atlassian деякими дозволами, щоб отримати електронну пошту та інформацію про профіль), а після встановлення на Mac (OS X El Capitan v 10.11.5) не вдасться зробити крок "Клонування": "fatal: в субстанціях .gitmodules для шляху '<шлях пропущений>'" не знайдено відображення підмодулів, а також дивне попередження: "шаблони не знайдені / usr / local / git / share / git-core / templates". Дуже незрозумілі повідомлення, не такі великі.
Дмитро Шевкопляс

3
А потім після видалення не забудьте виправити свої привілеї безпеки Google, які ви надали раніше: myaccount.google.com/security -> Підключені додатки та сайти -> Програми, підключені до вашого облікового запису -> Керування програмами
Дмитро Шевкопляс

60

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

І надайте плагін jQuery, який спрощує його використання.

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

Попередній перегляд:

попередній перегляд


Виглядає добре, як ви отримуєте заздалегідь відформатовані дані, щоб намалювати цей графік?
Ольга

3
@Olga Я просто додаю резервний код до мого репо. Ви можете переглянути його на github.
Гаррі Лі

56

git-forest це відмінний сценарій Perl, яким я користуюся вже більше року, і навряд чи користуюся цим git log безпосередньо команду.

Ось які речі мені подобаються у цьому сценарії:

  • Він використовує символи unicode для малювання ліній на графіку, надаючи більш безперервний вигляд лініям графіка.
  • Ви можете комбінувати --reverseз графіком вихід, що неможливо із звичайнимgit log команди.
  • Він використовує git logвнутрішньо, щоб схопити список комітетів, тому всі варіанти, які ви переходите, git logтакож можуть бути передані до цього сценарію.

У мене є псевдонім із використанням git-forestнаступного:

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

Ось як виглядає вихід на терміналі:

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


3
@ void.pointer - Так, це не буде, тому що git-forest - це сценарій perl та має залежність від модуля perl. Запуск git під cygwin із встановленими необхідними модулями perl може бути найкращою альтернативою, яку ви можете отримати, якщо ви справді цього хочете в Windows :)
Tuxdude,

1
Ух, ця репо має багато чудових інструментів. Дякую!
Eldelshell

1
Відмінно працює @MinGW (MSYS) під Win $; встановити CPANM; потім Git.pm; створіть псевдонім і ви готові йти.
Сектор

що це за приємний термінальний емулятор, який ви використовуєте? Мені подобаються графічні підказки речей.
NH.

Як встановити цей «скрипт»? Я на ubuntu.
користувач13107

50

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

Завантажити вихід із git log --pretty='%h|%p|%d' безпосередньо в інструмент і натисніть на посилання "завантажити graph.svg".

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

Він генерує HTML, який можна розмістити безпосередньо на будь-якій сторінці (включаючи блог блогів blogspot!). Ознайомтеся з деякими з публікацій блогу тут:

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

Ось скріншот зразка HTML-файлу, згенерованого інструментом:

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


1
@Jay здається, що колір відображає рівень відступу цієї конкретної гілки, і ці гілки можуть переходити до іншого стовпця і, отже, змінювати color.s
Thorbjørn Ravn Andersen

44

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

зразок jquery

git-big-picture та BranchMaster - це подібні інструменти, які намагаються показати лише структуру графіка високого рівня, лише показуючи, як пов’язані між собою теги, гілки, злиття тощо.

Це питання має ще кілька варіантів.


2
Я спробував це, але не зміг правильно працювати з результатами для нашого репо (42 відділення, 175 тегів, 42 000 комітів) ... Шкода ... Це саме те, що я шукав!
Xavier Nodet

1
@XavierNodet, якщо ваше репо є загальнодоступним та / або у вас є повідомлення про помилку тощо, будь ласка, надішліть проблему на GitHub. Дякую!
Метт Макенрі

38

Я додав три користувальницьких команд: 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);"'

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", очевидно, дебютує в цій версії. Це приємне доповнення, оскільки назви гілок отримають інше забарвлення. Це полегшує, наприклад, розрізнення місцевих та віддалених гілок.


fatal: bad color value 'auto' for variable '--pretty format':(
Поворот

Виявилася стара версія git. Yum має досить застарілу версію Git у своєму репо. Складено з джерела (1.9), і він чудово працює. Це теж красиво! Дякую @gospes!
Поворот

Не переходьте на OS X:sed: illegal option -- r
Slipp D. Thompson,

@ SlippD.Thompson: Я використовую Linux :). -R призначений для розширених регулярних виразів. Мабуть, OSX-версія версії sed не має. Можливо, ви могли б оновити sed. В іншому випадку ви можете просто переписати команду sed без розширеного регулярного вираження.
Євангелія

1
Для Mac OS X sed використовуйте -E замість -r
Baxter Lopez

37

Залежить від того, як вони виглядали. Я використовую gitx, який робить такі фотографії:

простий сюжет

Ви можете порівняти git log --graphпорівняно з gitk за 24-х напрямним злиттям восьминога (спочатку з http://clojure-log.n01se.net/date/2008-12-24.html ):

24-стрічкові злиття восьминога кісток.  Оригінальна URL-адреса була <code> http://lwn.net/images/ns/kernel/gitk-octopus.png </code>


49
Це смішно ... Я б присягнув, що чув, як ви говорите "злиття восьминога 24-х напрямків"!
DTY

4
З цікавості, хто-небудь намагався витягнути графічні програми GitX (або іншого інструмента) для малювання GUI в окремий виконуваний файл? Якщо я не помиляюсь, отримати какао для малювання у векторному PDF-файлі не складе труднощів, і це задовольнить потребу ОП у зображеннях для друку високого Q.
Сліпп Д. Томпсон

Це було на S3 через ескіз, перш ніж вони перекроїли свою річ. Я б хотів, щоб я все ще мав це. :(
Дастін

Просто замінив його на версію gitk від gitk lwn.net/images/ns/kernel/gitk-octopus.png , пов’язану з clojure-log.n01se.net/date/2008-12-24.html . @Dustin: сподіваюся, що це нормально. Це не той самий образ, але він служить подібній меті. З екрану екрану схоже, що це частина ядра Linux, тому, мабуть, ви могли б знайти цю передачу і повторно зробити еквівалентний скріншот gitx ....
naught101

34

Для більш детального виводу тексту, будь ласка, спробуйте:

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

29

Це моя думка щодо цього питання:

Знімок екрана:

Знімок екрана

Використання:

git hist - Показати історію поточної галузі

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

git hist master devel - Показати взаємозв'язок між двома або більше гілками

git hist --branches - Показати всі місцеві відділення

Додати --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)'"

28

gitg : переглядач репозиторіїв на базі gtk, це нове, але цікаве і корисне
http://git.gnome.org/browse/gitg
Я використовую його зараз


2
Це, здається, є клоном GitXі досить хорошим у цьому. Рекомендую
Ярек Т

28

Хоча іноді я використовую 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 

Як бачите, це майже натискання клавіш на збереження псевдонімів, засноване на:

  • - колір: чіткий вигляд
  • --graph: візуалізувати батьків
  • - дата-замовлення: найбільш зрозумілий погляд на репо
  • --decorate: хто є хто
  • - oneline: Багато разів все, що вам потрібно знати про вчинення
  • - спростити за декорацією: основні для першого погляду (лише теги, відповідні злиття, гілки)
  • --all: збереження натискань клавіш на всіх псевдонімах з цією опцією і без неї
  • --date = відносний (% ar): зрозуміти активність у репо (іноді гілка є декількома позиціями біля головного, але місяці тому від нього)

Дивіться в останній версії git (1.8.5 і вище), ви можете скористатися% C (auto) в оформленні заповнювача заповнення% d

Звідси все, що вам потрібно, - це добре розуміти gitrevision для фільтрування всього необхідного (щось на кшталт master..develop, де - спрощення-злиття може допомогти з довгостроковими гілками)

Потужність командного рядка - це швидкий конфігурація, що базується на ваших потребах (зрозумійте, репо не є унікальною конфігурацією журналу ключів, тому додавання --numstat, або --raw або --name-status іноді потрібно. Тут git log і псевдоніми - це швидкий, потужний і (з часом) найкрасивіший графік, який ви можете досягти. Навіть більше, із результатами, показаними за замовчуванням через пейджер (скажімо менше), ви завжди можете швидко шукати всередині результатів. Не впевнені? Ви завжди можете проаналізувати результат з такими проектами, як gitgraph


Дуже хороший. Додавання їх до моєї конфігурації. Але я рекомендую змінити% Cred% d% Creset на% C (автоматично)% d% Creset, який надасть різні кольори для віддалених або локальних назв відділень
MarkB42

17

Дуже трохи налаштувавши дивовижну відповідь Сліппа , ви можете використовувати його псевдоніми для реєстрації лише однієї гілки:

[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

15

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

Ви можете використовувати домашню мову для встановлення tig на macOS:

$ brew install tig
$ tig

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


14

У мене є цей 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
git log --graph --oneline просто щоб переконатися, що oneliner не загубився
ценапатія

чи є спосіб поставити назви гілок на лівій стороні?
anaval

12

Ви спробували gitkчи gitk --all? Однак у нього немає функції друку / збереження зображення як функції.


3
gitk ефективний, але не дуже гарний.
Йоган

Той факт, що він вбудований, робить для мене приємним та безпроблемним. Особливо --allпоказує вам усі гілки.
BcK


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

Це мій варіант терміналу, подібний до багатьох відповідей тут. Мені подобається регулювати передані прапори, lessщоб запобігти загортанню слова

Приклад виведення

Я встановив цей псевдонім для швидкого доступу, оскільки команда трохи громіздка.


8

Спробуйте дітаю . Він може перетворити будь-яку діаграму ASCII в зображення. Хоча це не було розроблено з урахуванням гілок Git, я був вражений результатами.

Джерело (файл txt):

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

Команда:

java -jar ditaa0_9.jar ascii-graph.txt

Результат:

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

Він також підтримує кольори тла, пунктирні лінії, різні форми тощо. Дивіться приклади .


1
Аналогічно, casual-effects.com/markdeep є дуже потужним для створення вручну впорядкованих діаграм мистецтва ascii.
Бені Чернявський-Паскін

7

Якщо ваш репозиторій сидить у Gitlab, ви можете використовувати його графічне подання, яке відображається як SVG у вашому браузері.

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

  • Прокрутіть графік донизу (це ліниві навантаження здійснюються!)

  • За допомогою інспектора браузера скопіюйте елемент SVG у новий файл

  • Відкрийте його у вибраному рендері, наприклад Inkscape

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


6

Я не знаю про прямий інструмент, але, можливо, ви можете зламати скрипт, щоб експортувати дані у крапковий формат і відтворювати їх за допомогою графівізу.


Спробуйте це github.com/gugod/bin/blob/master/git-graphviz . У мене не було всіх залежностей у моєму корпоративному середовищі, тому зміна цих ioкоманд на просту команду perl `git log [...]` працювала на мене.
Росс Роджерс

Якщо ви на Mac і хочете спробувати цей скрипт, ви можете схопити perl brew install perl dotі потім cpan common::sense IO::allотримати залежності. Потім просто передайте висновок у відповідну команду, наприклад git-graphviz | dot -Tpng -o repo.png. Однак вихід не сильно відрізняється від git-big-picture .
jrhorn424

6

Один з демонстрацій веб-графічної бібліотеки Рафаеля є прикольним графіком фіксації Git .

Демонстрація є статичною, але вона повинна бути досить простою, щоб взяти код і поміняти своїми статичними даними на прямий набір даних - я думаю, що це лише дані Git фіксації у форматі JSON.

Демонстраційна версія тут: http://dmitrybaranovskiy.github.io/raphael/github/impact.html


1
Це той самий код графа, який використовується на графіках впливу GitHub, ні? (наприклад, github.com/DmitryBaranovskiy/raphael/graphs/impact )
Сліпп Д. Томпсон

@Sven: Дякую, що вказали на це. Я виправив непрацюючі посилання для вас, хоча, майте на увазі, що цій відповіді є п’ять років, і, отже, останнім часом може бути краще рішення.
Спудлі

@ SlippD.Thompson цей код зараз знаходиться на github.com/DmitryBaranovskiy/raphaeljs.com/tree/master/github
Вадим Котов

6

Приємний та чистий зовнішній вигляд графічного git-графіку для оболонок

з хешами, як зазвичай, крім дерева графіків

з хешами, як зазвичай, крім дерева графіків

або в додатковій колонці

або в додатковій колонці

Редагувати : Ви хочете почати відразу, не читаючи пояснень? Використовуйте фрагменти git, сценарій або фрагменти коду функції з розділу EDIT 5 нижче.

У всіх відповідях на це запитання жоден з них не показав чистого вигляду табличного вигляду для снарядів. Найближчою була ця відповідь з євангелій, з яких я почав.

Основний момент мого підходу - рахувати лише символи дерева, показані користувачеві. Потім заповніть їх на власну довжину пробілами.

Крім git вам потрібні ці інструменти

  • греп
  • пасти
  • printf
  • sed
  • сл
  • тр
  • туалет

переважно на борту з будь-яким дистрибутивом Linux.

Фрагмент коду є

while IFS=+ read -r graph hash time branch message;do

  # count needed amount of whitespaces and create them
  whitespaces=$((9-$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)))
  whitespaces=$(seq -s' ' $whitespaces|tr -d '[:digit:]')

  # show hashes besides the tree ...
  #graph_all="$graph_all$graph$(printf '%7s' "$hash")$whitespaces \n"

  # ... or in an own column
  graph_all="$graph_all$graph$whitespaces\n"
  hash_all="$hash_all$(printf '%7s' "$hash")  \n"

  # format all other columns
  time_all="$time_all$(printf '%12s' "$time") \n"
  branch_all="$branch_all$(printf '%15s' "$branch")\n"
  message_all="$message_all$message\n"
done < <(git log --all --graph --decorate=short --color --pretty=format:'+%C(bold 214)%<(7,trunc)%h%C(reset)+%C(dim white)%>(12,trunc)%cr%C(reset)+%C(214)%>(15,trunc)%d%C(reset)+%C(white)%s%C(reset)' && echo);

# paste the columns together and show the tablelike output
paste -d' ' <(echo -e "$time_all") <(echo -e "$branch_all") <(echo -e "$graph_all") <(echo -e "$hash_all") <(echo -e "$message_all")

Для обчислення необхідних пробілів ми використовуємо

  sed -nl500 'l' <<< "$graph"

щоб отримати всі символи (до 500 на рядок), ніж вибрати лише символи дерева: * | / \ _ і пробіли з

  grep -Eo '\\\\|\||\/|\ |\*|_'

нарешті підрахуйте їх і підсумовуйте результат із вибраного нами значення довжини, що становить 9 у прикладі.

Для отримання розрахованої кількості пробілів ми використовуємо

  seq -s' ' $whitespaces

і обрізати номери позицій за допомогою

  tr -d '[:digit:]'

ніж додати їх у кінець нашого рядка графіка. Це воно!

У Git є хороший варіант форматування довжини специфікаторів виводу вже з синтаксису'%><(amount_of_characters,truncate_option)' , який додає пробіли з лівої сторони '>' або справа '<' і може скоротити символи з початку 'ltrunc', середнього 'mtrunc' або кінця 'trunc'.

Це важливо , що вище використання PRINTF CMD те ж значення довжини для відповідного стовпчика мерзотника.

Веселіться, щоб створити свій власний чистий стіл, схожий на свої потреби.

Додатково:

Щоб отримати правильне значення довжини, ви можете скористатися наступним фрагментом

while read -r graph;do
    chars=$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)
    [[ $chars -gt ${max_chars:-0} ]] && max_chars=$chars
done < <(git log --all --graph --pretty=format:' ')

і використовуйте $ max_chars як правильне значення довжини вище.


EDIT 1 : Щойно зауважив, що підкреслений характер також використовується у дереві git та відповідно відредагуйте фрагменти коду. Якщо відсутні інші символи, залиште коментар.


EDIT 2 : Якщо ви хочете позбутися дужок навколо записів гілок та тегів, просто використовуйте "% D" замість "% d" у команді git, як у EDIT 3.


EDIT 3 : Можливо, варіант "автоматичного" кольору є саме тим, який ви найбільше віддаєте перевагу для записів гілок та тегів?

git без брекетів, автоматична кольорова голова та тег, схожі на таблицю оболонки

Змінення цієї частини команди git (колір 214 )

%C(214)%>(15,trunc)%D%C(reset)

до авто

%C(auto)%>(15,trunc)%D%C(reset)


РЕДАКТИКА 4 : Або вам подобається ваша власна суміш кольорів для цієї частини, вигадливий вихід із мерехтливою головкою?

git дерево вишукане стилеподібний вихід

Для того, щоб ми могли спочатку накреслити назви заголовків, гілок та тегів, нам потрібна опція "автоматичний" колір у нашій команді git, як у EDIT 3.

Тоді ми можемо замінити значення знань кольору на наші власні, додавши ці 3 рядки

 # branch name styling
 branch=${branch//1;32m/38;5;214m}
 # head styling
 branch=${branch//1;36m/3;5;1;38;5;196m}
 # tag styling
 branch=${branch//1;33m/1;38;5;222m}

безпосередньо перед рядком

 branch_all="$branch_all$(printf '%15s' "$branch")\n"

у нашому фрагменті коду. Значення заміни створюють кольори, наведені вище.

Наприклад, значення заміщення для голови є

3;5;1;38;5;196

де 3; позначає курсив, 5; для блимання та 1; 38; 5; 196 для кольору. Більше інформації почніть тут. Примітка. Така поведінка залежить від вашого улюбленого терміналу і тому може бути непридатною для використання.

Але ви можете вибрати будь-яке значення кольору.

ОГЛЯД значень кольору git та еквівалентів ANSI

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

Тут ви знайдете список із кольором / стилем git .

Якщо вам потрібен вихід на вашій консолі для отримання точних кольорів (малюнок вище зменшується stackoverflow), ви можете зробити висновок за допомогою

for ((i=0;i<=255;i++));do
  while IFS='+' read -r tree hash;do 
    echo -e "$(printf '%-10s' "(bold $i)") $hash  $(sed -nl500 'l' <<< "$hash"|grep -Eom 1 '[0-9;]*[0-9]m'|tr -d 'm')"
  done < <(git log --all --graph --decorate=short --color --pretty=format:'+%C(bold '$i')%h%C(reset)'|head -n 1)
done

у вашому шляху проекту git, який використовує першу фіксацію з вашого виводу журналу git.


EDIT 5 : Як згадував член "Andras Deak", є кілька способів використання цього коду:

1) як псевдонім :

псевдонім не приймає параметри, але функція може , тому просто визначте у своєму .bashrc

   function git_tably () {
     unset branch_all graph_all hash_all message_all time_all max_chars

     ### add here the same code as under "2) as a shell-script" ###

   }

і зателефонуйте функції git_tably (походить від таблиці) безпосередньо під ваш проект проекту git або звідти, де ви хочете, як перший параметр вашого git project path.

2) як оболонка-скрипт :

Я використовую його з можливістю передавати до нього каталог git як перший параметр або, якщо він порожній, приймати робочу директорію як звичайну поведінку. В цілому ми маємо

# edit your color/style preferences here or use empty values for git auto style
tag_style="1;38;5;222"
head_style="1;3;5;1;38;5;196"
branch_style="38;5;214"

# determine the max character length of your git tree
while IFS=+ read -r graph;do
  chars_count=$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)
  [[ $chars_count -gt ${max_chars:-0} ]] && max_chars=$chars_count
done < <(cd "${1:-"$PWD"}" && git log --all --graph --pretty=format:' ')

# create the columns for your prefered tablelike git graph output
while IFS=+ read -r graph hash time branch message;do

  # count needed amount of whitespaces and create them
  whitespaces=$(($max_chars-$(sed -nl1000 'l' <<< "$graph" | grep -Eo '\\\\|\||\/|\ |\*|_' | wc -l)))
  whitespaces=$(seq -s' ' $whitespaces|tr -d '[:digit:]')

  # show hashes besides the tree ...
  #graph_all="$graph_all$graph$(printf '%7s' "$hash")$whitespaces \n"

  # ... or in an own column
  graph_all="$graph_all$graph$whitespaces\n"
  hash_all="$hash_all$(printf '%7s' "$hash")  \n"

  # format all other columns
  time_all="$time_all$(printf '%12s' "$time") \n"
  branch=${branch//1;32m/${branch_style:-1;32}m}
  branch=${branch//1;36m/${head_style:-1;36}m}
  branch=${branch//1;33m/${tag_style:-1;33}m}
  branch_all="$branch_all$(printf '%15s' "$branch")\n"
  message_all="$message_all$message\n"

done < <(cd "${1:-"$PWD"}" && git log --all --graph --decorate=short --color --pretty=format:'+%C(bold 214)%<(7,trunc)%h%C(reset)+%C(dim white)%>(12,trunc)%cr%C(reset)+%C(auto)%>(15,trunc)%D%C(reset)+%C(white)%s%C(reset)' && echo);

# paste the columns together and show the tablelike output
paste -d' ' <(echo -e "$time_all") <(echo -e "$branch_all") <(echo -e "$graph_all") <(echo -e "$hash_all") <(echo -e "$message_all")

3) як псевдонім git :

Можливо, найзручніший спосіб - додати псевдонім git у свою .gitconfig

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

[alias]
    count-log = log --all --graph --pretty=format:' '
    tably-log = log --all --graph --decorate=short --color --pretty=format:'+%C(bold 214)%<(7,trunc)%h%C(reset)+%C(dim white)%>(12,trunc)%cr%C(reset)+%C(auto)%>(15,trunc)%D%C(reset)+%C(white)%s%C(reset)'
    tably     = !bash -c '"                                                                                                    \
                  while IFS=+ read -r graph;do                                                                                 \
                    chars_count=$(sed -nl1000 \"l\" <<< \"$graph\" | grep -Eo \"\\\\\\\\\\\\\\\\|\\||\\/|\\ |\\*|_\" | wc -l); \
                    [[ $chars_count -gt ${max_chars:-0} ]] && max_chars=$chars_count;                                          \
                  done < <(git count-log && echo);                                                                             \
                  while IFS=+ read -r graph hash time branch message;do                                                        \
                    chars=$(sed -nl1000 \"l\" <<< \"$graph\" | grep -Eo \"\\\\\\\\\\\\\\\\|\\||\\/|\\ |\\*|_\" | wc -l);       \
                    whitespaces=$(($max_chars-$chars));                                                                        \
                    whitespaces=$(seq -s\" \" $whitespaces|tr -d \"[:digit:]\");                                               \
                    graph_all=\"$graph_all$graph$whitespaces\n\";                                                              \
                    hash_all=\"$hash_all$(printf \"%7s\" \"$hash\")  \n\";                                                     \
                    time_all=\"$time_all$(printf \"%12s\" \"$time\") \n\";                                                     \
                    branch_all=\"$branch_all$(printf \"%15s\" \"$branch\")\n\";                                                \
                    message_all=\"$message_all$message\n\";                                                                    \
                  done < <(git tably-log && echo);                                                                             \
                  paste -d\" \" <(echo -e \"$time_all\") <(echo -e \"$branch_all\") <(echo -e \"$graph_all\")                  \
                                <(echo -e \"$hash_all\") <(echo -e \"$message_all\");                                          \
                '"

Чим просто дзвонити git tablyпід будь-який шлях проекту.

Git настільки потужний, що ви можете змінювати голову, теги, ... безпосередньо, як показано вище, і взяти звідси .

Ще один фантазійний варіант - вибрати кольори дерева, які вам найбільше подобаються

[log]
    graphColors = bold 160, blink 231 bold 239, bold 166, bold black 214, bold green, bold 24, cyan

це дає вам божевільний вигляд, але завжди табличний вихід з журналу git

fanciest_git_tree_tablelike_image

Занадто багато моргає! Просто, щоб продемонструвати, що можливо. Занадто мало вказаних кольорів призводить до кольорових повторів.

Повна довідка .gitconfig - лише один клік.

ПРОТИ: Приємно стилізувати свій власний чистий стіл, схожий на ваші потреби.


Ви маєте пояснити у своїй відповіді, як ці фрагменти bash перетворяться на модні команди, схожі на git. Можна зрозуміти, як використовується перегляд відповіді, яку ви зв'язали, але відповіді повинні бути самостійними
Андрас Дек,

Ти маєш на увазі, що я повинен детально пояснити cmd журналу git? Або ви можете надати мені приклад того, чого вам не вистачає, будь ласка.
запитання

Примітка. Цей фрагмент використовує висновок дивовижної команди журналу git, щоб отримати табличний вихід на терміналі. Отже, навпаки, як ви згадали;)
одинперепитування

Я подумав, що ти не набираєш 20 рядків удару кожен раз, коли це потрібно. Це має сенс визначати це як функцію bash або псевдонім git. Більшість читачів не будуть турбуватися, намагаючись доповнити ваш код, щоб зробити його легким у використанні. Це я мав на увазі. Якщо ви просто помістите код у випадковий файл sh на своєму шляху, ви можете мене проігнорувати.
Андрас Деак

1
Розумію. Дякую за пораду Я відредагую свою відповідь і додаю такий псевдонім. Зазвичай я використовую файли для таких "довгих" команд, як ви згадали. Але погоджуватись так, що обидва способи написані тут, набагато зручніше.
запитання

5

деякі псевдоніми в ~ / .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'

4

Для користувачів 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 не працює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.