Візуалізація галузевої топології в Git


883

Я граю з Git ізольовано на власній машині, і мені важко підтримувати ментальну модель всіх моїх гілок і зобов'язань. Я знаю, що я можу зробити, git logщоб побачити історію фіксів, звідки я є, але чи є спосіб побачити всю топографію гілок, щось подібне до цих карт ASCII, які, здається, використовуються скрізь для пояснення гілок?

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

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

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



1
@ leif81, напівдублікат для мене. @Masi явно виключив gitk у своєму питанні.
Benjol

Відповіді:


1081

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

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

git log --graph --decorate --oneline

46
Це навіть не позначає коміти з гілками. Я б не назвав це гарною візуалізацією такою, якою є.
Роман Старков

7
Дякую! gitg також має --allможливість, а також мітки комітів . Я також ніколи не бачив у спадному меню, що ви можете вибрати всі гілки там.
Томас

210
Я б рекомендував git log --graph --decorate --oneline- показує по одній фіксації на рядок та прикрашає назви гілок.
sleske

8
tig (клієнт ncurse git) також надає --allможливість. Досить зручно!
П'єр-Адрієн Буйсон

5
Дивіться також відповідь Ендрю щодо --simplify-by-decorationваріанту.
рувим

482

Я зазвичай використовую

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, але він прив’яже повідомлення до фіксації цифр, що виглядає менш симпатичним IMHO).

Щоб зробити ярлик для цієї команди, ви можете відредагувати свій ~/.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 = короткий --pretty = формат: "% x1b [31m% h% x09% x1b [32m% d% x1b [ 0m% x20% ad% s "
sehugg

7
--oneline - це більш запам'ятовується заміна для всього цього гарного форматування глибокої магії.
Даніель Ралстон,

1
@SodeltheVociferous, дійсно, я не підійшов до проблеми з тієї сторони, про яку ти говориш; Я розширив свою відповідь.
П Швед

2
Примітка: --full-historyактуально лише під час використання --simplify-by-decorationабо вказування файлового шляху.
Сліп Д. Томпсон

2
Чи можу я запитати, звідки у вас рядок формату? Або як на землі ти приготував цю річ?
elliotwesoff

443

У мене є 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виглядає приблизно так:

git lg1

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

git lg2

і git lg3виглядає так:

git lg3

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

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

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


10
Пропозиція: замінити %C(bold yellow)з %C(auto)за те, що різні кольори для HEAD, локальних і віддалених гілок ( реф ).
Atcold

2
Зауважте, що ви можете уникнути вручну додавання відступів у рядку формату за допомогою %w(); таким чином, ви також можете правильно обертати рядки довшими або багаторядковими повідомленнями, не псуючи графік.
charliegreen

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 або 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».
користувач16973

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 - кросплатформенний графічний інтерфейс, який показує топологію виразно .

Топологія

Ось короткий відео-посібник про деякі вдосконалені функції.


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 фіксованих файлів досить швидко досить часто.


Я також вибираю цей метод, але я створив псевдонім, щоб набрати "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

Він створює досить двовимірні графіки, використовуючи крапки / графік замість досить лінійних, "одновимірних" поглядів, що створюються gitk та друзями. За допомогою параметра -i він показує точки філії та об'єднання об'єктів, але залишає все між ними.


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

Він повинен масштабуватись із кількістю комісій просто добре (якщо ви використовуєте -i), це може стати нечитабельним, якщо у вас є складні гілки та злиття (але тоді, який інструмент не має)
Frank Osterfeld,

1
З нашим проектом середнього масштабу це створює величезну картину з тоннами ліній. Чи можна обмежити глибину, на яку він іде? Тобто вчиняється з останніх N днів або близько того.
Ондра Жижка


21

Погляньте на BranchMaster .

Я написав це для візуалізації складної структури гілки, згортаючи всі комісії між ними в один рядок. Цифри вказують на кількість комітів.

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


1
Це те, що я шукаю. Чи є альтернативні команди / інструменти для цього?
Алекс Габі

3
@AalexGabi Помістіть це у свій gitconfig, він робить те саме, але в командному рядку gbranch = журнал --graph - спростити за кольором --pretty = формат: '% C (жовтий)% h% C (білий)% d% C (жирний чорний)% ar% C (скидання)% n '
всі

Як ви отримуєте дані для візуалізації гілок?
Сніжинка

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 -> Графік редагування.


1
яка фантастична особливість, яка довго використовує черепаховий git, але не знаю цієї функції.
kreamik

Це спосіб простіше. Дякую.
Anoop


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


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


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 від D. Jayamanne:

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


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

2
Ще одне розширення для Visual Studio Code - це Git Graph від mhutchie. Я використовую це разом з GitLens.
Йозеф.B

7

Gitx - це також фантастичний інструмент візуалізації, якщо ви потрапили в ОС X.


3
gitk (для всіх) дуже схожий. не зовсім те саме, але досить схоже.
xero

Є кілька вилок Gitx - цей (rowanj), здається, найкращий на даний момент.
rjmunro

7

Ще одна команда журналу git. Цей із стовпцями фіксованої ширини :

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


3

У Windows є дуже корисний інструмент, який ви можете використовувати: розширення git. Це інструмент gui і робить операції з git дуже простими.

Крім того, це відкриті джерела.

http://gitextensions.github.io


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 (запам'ятайте собаку = - всі - декорат - он-лайн - граф)


1
Це те саме, що прийнята відповідь. Однак реквізит для мнемоніка
aljgom

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