Git-Tipps und -Tricks
(blog.gitbutler.com)- Es gibt viele weniger bekannte Funktionen, die selbst langjährige Git-Nutzer leicht übersehen; das stellt die Annahme infrage, dass fortgeschrittenes Kommandozeilenwissen allgemein verbreitet sei
- Anders als die Generation, die von SVN oder CVS gewechselt ist, hatten Entwickler, die ausschließlich Git genutzt haben, weniger Anlass, bestimmte fortgeschrittene Nutzungsweisen zu lernen
- Git hat im Laufe der Zeit immer wieder kleine, aber nützliche Funktionen ergänzt; solche Änderungen können in bestimmten Situationen praktischen Wert haben
- Für fortgeschrittene Nutzer wird das Thema in eine kurze dreiteilige Serie aufgeteilt: alte, aber nützliche Funktionen, kürzlich hinzugekommene Features sowie Themen rund um große Repositories und Monorepos
- Wer über vertraute Git-Gewohnheiten hinaus noch einmal auf die Funktionen schaut, die leicht unsichtbar bleiben, kann alltägliche Repository-Arbeiten effizienter erledigen
Warum sich ein neuer Blick auf Git lohnt
- Bei jüngsten Vorträgen zu Git und GitButler wurde deutlich, dass viele Entwickler bei Git vieles nicht kennen
- Früher gab es Vorträge zu fortgeschrittenem Git, doch in den vergangenen rund zehn Jahren wurde angenommen, dass die Leute fortgeschrittene Kommandozeilenfunktionen bereits kennen
- Eine Generation von Entwicklern, die nur Git verwendet hat, musste nicht von Tools wie SVN oder CVS zu Git wechseln oder frühere Konzepte neu lernen
- Auch Git hat mit der Zeit neue Funktionen dazugelernt; die meisten sind subtil oder auf bestimmte Anwendungsfälle zugeschnitten, können in der Praxis aber hilfreich sein
- Die Blogserie basiert auf dem FOSDEM-2024-Vortrag little known Git stuff
Dreiteilige Serie mit Git-Tipps
- Zielgruppe sind fortgeschrittene Git-Nutzer; behandelt werden Funktionen, die man auch nach langer Git-Nutzung übersehen haben kann
- Statt alles in einen einzigen Beitrag zu packen, ist die Serie in drei kurze Artikel mit jeweils einigen Themen aufgeteilt
- Enthaltene Themen:
- Oldies but Goodies: alte, aber weiterhin nützliche Git-Funktionen
- Some Subtle New Things: subtile Änderungen, die kürzlich zu Git hinzugekommen sind
- Really Large Repositories and Monorepos: Inhalte zu sehr großen Repositories und Monorepos
- Der erste Artikel führt weiter zu Oldies but Goodies
1 Kommentare
Kommentare auf Hacker News
Ich hatte auch interessante Gespräche mit den Leuten aus der Mercurial-Ecke; offenbar erzielen sie derzeit erstaunliche Geschwindigkeitsverbesserungen, indem sie Teile der Hg-Interna in Rust schreiben.
Ich denke auch über eine 3. Ausgabe von Pro Git nach. Wenn es also Dinge gibt, die ihr beim mühsamen Lernen von Git herausgefunden habt oder über die ihr gern mehr wissen würdet, lasst es mich wissen.
difftasticeignet sich gut als Ersatz für Gits diff: https://difftastic.wilfred.me.uk/Als häufig genutzte
gitconfig-Aliasse verwende ichfza,goneundroot.git fzazeigt geänderte/neue Dateien in einemfzf-Fenster an und übergibt die ausgewählten Dateien angit add: https://github.com/junegunn/fzfgit gonelöscht lokale Branches, die es auf dem Remote nicht mehr gibt, undgit rootgibt die Repository-Wurzel aus, was praktisch ist, um aus tiefen Verzeichnissen dorthin zurückzukehren. Heutzutage nutze ich dafür häufigerzoxide, daher brauche ich es weniger: https://github.com/ajeetdsouza/zoxidegit blamenicht unbrauchbar wird.https://git-scm.com/docs/git-blame#Documentation/git-blame.txt---ignore-revltrevgt
Zum Beispiel habe ich nicht verstanden, warum sich alle nachfolgenden Commits ändern, wenn ich während eines Rebase nur einen einzelnen Commit lösche. Erst als mir klar wurde, dass die Speicherung zwar Snapshot-basiert ist, die Operationen aber Diff-basiert sind, habe ich Rebase verstanden. In Schulungen würde es helfen, diesen Punkt stärker zu betonen.
Ich respektiere Leute, die Git mögen, aber für mich ist es einfach ein Werkzeug, das ich benutzen muss.
checkout/commit/pushhinaus ein paar Dinge kennt, insbesondere History-Rewriting, kann sich die Qualität der Commit-Historie stark verbessern, und andere Engineers im Projekt können den Ablauf leichter nachvollziehen.Git wirkt wie eine Konstante, die der Branche noch lange erhalten bleibt, und es ist eines der Werkzeuge, die man in der täglichen Entwicklung am häufigsten berührt. Es lohnt sich also, sich ein wenig damit zu beschäftigen.
Deshalb finde ich es in Ordnung, dass Git bis zu einem gewissen Grad Komplexität hat.
core.fsmonitorgelernt. Aus Sicht eines großen Monorepos wäre es schön, wenngit cloneeine Resume-Option hätte.In den 2000ern hatte ich dasselbe Problem, als ich über eine Verbindung mit geringer Bandbreite das Kernel-Repository klonen wollte. Nachdem ich auf der Mailingliste um Hilfe gebeten hatte, stellte schließlich jemand das gesamte Repository als komprimiertes Tar-Archiv auf seine private Website, und erst so konnte ich es herunterladen.
Auch heute passiert mir bei großen Repository-Klons manchmal dasselbe, wenn das Firmen-VPN kurz aussetzt. Man stelle sich vor, das 300-GB-Windows-Repository ist zu 95 % heruntergeladen und dann bricht das WLAN kurz ab.
Es ist seltsam, dass die beiden bandbreitenhungrigsten Werkzeuge moderner Entwicklungs-Stacks, Git und Docker, das Fortsetzen von Downloads nicht richtig unterstützen.
https://git-scm.com/docs/git-bundle
Das ist ähnlich wie der Wunsch nach einer Low-Level-Sprache, die die Systemkomplexität verbirgt; beides schließt sich im Grunde gegenseitig aus. Git ist zufriedenstellend und nicht so schwer zu lernen, also müssen manche einfach Git lernen.
Es räumt die Blackbox beiseite, die viele Entwickler im Terminal empfinden, stellt den Graphen in den Vordergrund und zeigt Rebase-Vorgänge visuell so natürlich, dass Git Spaß macht.
CLI-Kompetenz bleibt wertvoll, aber es ist frustrierend zu sehen, wie Entwickler mit zehn Jahren Erfahrung an grundlegenden Problemen scheitern oder die Projekthistorie ruinieren, weil die Stimmung herrscht: „Ein echter Engineer benutzt nur die Git-CLI.“
Heutzutage sage ich Leuten: Selbst wenn ihr die CLI nutzt, lasst euch den ganzen Tag in einem anderen Fenster den Graphen anzeigen. Das geht kostenlos in VS Code, JetBrains und sogar in der CLI.
Wenn ein Teammitglied einen PR mergt, sehe ich das sofort und rebasiere meinen Branch; dadurch ist der Branch immer aktuell auf Basis von
main, und ich hinterlasse weder Merge-Hölle noch schreckliche „fix conflicts“-Commits.Als ich die Top 10 der Dateien suchte, die seit ihrer Erstellung gestern am häufigsten geändert wurden, stieß ich auf https://github.com/tj/git-extras/blob/main/Commands.md
Dort gibt es viele nützliche zusätzliche Git-Befehle.
git-extrasist gut. Ein weiteres ordentliches Tool ist git absorb: https://github.com/tummychow/git-absorbIch verstehe nicht so recht, warum die meisten Entwickler unbedingt auf der Git CLI bestehen, obwohl moderne UI-Clients wie GitKraken durchaus brauchbar und hilfreich sind: https://www.gitkraken.com/
Ich bin nicht grundsätzlich gegen GUIs, aber im Moment ist die CLI effizienter, und ich möchte keine Zeit damit verbringen, eine GUI zu finden, die folgende Bedingungen erfüllt:
Sie muss gut aussehen, eine native App sein und kein eingebetteter altmodischer Webbrowser, keine Telemetrie haben oder sie standardmäßig deaktivieren, vollständig Open Source sein und erwarten lassen, dass sie in fünf Jahren nicht verschwunden ist.
Außerdem darf sie die Dinge nicht noch verwirrender machen. In einer früheren Firma musste ich Visual Studio benutzen; dort war ein Button, der eigentlich „als Konflikt gelöst markieren“ bedeutete, unheilvoll mit „Accept merge“ beschriftet.
Wer bereits erwartet, dass ein bestimmtes Wort eine bestimmte Bedeutung hat, darf nicht verwirrt werden; ebenso ist es schwer, einem „Commit changes“-Button zu vertrauen, der aus Nettigkeit gleich noch auf den Remote pusht.
Wenn ich für einen einzelnen Commit in ein anderes Programm wechseln muss, sinkt meine Motivation, häufig zu committen.
push,pullundcheckout, daher fühlt sich eine GUI überdimensioniert an.Auch wenn man Git in der CLI nutzt, sind es meistens keine besonderen Dinge, sondern nur ein paar Befehle; selten genutzte Tipps und Tricks schreibe ich in eine Textdatei.
-committerdatekannte ich, aber ich wusste nicht, dass man es als Standardsortierung setzen kann; das ist sehr nützlich. Ein paar Notizen:git columnswird ziemlich verwirrend, wenn nicht alles auf den Bildschirm passt und man scrollen muss; Zahlen wären schön.git maintenancesieht gut aus, aber weil ich viel rebasiere, macht es mir Sorgen. Ich frage mich, ob man lose Objekte schneller verliert als mitgc. Ich sehe, dassgcdeaktiviert ist, aber es ist nicht eindeutig.Zu
git blamegibt es ein wenig bekanntes, aber nützliches Skript: https://github.com/gnddev/git-blameall. Es ist so unbekannt, dass ich es selbst nach Python 3 portieren musste, und ich bin nicht einmal Python-Entwickler.gcdeaktiviert. Wenn manmaintenance runexplizit ausführt, wird es als Task aktiviert.Lose Objekte werden nicht schneller eingesammelt als mit
gc. Letztlich wird einfach gc ausgeführt.git-blameallsieht ganz gut aus; das sollte ich mal ausprobieren.Mit ein paar Aliasen, die in mehreren Umgebungen funktionieren, habe ich meinen Git-Flow stark vereinfacht.
git syncedsynchronisiert den aktuellen Branch per Rebase mit dem Upstream, falls es einen gibt, sonst mit origin. Es verwendetmasterodermain, wobeimainbevorzugt wird.git pubveröffentlicht Änderungen auf dem Remote origin und nutzt Force-Push mit Lease.git pröffnet die passende PR-URL auf GitHub und benötigt keinen GH-Client. Wenn ein Upstream definiert ist, wird der PR dorthin geschickt.git huböffnet die GitHub-Seite des Repositorys.https://softwaredoug.com/blog/2022/11/09/idiot-proof-git-aliases.html
Ich habe aufgehört, so zu tun, als wüsste ich, was ich mache, und nutze visuelle Git-Tools. Dinge wie SmartGit oder die in IntelliJ integrierten Tools. Git-„Kommandozeilenhelden“ wirken auf mich eher wie Angeberei.
Die Befehlsebene für Nutzer kann ärgerlich verwirrend sein. Zum Beispiel können
YoursundTheirsje nach Kontext genau das Gegenteil bedeuten.Der gesamten Benutzeroberfläche fehlt ein gemeinsamer Stil oder ein gemeinsames Thema; damit Menschen nicht wahnsinnig werden, braucht es eine neue visuelle Ebene.
Ich kenne die App und Git insgesamt nur so weit, wie ich es für die Arbeit brauche; wenn ich selten mehr brauche, kann ich es nachschlagen. Über mehrere Jahre hinweg kam das nur ein- oder zweimal vor.
Auch bei komplizierten Aufgaben, bei denen ich Fehler anderer oder meine eigenen korrigiere, schaue ich mir zuerst mit einem visuellen Tool History, Commits, Reflog und Diffs an, um zu verstehen, was schiefgelaufen ist und was sich retten lässt.
Wenn es nur einen Commit gibt, zu dem ich zurückkehren muss, mache ich
reset --hard; wenn ich etwas aus mehreren Commits zusammenführen muss, nutze ich in der Regel die Kommandozeile.Beides schließt sich nicht gegenseitig aus. Für Dinge wie Diffs oder Konflikte nutze ich ausschließlich visuelle Tools, aber ich habe viel daraus gelernt, mich mit Commit-Objekten, dem Reflog, dem, was Rebase im Hintergrund macht, interaktivem Rebase, Hard/Soft Reset usw. zu beschäftigen.