Visualisation de la topologie de branche dans Git


884

Je joue avec Git de manière isolée sur ma propre machine, et j'ai du mal à maintenir un modèle mental de toutes mes branches et de mes commits. Je sais que je peux faire un git logpour voir l'historique des validations d'où je suis, mais existe-t-il un moyen de voir toute la topographie des branches, quelque chose comme ces cartes ASCII qui semblent être utilisées partout pour expliquer les branches?

      .-A---M---N---O---P
     /     /   /   /   /
    I     B   C   D   E
     \   /   /   /   /
      `-------------'

J'ai juste l'impression que quelqu'un qui vient et qui essaie de récupérer mon référentiel aurait du mal à comprendre exactement ce qui se passait.

Je suppose que je suis influencé par le navigateur de flux d'AccuRev ...



1
@ leif81, un demi-double, pour moi. @Masi a explicitement exclu gitk dans sa question.
Benjol

Réponses:


1083

Utilisez git log --graphou gitk. (Les deux acceptent également --all, qui afficheront toutes les branches au lieu de la seule actuelle.)

Pour les noms de branche et une vue compacte, essayez:

git log --graph --decorate --oneline

47
Cela ne marque même pas les commits avec les branches. Je n'appellerais pas cela une bonne visualisation telle quelle.
Roman Starkov

7
Merci! gitg a également l' --alloption et étiquette également les commits. Je n'ai jamais vu non plus dans la liste déroulante que vous pouvez sélectionner toutes les branches.
Thomas

210
Je recommande git log --graph --decorate --oneline- affiche un commit par ligne et décore avec des noms de branche.
sleske

8
tig (un client git ncurse) fournit également l' --alloption. Assez pratique!
Pierre-Adrien Buisson

5
Voir également la réponse d'Andrew concernant l' --simplify-by-decorationoption.
ruvim

483

J'utilise habituellement

git log --graph --full-history --all --pretty=format:"%h%x09%d%x20%s"

Avec des couleurs (si votre coque est Bash):

git log --graph --full-history --all --color \
        --pretty=format:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s"

Cela imprimera une représentation textuelle comme ceci:

* 040cc7c       (HEAD, master) Manual is NOT built by default
* a29ceb7       Removed offensive binary file that was compiled on my machine and was hence incompatible with other machines.
| * 901c7dd     (cvc3) cvc3 now configured before building
| * d9e8b5e     More sane Yices SMT solver caller
| | * 5b98a10   (nullvars) All uninitialized variables get zero inits
| |/
| * 1cad874     CFLAGS for cvc3 to work successfully
| *   1579581   Merge branch 'llvm-inv' into cvc3
| |\
| | * a9a246b   nostaticalias option
| | * 73b91cc   Comment about aliases.
| | * 001b20a   Prints number of iteration and node.
| |/
|/|
| * 39d2638     Included header files to cvc3 sources
| * 266023b     Added cvc3 to blast infrastructure.
| * ac9eb10     Initial sources of cvc3-1.5
|/
* d642f88       Option -aliasstat, by default stats are suppressed

(Vous pouvez simplement utiliser git log --format=oneline, mais il liera les messages de validation aux nombres, ce qui semble moins joli à mon humble avis).

Pour créer un raccourci pour cette commande, vous souhaiterez peut-être modifier votre ~/.gitconfigfichier:

[alias]
  gr = log --graph --full-history --all --color --pretty=tformat:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s%x20%x1b[33m(%an)%x1b[0m"

Cependant, comme Sodel les notes vocifères dans les commentaires, cette longue commande de formatage est difficile à mémoriser. Habituellement, ce n'est pas un problème car vous pouvez le mettre dans le ~/.gitconfigfichier. Cependant, si vous devez parfois vous connecter à une machine distante où vous ne pouvez pas modifier le fichier de configuration, vous pouvez utiliser une version plus simple mais plus rapide pour taper:

git log --graph --oneline

10
Si vous aimez les dates: git log --graph --full-history --all --color --date = short --pretty = format: "% x1b [31m% h% x09% x1b [32m% d% x1b [ 0m% x20% ad% s "
sehugg

7
--oneline est un substitut plus mémorable à tout ce joli formatage de magie profonde.
Daniel Ralston

1
@SodeltheVociferous, en effet, je n'ai pas abordé le problème du côté dont vous parlez; J'ai élargi ma réponse.
P Shved

2
Remarque: --full-historyn'est pertinent que lorsque vous utilisez --simplify-by-decorationou spécifiez un chemin de fichier.
Slipp D. Thompson

2
Puis-je demander d'où vous avez obtenu la chaîne de format? Ou comment diable avez-vous concocté cette chose?
elliotwesoff

444

J'ai 3 alias (et 4 alias-alias pour une utilisation rapide) que je jette normalement dans mon ~/.gitconfigfichier:

[alias]
    lg = lg1
    lg1 = lg1-specific --all
    lg2 = lg2-specific --all
    lg3 = lg3-specific --all

    lg1-specific = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(auto)%d%C(reset)'
    lg2-specific = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(auto)%d%C(reset)%n''          %C(white)%s%C(reset) %C(dim white)- %an%C(reset)'
    lg3-specific = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset) %C(bold cyan)(committed: %cD)%C(reset) %C(auto)%d%C(reset)%n''          %C(white)%s%C(reset)%n''          %C(dim white)- %an <%ae> %C(reset) %C(dim white)(committer: %cn <%ce>)%C(reset)'

git lg/ git lg1ressemble à ceci:

git lg1

git lg2 ressemble à ça:

git lg2

et git lg3ressemble à ceci:

git lg3

Il convient de noter que ce n'est pas une solution globale, c'est un modèle que vous pouvez modifier, ajouter et corriger à votre guise. Si vous souhaitez les utiliser, ma recommandation est de:

  1. Ajoutez-les à votre .gitconfig,
  2. Personnalisez à votre guise (choix de couleurs différentes, dispositions de lignes différentes pour les versions 2 et 3 lignes, etc.),
  3. Et puis enregistrez une copie dans un Gist ou un autre outil d'extrait de code afin que vous puissiez le copier et le coller dans .gitconfigs à l'avenir (ou bien contrôler la version de vos fichiers dot, bien sûr) .

Remarque: la réponse a été copiée et améliorée sur la réponse à stackoverflow.com/questions/1057564/pretty-git-branch-graphs car elle est beaucoup plus appropriée ici qu'elle ne l'était là. J'ai laissé la copie sur l'autre question pour des raisons historiques - elle est fermée maintenant, et la réponse est référencée par un tas d'autres réponses.


10
Suggestion: remplacer %C(bold yellow)avec %C(auto)pour avoir des couleurs différentes pour HEAD, locales et les branches éloignées ( ref ).
Atcold

2
Notez que vous pouvez éviter d'ajouter manuellement un retrait dans votre chaîne de format en utilisant %w(); De cette façon, vous pouvez également encapsuler correctement les messages de validation plus longs ou sur plusieurs lignes sans perturber le graphique.
charliegreen

1
@ mbadawi23 Ils sont redondants par souci de cohérence entre les plates-formes et les installations Git. --abbrev-commitest là parce que les 2e-3e lignes sont découpées à la main avec des espaces, et je voulais m'assurer absolument qu'il utiliserait le court SHA - donc mieux vaut prévenir que guérir. --decorateest également là parce que bien que les valeurs par défaut de Git fassent la même chose, cela pourrait être configuré différemment ou différent dans différentes versions de Git - pour celles-ci, je veux absolument la décoration. En fin de compte, les indicateurs supplémentaires / redondants ne sont pas mauvais ici - cela va dans un fichier; ce n'est pas quelque chose que vous tapez tout le temps.
Slipp D. Thompson, le

1
@TimothyPulliam À la fin de chaque ligne qui représente la pointe de chaque branche / balise, vous verrez les noms de branche / balise associés entre parenthèses - par exemple dans les captures d'écran lg1& lg2vous pouvez voir (origin/test_on_10.8)montrant la branche distante, et dans la lg2capture d'écran vous pouvez voir (HEAD -> master, origin/master, origin/HEAD)montrant les positions locales et éloignées de la mastersuccursale et HEAD. Cela correspond aux outils GUI de visualisation de branche populaires pour Git do (gitk, SourceTree, TortoiseGit, Tower, Fork, GitX), mais avec un peu plus de verbosité (certains outils GUI utilisent un code couleur) .
Slipp D. Thompson

2
@TimothyPulliam Pour comprendre ce que les commits font "partie de chaque branche", vous devez tracer visuellement la ligne colorée. Presque tous les outils ne vous aident pas beaucoup car Git commits n'appartient intrinsèquement à aucune branche - ils sont implicites (au moment de la visualisation du graphique) pour appartenir à n'importe quelle branche ou balise qui les a dans leur ascendance parentale . Si aucune branche / balise ne fait référence à une validation et qu'elle disparaît (mais n'est pas récupérée pendant environ 2 semaines); ajoutez une branche / balise référençant une validation non référencée et elle réapparaît. J'espère que tout cela a du sens.
Slipp D. Thompson

236

À l'une de ces recettes (basée sur git log ou gitk), vous pouvez ajouter --simplify-by-decorationpour réduire les parties linéaires sans intérêt de l'historique. Cela rend beaucoup plus visible la topologie à la fois. Je peux maintenant comprendre de grandes histoires qui seraient incompréhensibles sans cette option!

J'ai ressenti le besoin de publier ceci parce qu'il ne semble pas être aussi connu qu'il devrait l'être. Il n'apparaît pas dans la plupart des questions Stack Overflow sur la visualisation de l'histoire, et il m'a fallu pas mal de recherches pour trouver - même après avoir su que je le voulais! Je l'ai finalement trouvé dans ce rapport de bogue Debian . La première mention sur Stack Overflow semble être cette réponse d'Antoine Pelisse.


3
Parfait - exactement ce que je cherchais! Il devrait obtenir plus de votes positifs; presque tout le monde connaît déjà gitk / gitg / git log --graph, mais ceux-ci ne sont pas du tout très utiles si vous voulez visualiser la topologie de branche et ne vous souciez pas des commits simples.
imolit

4
C'est exactement ce dont j'avais besoin, fantastique. C'est la seule chose qui m'a aidé, parmi toutes les réponses. --simplify-by-decorationrend si clair ce qui se passe.
Ela782

9
Cela devrait vraiment être la réponse. git log --graph --all --simplify-by-decorationfonctionne aussi bien.
Irfy

Si seulement nous pouvions utiliser --simplify-by-decorationtout en ajoutant n commits avant / après chaque commit déocratisé (comme -Bet -Apour grep).
juin

J'utilise cette solution si souvent que je l'ai aliasée «arbre git».
user16973

76

Gitk parfois pénible à lire.

entrez la description de l'image ici

Me motiver à écrire GitVersionTree .

entrez la description de l'image ici


3
@exhuma J'ai un PR avec l'auteur pour supporter Mono (testé sur Ubuntu 13.10 contre Mono 2.10)
Max Ehrlich

1
J'ai trouvé que GitVersionTree garde les branches au même endroit avec le temps, ce qui permet de voir plus facilement comment les choses changent.
sfranky

48

99,999% de mon temps regarde l'histoire git lget les 0,001% sont passés git log.

Je veux juste partager deux alias de journal qui pourraient être utiles (configurer à partir de .gitconfig):

[Alias]
     lg = log --graph --pretty=format:'%Cred%h%Creset %ad %s %C(yellow)%d%Creset %C(bold blue)<%an>%Creset' --date=short
     hist = log --graph --full-history --all --pretty=format:'%Cred%h%Creset %ad %s %C(yellow)%d%Creset %C(bold blue)<%an>%Creset' --date=short
  • git lg affichera l'historique de la branche actuelle.
  • git hist verra tout l'historique de la branche.

44

Jetez un œil à Gitkraken - une interface graphique multiplateforme qui montre la topologie de manière lucide.

Topologie

Voici un rapide didacticiel vidéo sur certaines fonctionnalités avancées.


6
Comment ce fil a-t-il GitKraken, mais il n'a pas le SourceTree plus ancien et gratuit? (Je sais, je sais, Atlassian ne fait pas toujours tout correctement. Mais SourceTree est un très bon outil pour visualiser.)
XML

43

J'aime, avec git log, faire:

 git log --graph --oneline --branches

(également avec --all, pour afficher également les branches distantes)

Fonctionne avec les dernières versions de Git: introduites depuis 1.6.3 ( jeu, 7 mai 2009 )

  • L' --pretty=<style>option " " de la famille de commandes log peut désormais être orthographiée comme " --format=<style>".
    En outre, --format=%formatstringest un raccourci pour --pretty=tformat:%formatstring.

  • " --oneline" est synonyme de " --pretty=oneline --abbrev-commit".

PS D:\git\tests\finalRepo> git log --graph --oneline --branches --all
* 4919b68 a second bug10 fix
* 3469e13 a first bug10 fix
* dbcc7aa a first legacy evolution
| * 55aac85 another main evol
| | * 47e6ee1 a second bug10 fix
| | * 8183707 a first bug10 fix
| |/
| * e727105 a second evol for 2.0
| * 473d44e a main evol
|/
* b68c1f5 first evol, for making 1.0

Vous pouvez également limiter la durée de l'affichage du journal (nombre de validations):

PS D:\git\tests\finalRepo> git log --graph --oneline --branches --all -5
* 4919b68 a second bug10 fix
* 3469e13 a first bug10 fix
* dbcc7aa a first legacy evolution
| * 55aac85 another main evol
| | * 47e6ee1 a second bug10 fix

(n'afficher que les 5 derniers commits)


Ce que je n'aime pas dans la solution actuellement sélectionnée, c'est:

 git log --graph

Il a affiché beaucoup trop d'informations (quand je veux seulement regarder un bref résumé):

PS D:\git\tests\finalRepo> git log --graph
* commit 4919b681db93df82ead7ba6190eca6a49a9d82e7
| Author: VonC <vonc@laposte.net>
| Date:   Sat Nov 14 13:42:20 2009 +0100
|
|     a second bug10 fix
|
* commit 3469e13f8d0fadeac5fcb6f388aca69497fd08a9
| Author: VonC <vonc@laposte.net>
| Date:   Sat Nov 14 13:41:50 2009 +0100
|
|     a first bug10 fix
|

gitk est génial, mais me force à quitter la session shell pour une autre fenêtre, alors que l'affichage rapide des n derniers validations est souvent suffisant.


J'ai également choisi cette méthode, mais j'ai fait un alias pour que taper "git graph" soit la même chose que d'exécuter "git log --graph --decorate --oneline".
Will Pike

@ConnerPike bonne idée. J'ai moi-même l'alias 'lg': voir stackoverflow.com/a/3667139/6309
VonC

35

Gitg est un excellent outil pour Linux, similaire à Gitx pour OS X. Il suffit d'exécuter 'gitg' sur la ligne de commande quelque part dans la structure arborescente de votre référentiel (comme avec gitx).


3
En tant de mots: gitg a un menu déroulant où l'on peut choisir la branche à visualiser. Cette liste déroulante a également une option "Tous".
Phluks

1
Ou vous pouvez le démarrer avec gitg --all, si vous voulez éviter de déblayer dans le menu déroulant.
imolit

25

J'ai trouvé "git-big-picture" assez utile: https://github.com/esc/git-big-picture

Il crée de jolis graphiques 2D en utilisant dot / graphviz au lieu des vues plutôt linéaires et "unidimensionnelles" produites par Gitk et ses amis. Avec l'option -i, il affiche les points de branchement et les validations de fusion mais laisse de côté tout ce qui se trouve entre les deux.


assez simple à utiliser, si vous n'avez pas beaucoup de commits et que vous voulez une solution simple, vous pourriez peut-être essayer.
wiswit

Il devrait évoluer avec le nombre de validations très bien (si vous utilisez -i), il pourrait devenir illisible si vous avez des branches et des fusions complexes (mais alors, quel outil ne fonctionne pas)
Frank Osterfeld

1
Avec notre projet à échelle moyenne, cela génère une image énorme avec des tonnes de lignes. Puis-je limiter la profondeur à laquelle il va? C'est-à-dire que les N derniers jours se sont engagés.
Ondra Žižka

25

Un bel outil basé sur le Web n'est pas génial . Il s'exécute sur n'importe quelle plate-forme prise en charge par node.js & git. Il y a une vidéo sur la façon dont cela fonctionne pour ceux qui trouvent ce genre de choses plus facile que de lire ...

entrez la description de l'image ici


21

Jetez un œil à BranchMaster .

Je l'ai écrit pour visualiser la structure d'une branche complexe, en regroupant tous les commits entre eux sur une seule ligne. Les chiffres indiquent le nombre de validations.

entrez la description de l'image ici


1
C'est ce que je recherche. Existe-t-il des commandes / outils alternatifs pour ce faire?
Aalex Gabi

3
@AalexGabi Mettez cela dans votre gitconfig, c'est la même chose, mais en ligne de commande gbranch = log --graph --simplify-by-decoration --pretty = format: '% C (jaune)% h% C (blanc)% d% C (noir gras)% ar% C (réinitialisation)% n '--all
kracejic

Comment obtenez-vous les données pour visualiser les branches?
Snowfish

15

Personne n'a mentionné tig? Il ne plie pas les branches comme "BranchMaster", mais ...

Il est rapide, s'exécute dans le terminal.

Parce qu'il est si rapide (+ contrôle du clavier) que vous obtenez un excellent UX, c'est presque comme mon " ls" pour les répertoires contenant des dépôts git.

https://jonas.github.io/tig/

Il a les raccourcis habituels, /pour rechercher, etc.

Le graphique de révision

(ps. c'est le terminal en arrière plan de cette capture d'écran, ça a l'air mieux de nos jours, mais mon ordinateur refuse de faire une capture d'écran, désolé)

(pps. J'utilise aussi gitkraken et j'ai des visualisations très claires, mais c'est beaucoup plus lourd que tig)


Je suis un amoureux des terminaux et Tig (interface en mode texte pour Git) est un bon outil pour interagir avec les référentiels Git, il est très utile, y compris la vue graphique et l'historique Git. Je le recommande aux amoureux des terminaux comme un outil supplémentaire à la ligne de commande Git.
hermeslm

15

Tortoise Git a un outil appelé "Revision Graph". Si vous êtes sous Windows, c'est aussi simple que de cliquer avec le bouton droit sur votre dépôt -> Tortoise Git -> Graphique de révision.


1
quelle fonctionnalité fantastique, utilisant tortoise git depuis longtemps, mais je ne connais pas cette fonctionnalité.
kreamik

C'est beaucoup plus simple. Merci.
Anoop


12

J'utilise les alias suivants.

[alias]
    lol = log --graph --decorate --pretty=oneline --abbrev-commit
    lola = log --graph --decorate --pretty=oneline --abbrev-commit --all

Il contient plus d'informations dans le jeu de couleurs que les alias que j'ai vu ci-dessus. Cela semble également assez courant, vous pouvez donc avoir une chance qu'il existe dans l'environnement d'autrui ou qu'il soit possible de le mentionner dans une conversation sans avoir à l'expliquer.

Avec des captures d'écran et une description complète ici: http://blog.kfish.org/2010/04/git-lola.html


12

Pour les utilisateurs de Mac, consultez (sans jeu de mots) l'outil gratuit et open source GitUp: http://gitup.co/

J'aime la façon dont les graphiques sont affichés, c'est plus clair que certains des autres outils que j'ai vus.

Le projet est ici: https://github.com/git-up/GitUp

Capture d'écran de GitUp


C'est le seul graphique où vous voyez les branches sur l'axe x et le temps sur l'axe y. C'est très intuitif. GitUp est absolument génial! macOS ne l'est plus, donc je passe à Windows et Gitup me manquera beaucoup.
w00t

11

J'ai cet git logalias ~/.gitconfigpour afficher l'historique du graphique:

[alias]
l = log --all --graph --pretty=format:'%C(auto)%h%C(auto)%d %s %C(dim white)(%aN, %ar)'

Avec l'alias en place, git laffichera quelque chose comme ceci:

entrez la description de l'image ici

Dans Git 2.12 +, vous pouvez même personnaliser les couleurs de ligne du graphique en utilisant l' log.graphColorsoption de configuration.

Quant au format des logs, il est similaire à --oneline, avec l'ajout du nom de l' auteur (respectant .mailmap) et de la date relative de l'auteur . Notez que la %C(auto)syntaxe, qui indique à Git d'utiliser les couleurs par défaut pour le hachage de validation, etc. est prise en charge dans Git> = 1.8.3 .


1
C'est la toute première fois que je vois la date de l'auteur immobilier et c'est plutôt sympa! merci, je vais ajouter cela à mon gitconfig!
Simon C.

les utilisateurs de Windows doivent remplacer les guillemets simples par des guillemets doubles
PierDipi

11

J'ai trouvé cet article de blog qui montre de manière concise:

git log --oneline --abbrev-commit --all --graph --decorate --color

Je crée généralement un alias pour la commande ci-dessus:

alias gl='git log --oneline --abbrev-commit --all --graph --decorate --color'

et simple à utiliser gl.

Vous pouvez également ajouter l'alias à la configuration git. Ouvrez ~/.gitconfiget ajoutez la ligne suivante à [l'alias]

[alias]
        lg = log --oneline --abbrev-commit --all --graph --decorate --color

et utilisez-le comme ceci: git lg


8

Mon alias préféré personnel, via .gitconfig, est:

graph = log --graph --color --all --pretty=format:"%C(yellow)%H%C(green)%d%C(reset)%n%x20%cd%n%x20%cn%x20(%ce)%n%x20%s%n"

6
Une petite explication à quoi ressemblerait la commande aurait été formidable.
Max


7

Gitx est également un outil de visualisation fantastique si vous êtes sous OS X.


3
gitk (pour tout le monde) est très similaire. pas exactement la même chose, mais assez similaire.
xero

Il y a quelques fourches de Gitx - celle-ci (rowanj) semble être la meilleure en ce moment.
rjmunro

7

Une autre commande git log. Celui-ci avec des colonnes à largeur fixe :

git log --graph --pretty=format:"%x09%h | %<(10,trunc)%cd |%<(25,trunc)%d | %s" --date=short



2

J'ai essayé --simplify-by-decorationmais toutes mes fusions ne sont pas affichées. Donc, au lieu de cela, je taille juste les lignes sans symboles "\" et "/" dans les en-têtes, tout en gardant toujours les lignes avec "(" indiquant les branches immédiatement après cela. Lors de l'affichage de l'historique des branches, je ne suis généralement pas intéressé par les commentaires de validation, donc Je les supprime aussi et je me retrouve avec l'alias de shell suivant.

gbh () { 
    git log --graph --oneline --decorate "$@" | grep '^[^0-9a-f]*[\\/][^0-9a-f]*\( [0-9a-f]\|$\)\|^[^0-9a-f]*[0-9a-f]*\ (' | sed -e 's/).*/)/'
}

2

pouvons-nous le rendre plus compliqué?

Que diriez-vous d'un simple journal git --all --decorate --oneline --graph (rappelez-vous un chien = --Tous --Décorer --Oneline --Graph)


1
C'est la même chose que la réponse acceptée. Cependant les accessoires pour le mnémonique
aljgom

1

Le site officiel de Git a enrôlé des outils GUI spécifiques aux plateformes tierces. Cliquez ici git GUI Tools for Linux Platform

J'ai utilisé gitget GitKrakenpour la plate-forme Linux. Les deux sont bons pour comprendre l'arbre de validation

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.