git absorb – automatisiertes `git commit --fixup`
(github.com/tummychow)- Eine für git portierte Version von
hg absorb, das von Facebook entwickelt wurdehg absorbkann 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 absorbdie 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 absorbaus, 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 --fixupmanuell nach Commit-SHAs zu suchen oder interaktiv zu rebased, macht man Folgendes:- git add $FILES_YOU_FIXED
- git absorb --and-rebase
git absorberkennt 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-rebasewerden diesefixup-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 addhinzufügen git absorbausführen- Wenn man mit dem Ergebnis zufrieden ist,
git rebase -i --autosquashausführen - Wenn nicht, mit
git reset --softin den vorherigen Zustand zurückkehren
How it works (roughly)
git absorbprü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
.gitconfigder WertmaxStackgesetzt werden
One fixup per fixable commit
- Standardmäßig wird für jeden absorbierbaren Chunk ein separater
fixup-Commit erzeugt - Mit dem Flag
-Fkann stattdessen nur einfixup-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
autoStageIfNothingStagedkonfiguriert 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 absorbist ein von Facebookshg absorbportiertes 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 automatischfixup-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...