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!