Historie mit gitk im Griff (GIT)

Aus Siduction Wiki DE
Wechseln zu: Navigation, Suche

GIT-Tutorial: Übersicht

Vorbemerkung

gitk ist ein TCL/TK-Programm, das erstaunlich viele Möglichkeiten zur Erkundung eines GIT-Repositories bietet.

Eine Spielwiese zum ausprobieren:

 cd /tmp
 git clone git://f-r-e-i.de/git-tut-example-01
 cd git-tut-example-01
 gitk --all &

Filter

Das effektive Arbeiten/Suchen wird vor allem durch Filtern erreicht, was in umfangreichen Repositories "lebensnotwendig" ist.

Reguläre Ausdrücke

In vielen Suchkriterien dürfen reguläre Ausdrücke verwendet werden. Das erweitert die Möglichkeiten gewaltig.

Syntax

Die Metasymbole werden mit dem Backslash gekennzeichnet:

  • \| ist die Oder-Verknüpfung
  • \( und \) gruppieren
  • \? Vorausgehendes Element kommt 0 oder einmal vor

Regeln für Regex-Unkundige

  • Verwende keinen Stern ('*'), sondern ersetze ihn durch '.'
  • Ersetze '\' durch "\\"

Beispiele für Regex-Anfänger

  • Der Punkt steht für irgendein Zeichen
  • Der Stern hat Sonderbedeutung: das vorausgehende Symbol kann beliebig oft (auch 0-) mal vorkommen.
  • Sucht man ein Wort oder ein zweites, stellt man "\|" dazwischen: Linux\|Unix findet Beiträge mit Linux und zusätzlich welche mit Unix


Globaler Filter (Ansichtdialog)

Die Grundmenge der zu betrachtenden Commits kann durch Aufrufparameter oder einen Einstellungsdialog (Menü "Ansicht - Ansicht bearbeiten") gesetzt werden.

Gitk-ansicht-bearbeiten.png

Lösungen durch den Ansicht-Dialog

Folgende Fragestellungen können durch Einstellungen des Ansicht-Dialogs gelöst werden.

Nur die Historie von Datei userpage.php anzeigen
  • Eintrag in die Textbox unten ("Folgende Dateien und Verzeichnisse anzeigen (eine pro Zeile):")
Welche Änderungen waren im August 2011
  • Eintrag in "Datum (2 weeks ago, ..."

In der Überschrift ist ja schon die Syntax beschrieben:

  • Relativangaben: 2 weeks ago
  • Datums-/Zeitangaben: jjjj-mm-tt HH:MM:SS

In unserem Fall:

  • von: 2011-08-01
  • bis: 2011-08-31 23:59:59
Nur den Branch dev anzeigen

Eintrag in der ersten Zeile:

  • Zweige/Markierungen: dev
Ich will nur meine Beiträge sehen

Eintrag unter "Autor" oder "Eintragender", die ja in dem meisten Fällen identisch sind:

  • Autor: hamatoma
Nur Dateien mit ein bestimmtem Inhalt

Dieser Filter beeinflusst nicht die Menge der angezeigten Commits, sondern färbt die nichtzutreffenden Commits weiß ein. Der Filter wird über einen String oder einen regulären Ausdruck definiert. Im Beispiel werden alle Dateien mit HTML-Quelltext gefiltert, die CSS nutzen:

  • Dateien: [X] Zeichenkette
  • Suchausdruck: class=
Suchstring im Commit-Text

Das geben wir als regulären Ausdruck an. Suchen wir mal "refaktoring" oder "review":

  • Versionsbeschreibung: [Rr]efactoring\|[Rr]eview

Gleichwertig, aber kürzer:

  • Versionsbeschreibung: [Rr]\(efactoring\|eview\)

Hinweis: das \| ist die Oder-Bedingung, \( und \) gruppieren einen Ausdruck

Ansicht von gitk

Gitk-main1.png

Der Graph

Der obere Bereich des Fensters wird mit dem Graphen, den Commit-Text-Überschriften, Autor und Commit-Zeitpunkt gefüllt:

  • Der Graph ist manchmal etwas undurchsichtig: Anklicken der Punkte (gelb oder blau) markiert den zugehörigen Text (grau hinterlegt).
  • Neben dem Graphen werden Tags in gelben Pfeilen, Branches in grünen Rechtecken angegeben. Der restliche Text sind jeweils die ersten Zeilen des zugehörigen Commit-Textes.
  • In der mittleren Spalte oben wird der Autor des Commits angegeben, in der linken der Zeitpunkt des Commits.
  • Unter dem Graph wird die ID, also der SHA1-Hash angezeigt, rechts daneben die Position im Graphen (Zeilennummer) und die Gesamtzahl der Zeilen (Commits).

Kontextmenü

Die Commit-Texte haben ein Kontextmenü:

    • Vergleich: diese -> gewählte: Unter "gewählte" ist der Commit gemeint, der mit dem Lesezeichen vorher markiert wurde.
    • Vergleich: gewählte -> diese. Wie oben, nur dass der Vergleich "anderstherum" (links-rechts vertauscht) stattfindet
    • Markierung erstellen: Damit können Tags erstellt werden (git tag ...)
    • Version in Datei schreiben: Damit wird genau das, was in dem unteren Bereich angezeigt wird, in eine Datei geschrieben, deren Name interaktiv abgefragt wird.
    • Neuen Zweig erstellen: Es wird ein Branch erstellt. Name wird interaktiv abgefragt.
    • Diese Version pflücken. Es wird git cherry-pick aufgerufen
    • Zweig "xxx" hierher zurücksetzen: "git reset ..." wird aufgerufen. Vorsicht!
    • Lesezeichen setzen: Der Dateivergleich oben bezieht sich auf einen solchermaßen markierten Commit.
    • Zum Lesezeichen: Sinnvoll bei großen Repositories

Suche im Graphen

Es folgt eine Zeile, die eine Suche im obigen Graphen erlaubt:

  • Zwei Buttons ("nächste" und "vorige") positionieren jeweils eine Zeile nach unten/oben.
  • Es folgt der Bereich (in einer Combobox), auf den sich die folgende Suche bezieht:
    • Beschreibung: Bezug ist der Commit-Text
    • Datei: Bezug ist der Name der Datei, der beim Commit betroffen ist
    • Änderungen: Bezug sind die geänderten Zeilen des Commits.
  • Es folgt das Eingabefeld für den Suchstring
  • Eine Combobox bietet die Optionen der Suche an:
    • Exakt: der Suchstring muss exakt (bezüglich Groß-Kleinschreibung) vorhanden sein.
    • Kein Groß/Klein: Groß-/Kleinschreibung wird ignoriert
    • Regexp: Die Eingabe ist ein regulärer Ausdruck
    • Alle Commits, auf die die Suche zutrifft, werden mit fettem Committext angezeigt.
    • Die letzte Combobox wirkt sich nur beim vorigen Combobox-Wert "Beschreibung" aus: Dann kann man den Suchbereich festlegen:
      • Alle Felder
      • Überschrift. Gemeint ist die 1. Zeile des Committextes
      • Beschreibung. Das ist der Committext
      • Autor
      • Eintragender

Die Dateianzeige

Suche im Dateibereich

Es folgt ein zweites Suchfeld, das sich auf den darunterliegenden Bereich bezieht.

  • Der Suchstring wird im unteren Bereich durch gelbes Hinterlegen markiert.
  • Mit dem Button "Suchen" wird der Focus auf die nächste Fundstelle gesetzt.

Dateiinhalt

Es wird mittels Radio-Buttons festgelegt, was als Dateiinhalt angezeigt wird:

  • "Vergleich": Es wird die Diff-Darstellung der Unterschiede angezeigt.
  • "Alte Version": Die Vorgängerversion der Datei(en), die zum jeweiligen Commit gehören, werden angezeigt.
  • "Neue Version": Die Datei wird so angezeigt, wie sie zum Commit-Zeitpunkt aussah
  • Wenn "Vergleich" aktiviert ist, so ist die Einstellung "Kontextzeilen" relevant: Das ist die Anzahl der Zeilen, die vor und nach den unterschiedlichen Zeilen auch noch angezeigt wird, zum besseren Orientieren.

Der Bereich unten links zeigt den Dateiinhalt, wie mit den obigen Radio-Buttons eingestellt

Dateinamen

Der Bereich unten rechts zeigt die Dateinamen an:

  • Ist der Radio-Button "Patch" gewählt, werden nur die Namen der am Commit beteiligten Dateien angezeigt. Klickt man eine davon an, wird im linken Bereich diese Datei angezeigt.
  • Ist Baum gewählt, so werden alle Dateien des Projekts angezeigt, die Verzeichnisse sind durch Pfeile und nachfolgendem Slash '/' markiert.
    • Werden die Pfeile angeklickt, klappen die Dateien des Verzeichnisses auf
Kontextmenü

Es gibt ein Kontextmenü (Klick mit rechter Maustaste) in der Listbox mit den Dateinamen:

  • "Diesen auch hervorheben": Es werden alle Commits markiert, die diese Datei enthalten. Vorher gewählte bleiben erhalten.
  • "Nur diesen hervorheben": Es werden alle Commits markiert, die diese Datei enthalten. Vorher gewählte sind nicht mehr markiert.
  • "Externes Diff-Programm: Nur aktiviert, wenn "Patch" (und nicht "Baum") aktiviert ist. Es wird der Vergleich mit der Vorgängerversion mittels des graphischen Diff-Tools angezeigt, das mit "git config diff.tool konfiguriert wurde
  • Annotieren der Elternversion: Es wird der Dateiinhalt dieser Datei als Annotation angezeigt: Jede Zeile wird mit dem Commit der letzten Änderung gekennzeichnet. Damit kann man z.B. herausbekommen, wer die jeweiligen Zeilen commited hat

Typische Fragestellungen

Wenn branch-spezifisch, dann beziehen sich die Fragen auf den aktuellen Branch dev.

Was waren die letzten Änderungen in der Datei inosid.css

  • Modus von Patch auf "Baum" umschalten (Mitte rechts)
  • inosid.css rechts anklicken: "Nur diesen hervorheben"
  • den obersten fetten Commit ("Starts installation script...") anklicken
  • Modus auf "Patch" umschalten
  • Maus Rechtsklick auf inosid.css: "externes Diff-Programm"

Welche Dateien haben sich am 17.10.2011 nach 22 Uhr geändert

  • F4 (Ansichtdialog): [x] Streng nach Datum sortieren, [OK]
  • Datum in Liste rechts oben suchen: es gibt genau einen: translation error
  • anklicken
  • Modus auf "Patch", dann stehen da die geänderten Dateien: inosid.conf

Ab welcher Version gab es den Demo-Modus

Hinweis: die Version ist in den Tags (Markierungen) festgehalten.

  • In dem oberen Suchfeld
    • Modus: Beschreibung
    • Suchstring: [Dd]emo
    • Modus: Regexp
  • Die letzte fette Zeile anwählen: "V0.11: partition info..."
  • Die erste Markierung darüber suchen: v0.11

Was ist der Unterschied von v0.7 und v0.11 in der Datei page.php

1.te Methode:

  • Modus "Baum" einstellen
  • page.php Rechtsklick: Nur diesen hervorheben
  • Die erste fette Zeile unterhalb v0.11 suchen: "v0.11:partition info ..."
  • Rechtsklick: "Lesezeichen setzen"
  • Die erste fette Zeile unterhalb v0.7 suchen: "Summary: I18n: texts in..."
  • Rechtsklick: "mit Lesezeichen vergleichen"
  • Im unteren Suchfeld: page.php. Button "Suchen"
  • Es wird dann auf den Dateivergleich positioniert.


2.te Methode: graphischer Diff

  • Tag v0.7 suchen. SH1-Id merken: c3c083 (es reichen meistens die ersten 5-6 Zeichen)
  • Tag v0.11 suchen: SH1-Id merken: 53f23
  • in Kommandozeile: git difftool c3c083 53f23 page.php