Das GitButler-CLI: Scott Chacon, GitButler

GGitButler
Computing/SoftwareSmall Business/StartupsInternet Technology

Transcript

00:00:00Willkommen! Ich mache eine kurze Demo, falls ihr Git Butler noch nicht kennt. Git Butler ist ein neues Tool zur Versionskontrolle,
00:00:07an dem wir seit ein paar Jahren arbeiten. Wir haben eine Menge Zeug von JJ geklaut.
00:00:10Wenn ihr also Jujutsu benutzt: Wir haben uns bei euch reichlich bedient.
00:00:16Wie auch immer, falls ihr Git Butler noch nicht genutzt habt: Es ist ein Tool zur Versionskontrolle.
00:00:19Es ist normalerweise eine GUI,
00:00:21aber wir arbeiten an einem CLI, und ich wollte einige der CLI-Funktionen zeigen, da ihr alle mit Git arbeitet und
00:00:26Git ein interessantes CLI hat.
00:00:29Wir haben auch einige Konzepte von Jujutsu übernommen.
00:00:33Aber es gibt auch ein paar neue Sachen, die ich ziemlich cool finde.
00:00:36Ich wollte es euch zeigen, um ein paar Ideen zu bekommen, was man noch Tolles machen könnte.
00:00:40Also ja, ich werde diese Dinge mal durchgehen.
00:00:43Also...
00:00:46Es gibt da ein paar Unterschiede. Das Befehlszeilen-Tool heißt "but".
00:00:49Da ich schon die ganze Zeit Flachwitze erzähle, passt das wohl ganz gut.
00:00:52Man kann "but status" ausführen. Das ist so etwas wie ein kurzes Log.
00:00:57Wenn ihr Sapling oder Jujutsu verwendet und das Log aufruft...
00:01:00Nun, wir zeigen die Dateien an, die auf der Festplatte geändert wurden,
00:01:05ausgehend von eurem Arbeitsverzeichnis im Vergleich zum Ziel-Branch.
00:01:08Wir zeigen aber auch die Commits an, die ihr habt, okay?
00:01:11Man kann auch "but status -F" sagen, dann werden die Dateien angezeigt, die in jedem Commit geändert wurden.
00:01:18Wenn ihr die Git Butler GUI nutzt, könnt ihr eure Lanes und so weiter sehen.
00:01:23Aber Git Butler kann viele coole Dinge, die Git nicht kann. Wir können zum Beispiel dieses schöne Kurz-Log machen,
00:01:29und...
00:01:30wisst ihr,
00:01:32wir können generell ein Log erstellen, das anzeigt, ob Commits lokal sind oder nicht. Das ist also ähnlich wie ein Shortlog
00:01:39in anderen Tools. Und wir können neue Branches erstellen.
00:01:40Wenn ich also den Status abfrage, sehe ich das... Ich arbeite hier an einem Twitter-Klon.
00:01:44Ich habe hier ein paar Branches, einer ist auf den anderen gestapelt.
00:01:50Das ist etwas, das Git auch kann, wenn man "update-ref" nutzt,
00:01:52um die Referenzen beim Rebasing oder ähnlichem neu zu schreiben.
00:01:56Aber wir machen das etwas natürlicher, okay?
00:02:00Wir aktualisieren eure Refs automatisch, und man kann Dinge ändern, und der Rebase wird das tracken.
00:02:03Aber wir können auch
00:02:09parallele Branches haben. Wir können also mehr als einen Branch gleichzeitig angewendet haben. Und was ich hier mache – oh,
00:02:11ist, einen neuen Branch zu erstellen,
00:02:23dann führe ich es erneut aus, und ich habe diesen neuen Branch, der parallel zu den anderen Branches läuft, an denen ich arbeite.
00:02:26Und ich kann in diesen Branch gehen und anfangen, Dinge zuzuweisen und zu committen.
00:02:33Das sehen wir als Nächstes.
00:02:39Die andere coole Sache ist, dass wir mehrere Staging-Areas haben.
00:02:41Jeder Stack, den ihr habt, hat seinen eigenen Staging-Bereich. Man kann also sagen:
00:02:45"rub" ist der Befehl. Man kann sagen: "rub KU" für diese Datei hier, und: "pack sie in ZA".
00:02:51Es weist sie dann diesem speziellen Staging-Bereich zu. Wenn ich hier etwas zuweisen wollte,
00:02:58gibt es einem diese Kurzcodes. Man kann also sagen: "Okay,
00:03:04das hier ist hier zugewiesen, und das dort drüben."
00:03:12Und wenn ich sie committe, kann ich sie in beide Branches gleichzeitig committen.
00:03:15Schauen wir uns das an. Wir sehen, das hier ist hier committet oder zugewiesen, also kann ich sagen:
00:03:21"but commit -o",
00:03:27und es committet es hier, okay?
00:03:30Jetzt ist diese Datei in diesem Commit. Das Schöne ist auch, dass das alles Git ist. Ich kann also auch
00:03:40sagen,
00:03:48dass es tatsächlich einen Git-Commit erstellt. Ich kann diesen Branch pushen und so weiter.
00:03:50Aber
00:03:57ja, ich kann zwei Branches zuweisen oder einfach "but commit" sagen, dann wird alles committet, was nicht zugewiesen ist, egal was das Ziel
00:03:59ist. Ich kann also festlegen, in welchem Branch ich neue Sachen committen möchte.
00:04:07Wir haben uns diesen Begriff "Rubbing" (Reiben) ausgedacht.
00:04:11Ich habe schon vielen von Caleb erzählt, der die ganze Nacht getrunken hat und jetzt nicht hier ist.
00:04:14Wenn er reinkommt, sollten wir alle aufstehen und ihm Applaus geben.
00:04:18Aber er kam auf den Begriff "Rubbing", was im Grunde bedeutet, zwei Dinge zu nehmen, sie zusammenzufügen und zu schauen, was daraus wird.
00:04:21Falls ihr Minecraft oder so gespielt habt und den Crafting-Tisch kennt,
00:04:28kennt ihr das Konzept,
00:04:32wo man dies und das nimmt, es zusammenfügt und etwas Neues und Interessanteres entsteht, oder?
00:04:34Und es gibt eine ganze Reihe von Dingen, die man mit dem "but"-CLI und "but rub" zusammenfügen kann.
00:04:38Ich zeige euch ein paar Beispiele. Man kann Dinge zuweisen, was ich schon gezeigt habe. Man kann eine nicht committete oder
00:04:45geänderte Datei einem Branch zuweisen, aber man kann die Zuweisung auch aufheben. Es gibt diesen speziellen Modus "00",
00:04:52bei dem ich sagen kann: "but rub"
00:05:01zum Beispiel diesen ganzen Commit
00:05:05auf "00" und...
00:05:07es nimmt den Commit zurück, ja? Es macht im Grunde einen "soft reset"
00:05:11von diesem Commit aus. Ich kann auch Dinge ändern ("amend"), also sagen: "rub le r"
00:05:17y...
00:05:24RV... Junge, ich brauche langsam meine Lesebrille. Ich bin auch schon ziemlich alt.
00:05:27SW... was unser – sorry, eigentlich zu
00:05:3211 W. Nehmen wir den.
00:05:35Ist das ein IW? Danke.
00:05:38Hoppla.
00:05:41Ist das ein I?
00:05:44Entschuldigung.
00:05:48Und...
00:06:02es committet es dort hinein. Ich kann
00:06:04mit "rub I"
00:06:10Commits rückgängig machen.
00:06:14Ich kann Sachen squashen. Wenn ich diesen und jenen Commit zusammenführen will, kann ich "but rub J e GE" machen,
00:06:16und es squasht diese Commits zusammen. Ich kann Commits auflösen, Dinge verschieben...
00:06:22Im Grunde alles, was man erwarten würde, wenn man zwei Dinge kombiniert, oder?
00:06:25Es wird genau das tun. Und wenn man etwas mit den nicht zugewiesenen Änderungen kombiniert, wird es im Grunde rückgängig gemacht.
00:06:32Ich weiß gar nicht mehr, ob das hier tatsächlich schon funktioniert...
00:06:37Man kann auch Dateien verschieben. Also:
00:06:42J 8 2...
00:06:48Und...
00:06:53es nimmt im Wesentlichen die Datei aus diesem Commit,
00:07:02macht sie in diesem Commit rückgängig und verschiebt sie in den Commit darunter, okay?
00:07:03Interessant daran ist nicht, dass das in Git unmöglich wäre, sondern dass es in Git relativ schwierig ist. Zum Beispiel
00:07:07einzelne Commits irgendwo rückgängig zu machen, Dateien zwischen Commits zu verschieben oder eine Datei in einen Commit drei Ebenen tiefer einzufügen.
00:07:11Man kann das in Git machen, zum Beispiel mit einem
00:07:19temporären Fixup-Commit und Auto-Squash oder so etwas.
00:07:27Aber es ist schon toll, wenn man die Sachen einfach so "herumschieben" kann, um den Inhalt dahin zu bringen, wo man ihn haben will,
00:07:31und gleichzeitig mehrere Branches zu haben.
00:07:34Was man damit auch machen kann, ist Commits relativ einfach aufzuteilen. Wir haben auch diesen "but new"-Befehl.
00:07:40Wenn ich also sagen will:
00:07:43"but new H e",
00:07:51dann wird es
00:07:54einen neuen, leeren Commit erstellen, der noch nichts enthält.
00:07:56Das ist wie im Jujutsu-Stil, wo man einen neuen Commit ohne Inhalt erstellen kann.
00:07:59Und dann kann ich Dateien hineinschieben, wenn ich möchte. Ich könnte sagen:
00:08:03"Nimm diese Datei,
00:08:080".
00:08:12Ich nehme...
00:08:15es verschiebt diese Datei in den neuen Commit, und dann kann ich "describe" sagen.
00:08:23Was war das? X, C...
00:08:29Wie konnte ich...
00:08:32"status -F", Status-Dateien. Es zeigt die Dateien in jedem Commit an, anstatt... also "but st".
00:08:45"but status" zeigt nur die Commits,
00:08:56und "but status -F" zeigt die Dateien darin, sodass man sie durch das "Rubbing" hin- und herschieben kann.
00:09:02Es gibt also "new" und "describe", und die letzte Sache ist "marking". Das ist ebenfalls sehr stark am JJ-Stil orientiert.
00:09:04Wer Jujutsu nutzt, weiß: Man kann einen Commit markieren, wodurch er zum Ziel wird.
00:09:11Alles, was das Tool dann sieht, wird es in diesen Commit packen. Man kann also markieren.
00:09:16Das ist eigentlich eine ziemlich interessante Sache. Ich kann sagen:
00:09:21"but new -M" oder ich kann manuell markieren mit "but mark ZA".
00:09:25Es markiert das hier, und man sieht, dass es die nicht committete Änderung bereits in diese Lane
00:09:29verschoben hat.
00:09:33Dann kann ich Dinge committen oder auch
00:09:35einen ganz spezifischen Commit markieren.
00:09:42Oh, das ist ein Branch, Entschuldigung.
00:09:44Es markiert also einen bestimmten Commit, und wenn ich dann zum Beispiel "echo new" mache,
00:09:47dann übernimmt es das und committet es automatisch in diesen Commit, okay?
00:09:56Das ist interessant, weil es ein Stacked Branch mit mehreren Commits ist. Alles, was ich jetzt tue,
00:09:58ändert automatisch einen Commit ab, der drei Commits weiter unten im Stack liegt.
00:10:07Das ist so ähnlich wie bei JJ, wenn man "jj new" macht und anfängt zu arbeiten.
00:10:15Dort wird einfach automatisch der letzte Commit geändert,
00:10:21nur dass man hier im Grunde jeden beliebigen Commit markieren kann.
00:10:26Man arbeitet einfach weiter, und es wird versucht, diesen Commit zu aktualisieren. Man kann die Markierung jederzeit wieder aufheben.
00:10:31Genau.
00:10:33Wie auch immer, das sind einige der spaßigen Dinge, an denen wir arbeiten.
00:10:36Ich finde es wirklich angenehm, so arbeiten zu können.
00:10:41Eine weitere Sache, die wir ebenfalls von JJ übernommen haben, ist ein Oplog (Operationen-Log).
00:10:44Das haben wir schon seit einer ganzen Weile.
00:10:48In Git Butler gibt es einen Tab, der alle ausgeführten Operationen auflistet.
00:10:52Jedes Mal, wenn ich etwas ausführe, wird eine Historie erstellt.
00:10:56Ich kann alles sehen, was Git Butler gemacht hat, und ich kann jeden dieser Zustände wiederherstellen oder einfach
00:10:59"undo" sagen.
00:11:03Hoppla, wenn ich es richtig schreibe... Ich sage "undo", und es macht die Operation rückgängig, stellt mein Arbeitsverzeichnis und meinen Status wieder so her,
00:11:06wie es vorher war. Oder ich kann sagen:
00:11:12"restore"
00:11:13zu einem dieser Shas.
00:11:14Hoppla.
00:11:20Und...
00:11:22es setzt mein Arbeitsverzeichnis, meine Branches und alles, was ich hatte, auf den vorherigen Stand zurück.
00:11:24Es ist eigentlich ganz interessant, eine Demo so zu machen, weil ich ein Szenario erstellen kann,
00:11:26von dem ich weiß, dass es funktioniert, und dann einfach zurückspringen und das Szenario von vorne beginnen kann.
00:11:29Aber natürlich ist es auch im Alltag super, wenn man merkt: "Eigentlich wollte ich das gar nicht" oder wenn man in einen
00:11:33Konflikt geraten ist. Man macht es einfach rückgängig und arbeitet weiter.
00:11:38So, das war's. Ach ja, eine Sache noch: Alle Befehle unterstützen JSON-Ausgabe. Man kann also "but -J"
00:11:44oder "--json" bei jedem Befehl nutzen, und man erhält dieselben Daten im JSON-Format.
00:11:50Wenn man etwas skripten möchte, ist das viel schöner als die Porcelain-Ausgabe von Git.
00:11:54Man kann das einfach einlesen oder durch "jq" jagen, um einen bestimmten Eintrag zu finden,
00:11:58und so das CLI viel eleganter skripten.
00:12:06Das war's. Vielen Dank!
00:12:11Wenn man also etwas skripten möchte, ist das viel schöner, als eine Porcelain-Ausgabe von Git oder ähnlichem zu haben,
00:12:15da man das einfach einlesen oder durch jq laufen lassen kann, um einen spezifischen Eintrag oder so etwas zu finden, und
00:12:21um das CLI so ein bisschen schöner skripten zu können.
00:12:24Das war's auch schon. Vielen Dank!

Key Takeaway

Das GitButler-CLI "but" modernisiert den Git-Workflow durch innovative Features wie parallele Branches, intuitives Commit-Management per "Rubbing" und ein robustes Operations-Log zur Fehlerkorrektur.

Highlights

Einführung des neuen CLI-Tools "but

Timeline

Einführung in GitButler und das CLI "but"

Scott Chacon stellt GitButler als neues Versionskontrollsystem vor, das viele Konzepte von Jujutsu (JJ) übernommen hat. Das neue Kommandozeilen-Tool trägt den Namen "but" und bietet mit Befehlen wie "but status" eine übersichtliche Darstellung von Dateiänderungen und Commits. Im Gegensatz zu Standard-Git zeigt dieses Tool die Historie und den Arbeitsstatus in einer kompakteren, log-ähnlichen Form an. Diese Sektion verdeutlicht, dass GitButler nicht nur eine GUI ist, sondern auch für Terminal-Nutzer optimiert wird. Die Ähnlichkeit zu Tools wie Sapling wird dabei explizit betont.

Parallele Branches und Staging-Areas

Ein Kernfeature von GitButler ist die Fähigkeit, mehrere Branches gleichzeitig aktiv zu haben und an ihnen parallel zu arbeiten. Chacon demonstriert, wie Dateien unterschiedlichen Staging-Areas zugewiesen werden können, die jeweils einem spezifischen Branch-Stack entsprechen. Durch automatisches Aktualisieren der Referenzen (Refs) beim Rebasing wird der Workflow natürlicher gestaltet als in herkömmlichem Git. Nutzer können gezielt entscheiden, in welchen Branch sie neue Änderungen committen wollen, ohne ständig den Kontext wechseln zu müssen. Dies erleichtert die Arbeit an komplexen Projekten mit vielen Abhängigkeiten erheblich.

Das Konzept des "Rubbing"

Der Begriff "Rubbing" beschreibt das Kombinieren zweier Elemente, um eine neue Struktur zu schaffen, vergleichbar mit dem Crafting in Minecraft. Mit dem Befehl "but rub" lassen sich Commits zusammenführen (squashen), Dateien zwischen Commits verschieben oder Änderungen rückgängig machen. Der Sprecher zeigt praxisnah, wie man Dateien aus einem Commit drei Ebenen tief im Stack extrahiert und in einen anderen verschiebt. Während dies in Standard-Git mühsame Fixup-Commits und Auto-Squashing erfordert, erledigt GitButler dies intuitiv. Diese Flexibilität bei der Manipulation der Commit-Historie ist ein zentrales Alleinstellungsmerkmal des Tools.

Erstellen und Markieren von Commits

Ähnlich wie bei Jujutsu erlaubt GitButler die Erstellung leerer Commits mit dem Befehl "but new", die nachträglich mit Inhalten gefüllt werden können. Ein weiteres mächtiges Feature ist das "Marking", bei dem ein spezifischer Commit als Ziel markiert wird, in den alle folgenden Dateiänderungen automatisch fließen. Chacon demonstriert dies an einem Stacked Branch, bei dem ein tief liegender Commit aktualisiert wird, während man einfach weiterarbeitet. Diese Methode spart Zeit, da der Nutzer nicht manuell committen und rebasen muss, um historische Änderungen einzupflegen. Die Markierung kann jederzeit aufgehoben oder auf einen anderen Punkt im Stack verschoben werden.

Operationen-Log und JSON-Skripting

GitButler führt ein detailliertes Oplog (Operationen-Log), das jede ausgeführte Aktion speichert und über einen "undo"-Befehl umkehrbar macht. Dies bietet eine Sicherheitsebene, die über das klassische Git-Reflog hinausgeht, da das gesamte Arbeitsverzeichnis und der Status wiederhergestellt werden können. Zudem unterstützen alle Befehle eine JSON-Ausgabe mittels der Flag "-J" oder "--json", was die Automatisierung erheblich vereinfacht. Scott Chacon betont, dass dies die Interaktion mit Tools wie jq wesentlich eleganter macht als das Parsen der üblichen Git-Ausgaben. Die Demo endet mit dem Hinweis auf die verbesserte Skriptfähigkeit für professionelle Entwickler-Workflows.

Community Posts

View all posts