Sortie de la branche git dans un arbre comme la mode

161

En ce moment, quand je tape "git branch"

il répertorie mes succursales dans un ordre arbitraire.

Ce que je préférerais, ce serait si "git branch" listait ma sortie dans un arbre comme fasion, quelque chose comme:

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

Où ici, foo & bar ont été ramifiés de master; foo1 & foo2 ont été branchés à partir de foo; bar4 était dérivé de bar.

Est-ce facile à réaliser?

[Utilitaires de ligne de commande uniquement. Cela doit s'adapter à mon flux de travail zsh / vim.]

anon
la source
Aucune des réponses ici (la mienne incluse) ne semble fournir une solution adéquate pour ce que je pense que vous voulez vraiment, et pour ce que je sais que je veux. Je vais écrire un nouvel utilitaire pour résoudre ce problème lorsque j'en aurai l'occasion. Je l'appellerai probablement git_tree. Il affichera quelque chose comme arc flowici: stackoverflow.com/questions/54227968/… . Peut-être qu'un jour je pourrai même le faire fusionner dans git lui-même.
Gabriel Staples
Cette personne semble vouloir la même chose aussi: reddit.com/r/git/comments/282c1f
Gabriel Staples
git log --graphest assez, je pense.
DawnSong

Réponses:

204

La réponse ci-dessous utilise git log:

J'ai mentionné une approche similaire en 2009 avec " Impossible d'afficher un arbre Git dans le terminal ":

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

Mais la version complète que j'ai utilisée se trouve dans " Comment afficher le nom de la balise et le nom de la branche en utilisant 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

Réponse originale (2010)

git show-branch --list se rapproche de ce que vous recherchez (avec la commande topo)

--topo-order

Par défaut, les branches et leurs validations sont affichées dans l'ordre chronologique inverse.
Cette option les fait apparaître dans l'ordre topologique (c'est-à-dire que les commits descendants sont affichés avant leurs parents).

Mais l'outil git wtf peut aussi aider . Exemple:

$ 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 ([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] (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 vous montre:

  • Le lien entre votre succursale et le repo distant, s'il s'agit d'une succursale de suivi.
  • Le lien entre votre branche et les branches non fonctionnelles ("version"), s'il s'agit d'une branche fonctionnelle.
  • Comment votre branche est liée aux branches de fonctionnalités, s'il s'agit d'une branche de version
VonC
la source
J'ai utilisé une variante de votre joli format qui affiche également l'e-mail de l'auteur, en utilisant% ae. Je préfère aussi appeler l'alias par "sl" pour ressembler au smartlog de hg.
fiorix
Merci beaucoup pour le lien vers l' git-wtfoutil, c'est incroyablement utile. Semble essentiellement briser les conclusions que je tirerais en regardant un git logarbre de fantaisie , mais dans un bon résumé.
Luke Davis
J'espérais trouver un moyen pour que la succursale de paiement indique de quelle succursale elle a été extraite
Chang Zhao
@ChangZhao C'est similaire à "trouver la branche parente", et ce n'est pas facile à faire: stackoverflow.com/a/3162929/6309 , stackoverflow.com/a/56452713/6309
VonC
147

Ce n'est pas tout à fait ce que tu as demandé, mais

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

fait un très bon travail. Il montre également les balises et les branches distantes. Cela n'est peut-être pas souhaitable pour tout le monde, mais je le trouve utile. --simplifiy-by-decorationest le gros truc ici pour limiter les refs affichés.

J'utilise une commande similaire pour afficher mon journal. J'ai pu remplacer complètement mon gitkutilisation par celui-ci:

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

Je l'utilise en incluant ces alias dans mon fichier ~ / .gitconfig:

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

Edit: Mise à jour de la commande / alias de journal suggérés pour utiliser des indicateurs d'options plus simples.

pas d'argent
la source
1
IMO, c'est la meilleure réponse ici, mais je pense que SourceTree ou gitk ou autre est la voie à suivre pour ce genre de chose.
JaKXz
Cela affiche les branches à l'origine. Existe-t-il un moyen d'afficher cela pour les succursales locales?
Jeff
@ Jeff remplaçant --allavec --branches --tagsprobablement le faire.
nocash
réponse parfaite. Ce que je cherchais, je l'ai trouvé ici. Génial.
AMIC MING
12

L'exemple suivant montre également les parents de validation:

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'
Ben
la source
10

Vous pouvez utiliser un outil appelé gitk.

Vladimir Prudnikov
la source
J'adore gitk, mais je n'ai pas compris gitksous Mac. Si vous avez des suggestions, faites-le moi savoir. J'ai commencé à utiliser Github Desktopmais j'adore travailler en ligne de commande.
AMIC MING
6

Testé sur Ubuntu:

sudo apt install git-extras
git-show-tree

Cela produit un effet similaire aux 2 réponses les plus votées ici.

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


De plus, si vous avez installé arcanist (correction: le fork d'Uber de l'arcaniste installé - voir le bas de cette réponse ici pour les instructions d'installation), arc flowmontre une belle arborescence de dépendances de dépendances en amont (c'est-à-dire: qui ont été définies précédemment via arc flow new_branchou manuellement via git branch --set-upstream-to=upstream_branch).

Astuces git bonus:

En relation:

  1. Quelle est la différence entre «arc graft» et «arc patch»?
Gabriel Staples
la source
-1

Pour ceux qui utilisent Github, ils ont une visionneuse de réseau de succursale qui semble plus facile à lire

kip2
la source