Wyjście gałęzi git w stylu drzewa


160

W tej chwili, gdy wpisuję „git branch”

wymienia moje oddziały w dowolnej kolejności.

Wolałbym, żeby "git branch" umieścił moje wyjście w drzewie, takim jak fasion, na przykład:

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

Gdzie tutaj, foo i bar zostały rozgałęzione od master; foo1 i foo2 zostały rozgałęzione z foo; bar4 został rozgałęziony z bar.

Czy jest to łatwe do osiągnięcia?

[Tylko narzędzia wiersza poleceń. To musi pasować do mojego przepływu pracy zsh / vim.]


Żadna z odpowiedzi tutaj (w tym moja własna) nie wydaje się być odpowiednim rozwiązaniem dla tego, czego myślę, że naprawdę chcesz, i tego, czego chcę. Napiszę nowe narzędzie, które rozwiąże ten problem, kiedy będę miał okazję. Pewnie to nazwie git_tree. Wyświetli coś takiego jak arc flowtutaj: stackoverflow.com/questions/54227968/… . Być może kiedyś uda mi się nawet połączyć go z samym git.
— Gabriel Staples

Wydaje się, że ta osoba też chce tego samego: reddit.com/r/git/comments/282c1f/ ...
— Gabriel Staples

git log --graphmyślę, że wystarczy.
— DawnSong

Odpowiedzi:


203

Plik odpowiedź używagit log :

Wspomniałem o podobnym podejściu w 2009 r. Z „ Nie można pokazać drzewa Git w terminalu ”:

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

Ale pełna wersja, której używałem, to „ Jak wyświetlić nazwę tagu i nazwę gałęzi za pomocą 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

Oryginalna odpowiedź (2010)

git show-branch --list zbliża się do tego, czego szukasz (z kolejnością topo)

--topo-order

Domyślnie gałęzie i ich zatwierdzenia są wyświetlane w odwrotnej kolejności chronologicznej.
Ta opcja sprawia, że ​​pojawiają się one w porządku topologicznym (tzn. Zatwierdzenia potomne są wyświetlane przed ich rodzicami).

Ale narzędzie git wtf też może pomóc . Przykład:

$ 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 pokazuje ci:

  • Jak Twój oddział odnosi się do zdalnego repozytorium, jeśli jest to gałąź śledząca.
  • Jak twoja gałąź odnosi się do gałęzi niefunkcjonalnych ("wersja"), jeśli jest to gałąź funkcji.
  • Jak twoja gałąź odnosi się do gałęzi funkcji, jeśli jest to gałąź wersji

Używam odmiany Twojego ładnego formatu, który pokazuje również adres e-mail autora, używając% ae. Wolę również nazywać alias przez „sl”, aby przypominał smartlog hg.
— fiorix

Wielkie dzięki za link do git-wtfnarzędzia, jest niesamowicie przydatne. Wydaje się, że zasadniczo rozbija wnioski, które wyciągnąłbym z gapienia się na fantazyjne git logdrzewo, ale w ładnym podsumowaniu.
— Luke Davis

Miałem nadzieję znaleźć sposób, tak że oddział Zamówienie powinno pokazać z którego oddział został wyrejestrowany z
— Chang Zhao

@ChangZhao To jest podobne do „znajdowania gałęzi nadrzędnej” i nie jest łatwe: stackoverflow.com/a/3162929/6309 , stackoverflow.com/a/56452713/6309
— VonC

147

To nie jest do końca to, o co prosiłeś, ale

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

wykonuje całkiem niezłą robotę. Pokazuje również tagi i zdalne gałęzie. Może to nie być pożądane dla wszystkich, ale uważam to za przydatne. --simplifiy-by-decorationjest tutaj wielką sztuczką ograniczającą pokazane referencje.

Używam podobnego polecenia, aby wyświetlić mój dziennik. Udało mi się całkowicie zastąpić nim moje gitkużycie:

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

Używam go, dołączając te aliasy do mojego pliku ~ / .gitconfig:

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

Edycja: zaktualizowano sugerowane polecenia / aliasy dziennika, aby używać prostszych flag opcji.


1
IMO to najlepsza odpowiedź tutaj, ale myślę, że SourceTree lub gitk lub tym podobne są drogą do tego rodzaju rzeczy.
— JaKXz

Spowoduje to wyświetlenie gałęzi na początku. Czy jest jakiś sposób, aby wyświetlić to dla lokalnych oddziałów?
— Jeff,

@Jeff wymianie --allz --branches --tagsprawdopodobnie to zrobić.
— nocash

doskonała odpowiedź. To, czego szukałem, znalazłem tutaj. Wspaniały.
— AMIC MING

12

Poniższy przykład pokazuje również zaangażowanych rodziców:

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

Możesz użyć narzędzia o nazwie gitk.


Uwielbiam gitk, ale nie zorientowałem się gitkw Macu. Jeśli masz jakieś sugestie, daj mi znać. Zacząłem używać, Github Desktopale uwielbiam pracować w wierszu poleceń.
— AMIC MING

6

Testowane na Ubuntu:

sudo apt install git-extras
git-show-tree

Daje to efekt podobny do 2 odpowiedzi, na które najczęściej głosowano tutaj.

Źródło: http://manpages.ubuntu.com/manpages/bionic/man1/git-show-tree.1.html


Ponadto, jeśli masz zainstalowany arcanist (poprawka: widelec arcanista Ubera zainstalowany - instrukcje instalacji znajdziesz na dole tej odpowiedzi ), arc flowpokazuje piękne drzewo zależności nadrzędnych zależności (tj .: które zostały ustawione wcześniej przez arc flow new_branchlub ręcznie za pomocągit branch --set-upstream-to=upstream_branch ).

Dodatkowe sztuczki git:

Związane z:

  1. Jaka jest różnica między „arc graft” a „arc patch”?

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.