Uscita del ramo git in albero come la moda


161

In questo momento, quando scrivo "git branch"

elenca i miei rami in un ordine arbitrario.

Quello che preferirei sarebbe se "git branch" elencasse la mia produzione in un albero come fasion, qualcosa del genere:

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

Dove qui, foo & bar erano ramificati dal maestro; foo1 e foo2 erano ramificati da foo; bar4 è stato ramificato da bar.

È facile da realizzare?

[Solo utilità da riga di comando. Questo deve adattarsi al mio flusso di lavoro zsh / vim.]


Nessuna delle risposte qui (inclusa la mia) sembra fornire una soluzione adeguata per ciò che penso tu voglia davvero, e per quello che so di volere. Scriverò una nuova utility per risolverlo quando ne avrò la possibilità. Probabilmente lo chiamerà git_tree. Produrrà qualcosa come arc flowqui: stackoverflow.com/questions/54227968/… . Forse un giorno potrò persino farlo confluire in git stesso.
Gabriel Staples,

Anche questa persona sembra voler la stessa cosa: reddit.com/r/git/comments/282c1f/…
Gabriel Staples

git log --graphè abbastanza, penso.
DawnSong

Risposte:


204

La risposta seguente utilizza git log:

Ho parlato di un approccio simile nel 2009 con " Impossibile visualizzare un albero Git nel terminale ":

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

Ma quello completo che ho usato è in " Come visualizzare il nome del tag e il nome del ramo usando 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

Risposta originale (2010)

git show-branch --list si avvicina a ciò che stai cercando (con l'ordine topografico)

--topo-order

Per impostazione predefinita, i rami e i loro commit sono mostrati in ordine cronologico inverso.
Questa opzione li fa apparire in ordine topologico (cioè, i commit dei discendenti sono mostrati davanti ai loro genitori).

Ma lo strumento git wtf può aiutare anche . Esempio:

$ 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 ti mostra:

  • In che modo la tua filiale si collega al repository remoto, se si tratta di una diramazione di tracciamento.
  • In che modo il tuo ramo si collega ai rami non di funzionalità ("versione"), se si tratta di un ramo di funzionalità.
  • In che modo il tuo ramo si collega ai rami delle caratteristiche, se si tratta di un ramo di versione

Ho usato una variante del tuo bel formato che mostra anche l'email dell'autore, usando% ae. Inoltre preferisco chiamare l'alias con "sl" per assomigliare allo smartlog di hg.
fiorix,

Grazie mille per il link allo git-wtfstrumento, è follemente utile. Sembra essenzialmente abbattere le conclusioni che trarrei dal fissare un git logalbero di fantasia , ma in una bella sintesi.
Luke Davis,

Speravo di trovare un modo in modo che il ramo di checkout potesse mostrare da quale ramo è stato estratto
Chang Zhao,

@ChangZhao che è simile a "trovare il ramo padre", e che non è facile da fare: stackoverflow.com/a/3162929/6309 , stackoverflow.com/a/56452713/6309
VonC

147

Non è proprio quello che hai chiesto, ma

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

fa un ottimo lavoro. Mostra anche tag e rami remoti. Questo potrebbe non essere desiderabile per tutti, ma lo trovo utile. --simplifiy-by-decorationè il grande trucco qui per limitare i riferimenti mostrati.

Uso un comando simile per visualizzare il mio registro. Sono stato in grado di sostituire completamente il mio gitkutilizzo con esso:

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

Lo uso includendo questi alias nel mio file ~ / .gitconfig:

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

Modifica: comando / alias di registro suggerito aggiornato per utilizzare flag di opzioni più semplici.


1
IMO questa è la risposta migliore qui, ma penso che SourceTree o gitk o simili siano la strada da percorrere per questo tipo di cose.
JaKXz,

Questo mostra i rami all'origine. C'è un modo per farlo visualizzare per le filiali locali?
Jeff,

@Jeff sostituzione --allcon --branches --tagsprobabilmente farlo.
nocash,

risposta perfetta. Quello che stavo cercando, l'ho trovato qui. Grande.
AMIC MING,

12

L'esempio seguente mostra anche il commit dei genitori:

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

Puoi usare uno strumento chiamato gitk.


Adoro Gitk, ma non l'ho capito su gitkMac. Se hai qualche suggerimento, per favore fatemelo sapere. Ho iniziato a usare Github Desktopma amo lavorare sulla riga di comando.
AMIC MING,

6

Testato su Ubuntu:

sudo apt install git-extras
git-show-tree

Questo produce un effetto simile alle 2 risposte più votate qui.

Fonte: http://manpages.ubuntu.com/manpages/bionic/man1/git-show-tree.1.html


Inoltre, se hai installato arcanist (correzione: il fork di arcanist di Uber installato - vedi la parte inferiore di questa risposta qui per le istruzioni di installazione), arc flowmostra un bellissimo albero di dipendenze di dipendenze a monte (cioè: che erano state impostate in precedenza tramite arc flow new_brancho manualmente tramite git branch --set-upstream-to=upstream_branch).

Trucchi bonus git:

Relazionato:

  1. Qual è la differenza tra `arc graft` e` arc patch`?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.