- 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:
- git add $FILES_YOU_FIXED
- 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
- Die zu absorbierenden Änderungen mit
git add hinzufügen
git absorb ausführen
- Wenn man mit dem Ergebnis zufrieden ist,
git rebase -i --autosquash ausführen
- 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
Hacker-News-Kommentare
Nutzer von
git absorbhalten dieses Tool für sehr nützlichgit absorbautomatisch den richtigen CommitMit einem Alias für
git commit --fixupsind sie zufriedenSie haben
git absorbausprobiert, aber es hat oft den falschen Eltern-Commit gewähltgit --fixupundgit rebase --autosquashwurden zwar noch nicht verwendet, wirken aber nützlichgit-absorbscheint noch einen Schritt weiterzugehenSkepsis gegenüber dem Umschreiben von Commits und Historie
Mit
magitlassen sich Fixup-Commits leicht erstellenSie haben von
git commit --fixupundgit rebase --autosquasherfahrengit rebase -ideckt viele Anforderungen abSie verstehen die Besessenheit von einer ultrasauberen Commit-Historie nicht
Es ist nicht nachvollziehbar, aus den letzten 10 Commits einen konfliktfreien Commit für eine Änderung auszuwählen
fixup^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...