Визуализация топологии ветвей в git

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

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

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

Я думаю, что я под влиянием AccuRev это браузер трансляция...

28 ответов


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

Edit: Для имен ветвей и компактного представления попробуйте: git log --graph --decorate --oneline


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

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) Mannual 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 succesfully
| *   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).

чтобы сделать ярлык для этой команды, вы можете изменить свой :

[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"

, а Содель громогласный заметки в комментарии, такие длинные команды форматирования трудно запомнить. Обычно это не проблема, поскольку вы можете поместить ее в . Однако, если вам иногда приходится входить в систему на удаленной машине, где вы не можете изменить файл конфигурации, вы можете использовать более простой, но быстрый тип version:
git log --graph --oneline

: у меня 3 псевдонима (и 4 псевдонима-Псевдонимы для быстрого использования) что я обычно бросаю в мой :

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

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


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

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


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

enter image description here

мотивировать меня писать GitVersionTree.

enter image description here


"99.999% моего времени просмотр истории git lg и 0.001% - это git log"

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

мне нравится, с 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 коммитов быстро достаточно часто.


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

Topology

здесь видео уроке о некоторых дополнительных функциях.


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


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

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


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

enter image description here


посмотреть BranchMaster.

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

enter image description here


хихикнуть рисует графики


Черепаха Git имеет инструмент под названием "график ревизий". Если вы находитесь в Windows, это так же просто, как щелкнуть правой кнопкой мыши на вашем РЕПО --> Tortoise Git --> график пересмотра.


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

[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


никто не упомянул tig? Он не складывает ветви, как "BranchMaster", но...

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

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

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

Он имеет обычные ярлыки,/ в поиск и т. д.

The revision graph

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

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


у меня есть это 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 опции настройки.

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


нашел этот блог который показывает в краткой форме:

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

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

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

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


мой личный любимый псевдоним, via .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"

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

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

проект здесь:https://github.com/git-up/GitUp

GitUp screenshot


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


старый пост, но проверить SmartGit. Это очень напоминает визуализацию ветви черепахи HG, и она бесплатна для некоммерческого использования.


другая команда журнала git. Этот с столбцы фиксированной ширины:

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

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

enter image description here


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

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

http://gitextensions.github.io


Я пробовал --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/).*/)/'
}

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

я использовал gitg и GitKraken для платформы linux. Оба хорошо понимают дерево фиксации


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

Как насчет простой войдите в Git --все --украшения --короткая --графика (вспомните собаку = --все --украшения --короткая --графика)