16 Punkte von GN⁺ 2024-09-27 | 2 Kommentare | Auf WhatsApp teilen
  • Eine für git portierte Version von hg absorb, das von Facebook entwickelt wurde
    • hg absorb kann man als eine der coolsten Workflow-Verbesserungen in Versionsverwaltungssystemen der letzten Jahre bezeichnen
    • Wenn sich nicht commitete Änderungen im Arbeitsverzeichnis auf einem Draft-Changeset befinden, werden beim Ausführen von hg absorb die noch nicht commiteten Korrekturen automatisch in das passende Draft-Ancestor-Changeset absorbiert
    • So lässt sich ein hg histedit + "roll"-Vorgang durchführen, ohne Commits zu erstellen oder manuell Regeln zur History-Umschreibung festzulegen
    • Der Befehl betrachtet die geänderten Zeilen, findet das Changeset, das diese Zeilen geändert hat, und passt dieses Changeset so an, dass es die nicht commiteten Änderungen enthält
    • Wenn Änderungen nicht konfliktfrei erstellt werden können, bleiben sie uncommitted
    • Dieser Workflow ist für Aufgaben wie das Einpflegen von Review-Feedback sehr nützlich. Man nimmt Dateiänderungen vor, führt hg absorb aus, und die Zuordnung zwischen Änderungen und Commits wird automatisch bereinigt. Eine magisch wirkende Funktion

Einsatzszenario für git absorb

  • Es gibt einen Feature-Branch mit einigen Commits
  • Ein Teammitglied reviewt den Branch und weist auf einige Bugs hin
  • Es gibt Bugfixes, aber weil man an atomare Commits glaubt, möchte man sie nicht alle in einen undurchsichtigen Commit namens fixes packen
  • Statt für git commit --fixup manuell nach Commit-SHAs zu suchen oder interaktiv zu rebased, macht man Folgendes:
    1. git add $FILES_YOU_FIXED
    2. git absorb --and-rebase
  • git absorb erkennt automatisch, welche Commits sicher geändert werden können und welche staged Änderungen zu welchem Commit gehören
  • Danach erstellt es fixup!-Commits für diese Änderungen
  • Mit dem Flag --and-rebase werden diese fixup-Commits automatisch in die jeweiligen Commits integriert
  • Wenn man dem nicht traut, kann man die Ausgabe manuell prüfen und anschließend Gits eingebaute autosquash-Funktion verwenden, um die Fixups in den Feature-Branch zu integrieren

Installation

  • Kann durch Herunterladen der Artefakte aus dem neuesten Tag-Release installiert werden
  • Artefakte für Windows, MacOS und Linux werden bereitgestellt

Verwendung

  1. Die zu absorbierenden Änderungen mit git add hinzufügen
  2. git absorb ausführen
  3. Wenn man mit dem Ergebnis zufrieden ist, git rebase -i --autosquash ausführen
  4. Wenn nicht, mit git reset --soft in den vorherigen Zustand zurückkehren

How it works (roughly)

  • git absorb prüft, ob zwei Patches P1 und P2 vertauschbar sind
  • Standardmäßig werden die letzten 10 Commits berücksichtigt
  • Für jeden Chunk im Index wird geprüft, ob dieser Chunk mit dem letzten Commit vertauschbar ist
  • Wird ein nicht vertauschbarer Commit gefunden, wird der entsprechende Chunk in einen fixup-Commit umgewandelt

Configuration

Stack size

  • Standardmäßig werden die letzten 10 Commits berücksichtigt
  • Um mehr Commits einzubeziehen, kann in .gitconfig der Wert maxStack gesetzt werden

One fixup per fixable commit

  • Standardmäßig wird für jeden absorbierbaren Chunk ein separater fixup-Commit erzeugt
  • Mit dem Flag -F kann stattdessen nur ein fixup-Commit für alle Chunks erzeugt werden, die in denselben Commit absorbiert werden

Auto-stage all changes if nothing staged

  • Standardmäßig werden nur staged Dateien berücksichtigt
  • Wenn keine Änderungen staged sind, kann mit autoStageIfNothingStaged konfiguriert werden, dass automatisch alle Änderungen staged werden

Fixup target always SHA

  • Standardmäßig verweist die fixup-Commit-Nachricht auf die Zusammenfassung des Ziel-Commits
  • Es kann auch so konfiguriert werden, dass immer auf die SHA des Ziels verwiesen wird

TODO

  • Implementierung eines Force-Flags
  • Implementierung der Prüfung des Remote-Default-Branches
  • Hinzufügen eines kleinen Force-Flags zum Deaktivieren einzelner Sicherheitsprüfungen
  • Sicherstellen, dass alle Fehlerausgaben für Nutzer hilfreich sind
  • Mehr Logs bei Erfolg ausgeben
  • Mehr Tests hinzufügen
  • Stack- und Vertauschbarkeitsdetails dokumentieren
  • Mehr Vertauschbarkeitsfälle hinzufügen
  • Implementieren, dass nicht alle Chunks gleichzeitig in den Speicher geladen werden
  • Implementierung einer Index-Sperre zum Schutz vor gleichzeitigen Änderungen

Zusammenfassung von GN⁺

  • git absorb ist ein von Facebooks hg absorb portiertes Tool, das den Entwicklungs-Workflow verbessert, indem es Commits automatisch anpasst
  • Es ist besonders nützlich beim Einpflegen von Review-Feedback und erledigt vieles automatisch, ohne dass man Commits manuell suchen oder ändern muss
  • Ein anderes Tool mit ähnlicher Funktion ist git-autofixup. Es erzeugt automatisch fixup-Commits auf Basis von Commit-Messages
  • Vorteile sind die einfachere Übernahme von Code-Review-Feedback und eine sauberere Commit-History. Ein Nachteil ist, dass zu starke Abhängigkeit von Automatisierung zu unerwarteten Ergebnissen führen kann

2 Kommentare

 
GN⁺ 2024-09-27
Hacker-News-Kommentare
  • Nutzer von git absorb halten dieses Tool für sehr nützlich

    • Wenn ein PR mit mehreren Commits in der CI fehlschlägt, findet git absorb automatisch den richtigen Commit
    • Es erspart die Mühe, den Commit manuell zu finden
    • Es gibt fast keine False Positives, und wenn False Negatives auftreten, kann man sie manuell behandeln
    • Manche sind der Meinung, dass ein PR aus nur einem Commit bestehen sollte, aber das ist nicht immer so
    • Auf GitHub werden logisch kleine Commits bevorzugt
  • Mit einem Alias für git commit --fixup sind sie zufrieden

    • Er zeigt die Commits des aktuellen Branches an und ermöglicht die Auswahl über fzf
    • Auf Basis des ausgewählten Commits wird ein Fixup-Commit erstellt
  • Sie haben git absorb ausprobiert, aber es hat oft den falschen Eltern-Commit gewählt

    • Den Commit manuell zu finden war besser
    • Sie bevorzugen die vollständige Kontrolle über die Commit-Historie
    • Dieses Tool wirkt wie zu viel Magie
  • git --fixup und git rebase --autosquash wurden zwar noch nicht verwendet, wirken aber nützlich

    • git-absorb scheint noch einen Schritt weiterzugehen
    • Im README ist nicht klar genug, was es in bestimmten Situationen genau tut
  • Skepsis gegenüber dem Umschreiben von Commits und Historie

    • Besser ist es, Fehler zu korrigieren, einen neuen Commit zu erstellen und weiterzumachen
  • Mit magit lassen sich Fixup-Commits leicht erstellen

    • Selbst wenn man Emacs nicht nutzt, lohnt es sich, es allein für magit installiert zu lassen
    • Für vscode-Nutzer ist Edamagit gut
  • Sie haben von git commit --fixup und git rebase --autosquash erfahren

    • Interaktives Git-Rebase ist ihr liebstes Git-Werkzeug
    • Es hilft dabei, perfekte logisch atomare Commits zu erstellen
    • Allerdings kann diese Bearbeitung der Historie manchmal auch nach hinten losgehen
  • git rebase -i deckt viele Anforderungen ab

    • Man kann damit squash, fixup, reword und delete von Commits interaktiv durchführen
    • Jeder, der Git verwendet, sollte das lernen
  • Sie verstehen die Besessenheit von einer ultrasauberen Commit-Historie nicht

    • Sie fragen sich, ob man die Commit-Historie wirklich so oft im Detail ansieht
  • Es ist nicht nachvollziehbar, aus den letzten 10 Commits einen konfliktfreien Commit für eine Änderung auszuwählen

    • Beim Auflösen von Konflikten verwenden sie oft fixup^
    • Sie vertrauen nicht darauf, dass automatisch ein Ziel-Commit ausgewählt wird
 
roxie 2025-05-18
  • Ich verstehe nicht, warum man so besessen von einer ultrasauberen Commit-Historie ist
    • Ich frage mich, ob man sich die Commit-Historie wirklich so oft so genau ansieht

Dieser Kommentar trifft mich irgendwie. Ich habe fixup / autosquash mal kurz ausprobiert, aber da kam bei mir schon ein bisschen die Ernüchterung auf, ob ich vielleicht der Einzige bin, den das überhaupt interessiert...