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

161

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

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

То, что я предпочел бы, было бы, если бы "git branch" перечислил мой вывод в дереве как fasion, что-то вроде:

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

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

Это легко сделать?

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

скоро
источник
Ни один из ответов здесь (включая мой собственный), кажется, не обеспечивает адекватного решения того, что, я думаю, вы действительно хотите, и того, что я знаю, я хочу. Я собираюсь написать новую утилиту, чтобы решить эту проблему, когда у меня будет такая возможность. Наверное, позвоню git_tree. Он выведет что-то вроде arc flowздесь: stackoverflow.com/questions/54227968/… . Возможно, когда-нибудь я смогу объединить его с самим git.
Габриэль Стейплс
Этот человек, похоже, тоже хочет того же: reddit.com/r/git/comments/282c1f/…
Габриэль Стейплс
git log --graphдостаточно, я думаю.
DawnSong

Ответы:

204

Ответ ниже использования 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-order

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

Но инструмент git wtf тоже может помочь . Пример:

$ git wtf
Local branch: master
[ ] NOT in sync with remote (needs push)
    - Add before-search hook, for shortcuts for custom search queries. [4430d1b] (edwardzyang@...; 7 days ago)
Remote branch: origin/master (git@gitorious.org: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] (wmorgan-sup@...; 2 days ago)
[ ] labels-before-subj is NOT merged in (1 commit ahead)
    - put labels before subject in thread index view [790b64d] (marka@...; 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 показывает вам:

  • Как ваша ветка связана с удаленным репо, если это ветка отслеживания.
  • Как ваша ветка относится к ветвям, не относящимся к функциям (версиям), если это ветвь функций.
  • Как ваша ветка связана с ветками функций, если это ветка версий
VonC
источник
Я использовал вариант вашего красивого формата, который также показывает электронную почту автора, используя% ae. Также я предпочитаю называть псевдоним "sl" для напоминания smartlog hg.
fiorix
Большое спасибо за ссылку на git-wtfинструмент, он безумно полезен. Похоже, что по существу, я сломал выводы, которые я сделал бы, глядя на причудливое git logдерево, но в хорошем резюме.
Люк Дэвис
Я надеялся найти способ, чтобы ветка оформления
Чан Чжао
@ChangZhao Это похоже на «поиск родительской ветви», и это нелегко сделать: stackoverflow.com/a/3162929/6309 , stackoverflow.com/a/56452713/6309
VonC
147

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

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

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

nocash
источник
1
IMO, это лучший ответ здесь, но я думаю, SourceTree или Gitk или тому подобное, это путь для такого рода вещей.
JaKXz
Это отображает ветви в начале координат. Есть ли способ заставить это отображаться для местных филиалов?
Джефф
@Jeff замена --allс --branches --tags, вероятно , сделать это.
Нокаш
идеальный ответ. То, что я искал, я нашел здесь. Отлично.
AMIC MING
12

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

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'
Бен
источник
10

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

Владимир Прудников
источник
Я люблю Gitk, но я не понял gitkв Mac. Если у вас есть предложения, пожалуйста, дайте мне знать. Я начал использовать, Github Desktopно люблю работать в командной строке.
AMIC MING
6

Протестировано на Ubuntu:

sudo apt install git-extras
git-show-tree

Это производит эффект, подобный 2 наиболее одобренным ответам здесь.

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


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

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

Связанный:

  1. В чем разница между `arc graft` и` arc patch`?
Габриэль Стейплс
источник
-1

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

kip2
источник