Вывод ветки git в виде дерева

Прямо сейчас, когда я набираю "git branch"

он перечисляет мои ветки в произвольном порядке.

Я бы предпочел бы, если бы "git branch" отобразило мой вывод в дереве, как fasion, somethign like:

master
|-- foo
  |-- foo1
  |-- foo2
|-- bar
  |-- bar4

Здесь, где foo и bar были разветвлены от мастера; foo1 и foo2 были разветвлены от foo; bar4 был разветвлен от бара.

Легко ли это сделать?

[Утилиты командной строки. Это должно соответствовать моему рабочему процессу zsh/vim.]

Ответ 1

В ответе ниже используется git log:

Я упомянул аналогичный подход в 2009 году: Не удалось показать дерево Git в терминале:

git log --graph --pretty=oneline --abbrev-commit

Но полный, который я использовал, находится в "Как отобразить имя тега и имя ветки с помощью Git log -graph" (2011):

git config --global alias.lgb "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --abbrev-commit --date=relative --branches"

git lgb

Оригинальный ответ (2010)

git show-branch --list близок к тому, что вы ищете (с порядком topo)

--topo-order

По умолчанию ветки и их фиксации отображаются в обратном хронологическом порядке. Этот параметр заставляет их отображаться в топологическом порядке (т.е. Фиксации потомков отображаются перед родителями).

Но инструмент git wtf может help too. Пример:

$ git wtf
Local branch: master
[ ] NOT in sync with remote (needs push)
    - Add before-search hook, for shortcuts for custom search queries. [4430d1b] ([email protected]; 7 days ago)
Remote branch: origin/master ([email protected]:sup/mainline.git)
[x] in sync with local

Feature branches:
{ } origin/release-0.8.1 is NOT merged in (1 commit ahead)
    - bump to 0.8.1 [dab43fb] ([email protected]; 2 days ago)
[ ] labels-before-subj is NOT merged in (1 commit ahead)
    - put labels before subject in thread index view [790b64d] ([email protected]; 4 weeks ago)
{x} origin/enclosed-message-display-tweaks merged in
(x) experiment merged in (only locally)

NOTE: working directory contains modified files

git-wtf показывает вам:

  • Как ваша ветка относится к удаленному репо, если это ветка отслеживания.
  • Как ваша ветка относится к ветвям, не относящимся к функции ( "версия" ), если это ветвь функции.
  • Как ваша ветка относится к ветвям функций, если это ветка версии

Ответ 2

Это не совсем то, что вы просили, но

git log --graph --simplify-by-decoration --pretty=format:'%d' --all

выполняет довольно хорошую работу. Он также показывает теги и удаленные ветки. Это может быть нежелательно для всех, но я считаю это полезным. --simplifiy-by-decoration - большой трюк здесь для ограничения приведенных ссылок.

Я использую аналогичную команду для просмотра моего журнала. Мне удалось полностью заменить его использование gitk:

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

Я использую его, включив эти псевдонимы в файл ~/.gitconfig:

[alias]
    l = log --graph --oneline --decorate
    ll = log --graph --oneline --decorate --branches --tags
    lll = log --graph --oneline --decorate --all

Изменить: Обновленная предлагаемая команда/псевдонимы для использования более простых флажков параметров.

Ответ 3

В следующем примере показаны родители-фиксаторы:

git log --graph --all \
--format='%C(cyan dim) %p %Cred %h %C(white dim) %s %Cgreen(%cr)%C(cyan dim) <%an>%C(bold yellow)%d%Creset'

Ответ 4

Вы можете использовать инструмент под названием gitk.

Ответ 5

Проверено на Ubuntu:

sudo apt install git-extras
git-show-tree

Это дает эффект, похожий на два самых популярных ответа здесь.

Источник: http://manpages.ubuntu.com/manpages/bionic/man1/git-show-tree.1.html


Также, если у вас установлен arcanist, arc flow показывает красивое дерево зависимостей вышестоящих зависимостей (то есть: которые были установлены ранее через arc flow new_branch или вручную через git branch --set-upstream-to=upstream_branch).

Бонусные хитрости:

Ответ 6

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