Визуализация топологии ветки в git - PullRequest
790 голосов
/ 03 декабря 2009

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

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

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

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

Ответы [ 28 ]

966 голосов
/ 03 декабря 2009

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

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

457 голосов
/ 03 декабря 2009

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

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, но он свяжет сообщения коммита с числами, что выглядит ИМХО менее привлекательно).

Чтобы создать ярлык для этой команды, вы можете отредактировать файл ~/.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"

Однако, как отмечает Sodel the Vociferous в комментариях, такую ​​длинную команду форматирования трудно запомнить. Обычно это не проблема, так как вы можете поместить его в файл ~/.gitconfig. Однако, если вам иногда приходится входить на удаленную машину, где вы не можете изменить файл конфигурации, вы можете использовать более простую, но более быструю версию:

git log --graph --oneline
386 голосов
/ 26 декабря 2015

У меня есть 3 псевдонима (и 4 псевдонима для быстрого использования) , которые я обычно добавляю в мой файл ~/.gitconfig:

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

220 голосов
/ 22 сентября 2011

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

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

67 голосов
/ 17 августа 2013

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

enter image description here

Побудите меня написать GitVersionTree .

enter image description here

47 голосов
/ 21 июля 2012

"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 увидит всю историю ветки.
42 голосов
/ 03 декабря 2009

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

40 голосов
/ 05 мая 2016

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

Topology

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

33 голосов
/ 05 января 2011

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

23 голосов
/ 04 ноября 2013

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...