web-dev-qa-db-fra.com

Visualisation de la topologie de branche dans git

Je joue avec git de manière isolée sur ma propre machine et il m'est difficile de conserver un modèle mental de toutes mes branches et commits. Je sais que je peux faire un git log pour voir l'historique des commissions d'où je suis, mais existe-t-il un moyen de voir la topographie complète 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
     \   /   /   /   /
      `-------------'

C'est comme si quelqu'un venant et essayant 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 stream de AccuRev ...

751
Benjol

git log --graph ou gitk. (Les deux acceptent également --all qui affichera toutes les branches au lieu de l’actuelle.)

Edit: Pour les noms de branche et une vue compacte, essayez: git log --graph --decorate --oneline

924
jrockway

J'utilise habituellement

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

Avec des couleurs (si votre shell 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) Mannual 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 succesfully
| *   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 va lier les messages de commit aux nombres, ce qui est moins joli à mon humble avis).

Pour créer un raccourci pour cette commande, vous pouvez modifier votre fichier ~/.gitconfig:

[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 the Vociferous notes dans les commentaires, une telle commande de formatage longue est difficile à mémoriser. Généralement, ce n'est pas un problème car vous pouvez le placer dans le fichier ~/.gitconfig. Cependant, si vous devez parfois vous connecter à une machine distante sur laquelle vous ne pouvez pas modifier le fichier de configuration, vous pouvez utiliser une version plus simple mais plus rapide:

git log --graph --oneline
447
P Shved

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

[alias]
    lg = !"git lg1"
    lg1 = !"git lg1-specific --all"
    lg2 = !"git lg2-specific --all"
    lg3 = !"git 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 lggit lg1 ressemble à ceci:

git lg1

git lg2 ressemble à ceci:

git lg2

et git lg3 ressemble à ceci:

git lg3

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

367
Slipp D. Thompson

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

J'ai ressenti le besoin de poster ceci parce que cela ne semble pas être aussi connu qu'il devrait l'être. Cela n'apparaît pas dans la plupart des questions de Stack Overflow sur la visualisation de l'histoire, et il m'a fallu un peu de recherche 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 .

211
Andrew

Gitk parfois difficile à lire.

enter image description here

Motivez-moi pour écrire GitVersionTree .

enter image description here

62
checksum

"99,999% de mon temps recherche l'historique par git lg et le 0,001% est par git log"

Je veux juste partager 2 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 verra l'historique actuel de la branche.
  • git hist verra l'historique complet de la branche.
45
Yeo

J'aime, avec git log , faire:

 git log --graph --oneline --branches

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

Fonctionne avec les versions récentes de Git: introduit depuis le 1.6.3 ( jeu., 7 mai 2009 )

  • L'option "--pretty=<style>" de la famille de commandes du journal peut désormais être orthographiée en "--format=<style>".
    De plus, --format=%formatstring est un raccourci pour --pretty=tformat:%formatstring.

  • "--oneline" est un 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 l'étendue 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

(afficher uniquement les 5 derniers commits)


Ce que je n’aime pas dans la solution actuelle est:

 git log --graph

Il affiche beaucoup trop d’informations (quand je ne veux regarder qu’un bref résumé):

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

gitk c'est bien, mais m'oblige à quitter la session Shell pour une autre fenêtre, alors que l'affichage des n derniers commits rapidement suffit souvent.

40
VonC

Jetez un coup d'œil à Gitkraken -, une interface graphique multi-plateforme qui montre la topologie de manière claire.

 Topology

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

39
pylang

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 l’arborescence de votre référentiel (identique à gitx).

30
Jack Senechal

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

Il crée de jolis graphes 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 montre les points de branche et les fusions, mais omet tout ce qui se trouve entre les deux. 

22
Frank Osterfeld

Un bon outil web est ungit . Il fonctionne sur toutes les plateformes prises en charge par node.js & git. Il y a une vidéo comment ça marche pour ceux qui trouvent ce genre de choses plus facile que de lire ...

enter image description here

22
Sardathrion

Regardez BranchMaster .

Je l'ai écrit pour visualiser la structure complexe des branches, en réduisant toutes les commits entre elles en une seule ligne. Les chiffres indiquent le nombre de commits.

enter image description here

17
stroyer

Giggle dessine de beaux graphiques

12
Renat

Tortoise Git a un outil appelé "Graphique de révision". Si vous utilisez Windows, il vous suffit de cliquer avec le bouton droit de la souris sur votre référentiel -> Tortoise Git -> Graphique de révision.

11
Christian Adam

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

C'est rapide, fonctionne dans le terminal.

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

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

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

The revision graph

(ps. c’est le terminal à l’arrière-plan de cette capture d’écran, cela semble mieux de nos jours, mais mon ordinateur refuse de prendre 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)

10
wires

J'utilise les alias suivants. 

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

Il y a plus d'informations dans le jeu de couleurs que les alias que j'ai vus ci-dessus. Cela semble aussi être assez courant, de sorte que vous pourriez avoir une chance de le voir exister dans l'environnement d'un autre ou de pouvoir le mentionner dans une conversation sans devoir l'expliquer.

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

10
Lokist

J'ai cet alias git log dans ~/.gitconfig pour 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 l affichera quelque chose comme ceci:

 enter image description here

Dans Git 2.12 +, vous pouvez même personnaliser les couleurs de la ligne du graphique à l’aide de l’option log.graphColors configuration. 

En ce qui concerne le format des journaux, il ressemble à --oneline , avec l’ajout du nom de l’auteur (en respectant .mailmap) et de la date de l’auteur relative. Notez que la syntaxe %C(auto), 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 .

8
Eugene Yarmash

Pour les utilisateurs de Mac, accédez à l'outil gratuit et gratuit 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

 GitUp screenshot

7
Edward T

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 habituellement un alias pour la commande ci-dessus:

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

et simple, utilisez simplement gg.

6
Sadegh

Pour ceux qui utilisent l'éditeur de texte VSCode , considérons l'extension Git History de D. Jayamanne:

enter image description here

6
pylang

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
xero

Gitx est également un outil de visualisation fantastique si vous utilisez OS X.

5
kEND

Ancien post, mais consultez SmartGit . Cela rappelle beaucoup la visualisation de la branche Tortoise HG et est gratuit pour une utilisation non commerciale.

Une autre commande de journal git. Celui-ci avec colonnes de largeur fixe :

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

Sous Windows, il existe un outil très utile que vous pouvez utiliser: les extensions git. C'est un outil graphique qui rend les opérations git très faciles.

En outre, il est open source. 

http://gitextensions.github.io

2
loneshark99

pouvons-nous rendre les choses plus compliquées?

Que diriez-vous de simple Git log --all --decorate --oneline --graph (rappelez-vous A Dog = --All --Decorate --Oneline --Graph

1
pixel

J'ai essayé --simplify-by-decoration mais toutes mes fusions ne sont pas affichées. Donc, au lieu de cela, je taille simplement les lignes sans les symboles "\" et "/" dans les en-têtes, tout en conservant les lignes avec "(" indiquant les branches juste après). Je les supprime aussi et je me retrouve avec l'alias 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/).*/)/'
}
1
Isaac To

Le site officiel de Git a fait appel à des outils d’interface graphique spécifiques à la plateforme. Cliquez ici Outils d'interface graphique git pour plate-forme Linux

J'ai utilisé gitg et GitKraken pour la plate-forme Linux. Bon à comprendre l’arbre de commit

0
rookie4evr