Git in der Praxis: Mit Fixup und Autosquash die Historie sauber halten

Im Arbeitsalltag eines Entwicklers geschieht es auch in Git-verwalteten Projekten häufig, dass sich die Commit-Historie in einem Branch mit Korrektur-Commits füllt, die mit Etiketten wie "Typo korrigiert", "Kommentar entfernt" usw. versehen sind. Um diese Historie nun sauber halten zu können, bietet uns Git (wie so oft) unterschiedliche Möglichkeiten an, von denen ich hier eine spezielle Kombination vorstellen möchte:

git commit --fixup und git rebase -i --autosquash

Um die Verwendung an einem konkreten Beispiel zu verdeutlichen, erstellen wir ein leeres Repository, pflegen eine Textdatei (im Markdown-Format) ein und erzeugen so einen stabilen ersten Stand des Branches:

echo '# Seibert Media Testdatei' > README.md

git init 
Initialized empty Git repository in /tmp/smedia-tutorial/.git/

git add . 

git ci -m "Initialer Import."
[master (root-commit) ef017c3] Initialer Import.
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

Nun erweitern wir die Readme-Datei um einen weiteren validen Eintrag und committen diese Änderung:

echo 'Lesen sie diesen Beitrag in [unserem Blog](http://seibert.group/blog).' >> README.md
 
git ci -am "Link zum Blog ergänzt." ?
 [master f554ce5] Link zum Blog ergänzt.
 1 file changed, 1 insertion(+)

Unsere Commit-Historie gestaltet sich damit wie folgt:

git log --oneline

f554ce5 Link zum Blog ergänzt.
ef017c3 Initialer Import.

Nun fügen wir eine fehlerhafte Änderung hinzu und committen sie:

echo '----\n**2015 Seibär Mödia**' >> README.md

git ci -am "Readme Footer ergänzt."
 [master a9ffae5] Readme Footer ergänzt.
 1 file changed, 2 insertions(+)

Anschließend ergänzen wir wieder eine korrekte Zeile in der Readme-Datei, sodass sie so aussieht:

# Seibert Media Testdatei
Lesen sie diesen Beitrag in [unserem Blog](http://seibert.group/blog).

Weitere interessante Beiträge zum Thema Git können sie in [dieser Übersicht](https://seibert.group/blog/tag/git/) einsehen.

----
**2015 Seibär Mödia**

Auch diese Änderungen committen wir:

% git ci -am "Link auf weitere Git-Artikel ergänzt."
[master 51c0e48] Link auf weitere Git-Artikel ergänzt.
1 file changed, 3 insertions(+)

Unsere Commit-Historie sollte sich nun so darstellen:

git log --oneline

51c0e48 Link auf weitere Git-Artikel ergänzt.
a9ffae5 Readme Footer ergänzt.
f554ce5 Link zum Blog ergänzt.
ef017c3 Initialer Import.

Dann fällt uns auf, dass wir in Commit a9ffae5 einen Tippfehler begangen haben: Diesen korrigieren wir in der Textdatei und committen erneut die Änderungen. Wichtig dabei: Wir tun dies mittels git commit --fixup HASH.

git add README.md
git ci --fixup a9ffae5
[master 40bfcca] fixup! Readme Footer ergänzt.
1 file changed, 1 insertion(+), 1 deletion(-)

Somit hat unsere Historie diese Gestalt:

git log --oneline

40bfcca fixup! Readme Footer ergänzt.
51c0e48 Link auf weitere Git-Artikel ergänzt.
a9ffae5 Readme Footer ergänzt.
f554ce5 Link zum Blog ergänzt.
ef017c3 Initialer Import.

Unsere Arbeit an der Datei ist beendet und wir können aufräumen! Dazu benutzen wir git rebase und beginnen beim zweiten Commit (f554ce5):

git rebase -i --autosquash f554ce5

Wir könnten in der folgenden Rebase-Ansicht zwar Änderungen durchführen, müssen dies aber in diesem konkreten Fall nicht und können den Dialog direkt verlassen.

git rebase -i --autosquash f554ce5
 [detached HEAD 23444e7] Readme Footer ergänzt.
 Date: Tue Aug 25 07:24:41 2015 +0200
 1 file changed, 2 insertions(+)
 Successfully rebased and updated refs/heads/master.

Unsere finale, aufgeräumte Commit-Historie präsentiert sich nun wie folgt:

% git log --oneline
2d76902 Link auf weitere Git-Artikel ergänzt.
23444e7 Readme Footer ergänzt.
f554ce5 Link zum Blog ergänzt.
ef017c3 Initialer Import.

Auch der Inhalt unserer Datei entspricht unseren Erwartungen:

# Seibert Media Testdatei
Lesen sie diesen Beitrag in [unserem Blog](http://seibert.group/blog).

Weitere interessante Beiträge zum Thema Git können sie in [dieser Übersicht](https://seibert.group/blog/tag/git/) einsehen.

----
**2015 Seibert Media**

Eine wichtige Regel hierbei lautet: Niemals Commits rebasen, die bereits in ein gemeinsam genutztes Repository hochgeladen wurden! (Siehe dazu auch unsere ausführlichen Überlegungen zu Merging vs. Rebasing.)

Weiterführende Informationen zu dieser Thematik finden sich auch in der Git-Dokumentation.

Weiterführende Infos: Ihr Partner für Git und Stash

Kennen Sie Stash, Atlassians Git-Repository-Managementsystem? Stash bietet eine zentrale Lösung zum Management des gesamten distributierten Codes: Hier kommen alle Git-Repositories im Unternehmen zusammen, hier finden Entwickler immer die letzte offizielle Version eines Projekts, hier können Projektverantwortliche Berechtigungen kontrollieren, um sicherzustellen, dass die richtigen Nutzer Zugriff auf den richtigen Code haben. Möchten Sie mehr erfahren? Wir sind offizieller Vertriebspartner von Atlassian und einer der größten Atlassian Experts Partner weltweit. Gerne unterstützen wir Sie bei der Evaluierung, Lizenzierung und Adaption von Stash.

99 Argumente für Stash als Git-Repository-Manager
Branch-basierte Git-Workflows mit Stash adaptieren
Echte Integration: Das Zusammenspiel von JIRA, Stash und Bamboo
Interview: Die Vorteile von Git in der Software-Entwicklung und die Möglichkeiten von Stash
So funktioniert die Lizenzierung von Atlassian-Produkten

ACHTUNG!
Unsere Blogartikel sind echte Zeitdokumente und werden nicht aktualisiert. Es ist daher möglich, dass die Inhalte veraltet sind und nicht mehr dem neuesten Stand entsprechen. Dafür übernehmen wir keinerlei Gewähr.

Schreibe einen Kommentar