Visualisierung der Zweigtopologie in Git

Ich spiele mit Git isoliert auf meinem eigenen Rechner, und ich finde es schwierig, ein mentales Modell aller meiner Zweige und Übertragungen zu erhalten. Ich weiß, dass ich ein git log machen kann, um die Commit-Historie von dort aus zu sehen, wo ich mich befinde, aber gibt es eine Möglichkeit, die gesamte Branch-Topographie zu sehen, so etwas wie diese ascii-Maps, die überall zur Erklärung von Branches verwendet zu werden scheinen?

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

Es fühlt sich einfach so an, als ob jemand, der kommt und versucht, mein Repository zu übernehmen, Schwierigkeiten hätte, herauszufinden, was genau vor sich geht.

Ich schätze, ich bin beeinflusst von AccuRev's Stream-Browser...

Lösung

git log --graph oder gitk. (Beide akzeptieren auch --all, was alle Zweige anzeigt, anstatt nur den aktuellen.)

Bearbeiten: Für Zweignamen und eine kompakte Ansicht, versuchen Sie es: git log --graph --decorate --oneline

Kommentare (7)

Ich verwende normalerweise

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

Mit Farben (wenn Ihre Shell Bash ist):

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

Dies wird eine textbasierte Darstellung wie diese ausgeben:

* 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

(Sie könnten auch einfach git log --format=oneline verwenden, aber das würde die Commit-Meldungen mit Zahlen verbinden, was IMHO weniger schön aussieht).

Um eine Abkürzung für diesen Befehl zu erstellen, sollten Sie Ihre Datei ~/.gitconfig bearbeiten:

[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"

Wie Sodel the Vociferous jedoch in den Kommentaren anmerkt, ist ein solch langer Formatierungsbefehl schwer zu merken. Normalerweise ist es kein Problem, da man es in die Datei ~/.gitconfig einfügen kann. Wenn Sie sich jedoch manchmal an einem entfernten Rechner anmelden müssen, an dem Sie die Konfigurationsdatei nicht ändern können, können Sie eine einfachere, aber schneller zu tippende Version verwenden:

git log --graph --oneline
Kommentare (5)

Ich mag es, mit git log, zu tun:

 git log --graph --oneline --branches

(auch mit --all, um auch entfernte Zweige zu sehen)

Funktioniert mit aktuellen Git-Versionen: eingeführt seit 1.6.3 (Do, 7. Mai 2009)

  • "--pretty="-Option für die Log-Befehlsfamilie kann jetzt als "--format=" geschrieben werden.
    Darüber hinaus ist --format=%formatstring eine Kurzform für --pretty=tformat:%formatstring.
  • "--oneline" ist ein Synonym für "--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

Sie können auch den Zeitraum der Protokollanzeige begrenzen (Anzahl der Commits):

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

(zeigt nur die letzten 5 Commits an)


Was mir an der aktuell gewählten Lösung nicht gefällt, ist:

 git log --graph

Es werden viel zu viele Informationen angezeigt (wenn ich nur eine kurze Zusammenfassung sehen möchte):

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

gitk ist großartig, zwingt mich aber dazu, die Shell-Sitzung zu verlassen und in ein anderes Fenster zu wechseln, während die schnelle Anzeige der letzten n Commits oft ausreicht.

Kommentare (2)