Git

Git-Commits zerquetschen

Git-Commits zerquetschen

So quetschen Sie Commits in Git, um Ihren Verlauf sauber zu halten

Wenn Sie mit Git arbeiten, ist es eine gute Idee, häufig zu committen, damit Sie jederzeit zum Status des Codes zurückkehren können, wenn Sie etwas vermasseln. Es ist jedoch nicht immer eine gute Idee, all diese Mini-Änderungen auf den Hauptzweig zu übertragen. Es macht die Geschichte chaotisch und schwer zu verfolgen.

Git bietet eine Möglichkeit, eine Reihe Ihrer Commits mit dem rebase-Befehl zu zerquetschen. Sobald Sie Ihre Änderungen an einer bestimmten Datei oder für ein bestimmtes Feature lokal vorgenommen haben, können Sie die Änderungen jederzeit mit der Squash-Methode kombinieren, bevor Sie sich für den Hauptzweig festlegen. Dies wird anderen helfen, Ihre Änderungen besser zu verstehen.

Warnung: Auch wenn Sie aus externen Repositorys ziehen und Commits zusammen squash können, ist dies eine schlechte Idee. Es kann zu Konflikten und Verwirrung führen. Vermeide es, den bereits öffentlichen Verlauf zu ändern. Halten Sie sich nur an Squashing-Commits, die lokal für Ihre Arbeit sind.

Lassen Sie uns einen Beispielfall durcharbeiten.

Angenommen, wir haben zwei Dateien a.py und b.py. Lassen Sie uns zunächst den Prozess der Erstellung der Dateien und der Änderungen durchgehen:

$ mkdir meinProjekt
$ cd meinProjekt/
$ git init
$ echo "print("hallo A")" > a.py
$ git add -A && git commit -m "Hinzugefügt a.py"
$ echo "print("hallo B")" > b.py
$ git add -A && git commit -m "Hinzugefügt b.py"
$ echo "print("hallo BB")" > b.py
$ git add -A && git commit -m "b.py-Modifikation 1"
$ echo "print("hallo BBB")" > b.py
$ git add -A && git commit -m "b.py-Modifikation 2"

Wenn wir den Verlauf der Commits überprüfen, sehen wir Folgendes:

$ git log --oneline --graph --decorate
* dfc0295 (HEAD -> Master) b.py Modifikation 2
* ce9e582 b.py Modifikation 1
* 7a62538 Hinzugefügt b.py
* 952244a Hinzugefügt a.py

Nachdem wir mit unserer Arbeit fertig sind, beschließen wir, alle Änderungen an der b.py in einen einzigen Commit für Klarheit. Wir zählen, dass es 3 Commits auf b gibt.py vom KOPF. Wir geben folgenden Befehl aus:

git rebase -i HEAD~3

Die Option -i weist Git an, den interaktiven Modus zu verwenden.

Es sollte ein Fenster in Ihrem Git-Texteditor erscheinen:

Pick 7a62538 Hinzugefügt b.py
Pick ce9e582 b.py Modifikation 1
pick dfc0295 b.py Modifikation 2
 
# Rebase 952244a… dfc0295 auf 952244a (3 Befehl(e))
#
# Befehle:
# p, pick = Commit verwenden
# r, reword = Commit verwenden, aber die Commit-Nachricht bearbeiten
# e, edit = Commit verwenden, aber zum Ändern stoppen
# s, squash = Commit verwenden, aber mit vorherigem Commit verschmelzen
# f, fixup = wie "squash", aber die Log-Meldung dieses Commits verwerfen
# x, exec = Befehl ausführen (der Rest der Zeile) mit Shell
#
# Diese Zeilen können nachbestellt werden; sie werden von oben nach unten ausgeführt.
#
# Wenn Sie hier eine Zeile entfernen, WIRD DIESER COMMIT VERLOREN.
#
# Wenn Sie jedoch alles entfernen, wird die Rebase abgebrochen.
#
# Beachten Sie, dass leere Commits auskommentiert werden
~

Die Commits werden oben chronologisch vom frühesten bis zum neuesten aufgelistet. Sie können wählen, welches Commit Sie „wählen“ und welches Commit zum Squash. Der Einfachheit halber wählen wir den ersten Commit aus und quetschen den Rest hinein. Also ändern wir den Text wie folgt:

Pick 7a62538 Hinzugefügt b.py
Kürbis ce9e582 b.py Modifikation 1
Kürbis dfc0295 b.py Modifikation 2
 
# Rebase 952244a… dfc0295 auf 952244a (3 Befehl(e))
#
# Befehle:
# p, pick = Commit verwenden
# r, reword = Commit verwenden, aber die Commit-Nachricht bearbeiten
# e, edit = Commit verwenden, aber zum Ändern stoppen
# s, squash = Commit verwenden, aber mit vorherigem Commit verschmelzen
# f, fixup = wie "squash", aber die Log-Meldung dieses Commits verwerfen
# x, exec = Befehl ausführen (der Rest der Zeile) mit Shell
#
# Diese Zeilen können nachbestellt werden; sie werden von oben nach unten ausgeführt.
#
# Wenn Sie hier eine Zeile entfernen, WIRD DIESER COMMIT VERLOREN.
#
# Wenn Sie jedoch alles entfernen, wird die Rebase abgebrochen.
#
# Beachten Sie, dass leere Commits auskommentiert werden

Sobald Sie die Textdatei speichern und schließen, sollte sich ein weiteres Textfenster öffnen, das so aussieht:

# Dies ist eine Kombination aus 3 Commits.
# Die Nachricht des ersten Commits lautet:
B hinzugefügt.py
 
# Dies ist die zweite Commit-Nachricht:
 
b.py Modifikation 1
 
# Dies ist die dritte Commit-Nachricht:
 
b.py Modifikation 2
 
# Bitte geben Sie die Commit-Nachricht für Ihre Änderungen ein. Linien beginnend
# mit '#' wird ignoriert und eine leere Nachricht bricht den Commit ab.
#
# Datum:      Fr 30. März 21:09:43 2018 -0700
#
# Rebase im Gange; auf 952244a
# Sie bearbeiten gerade einen Commit, während Sie den Branch 'master' auf '952244a' umbasieren.
#
# Zu verpflichtende Änderungen:
#       neue Datei:   b.py
#

Speichern und schließen Sie auch diese Datei. Sie sollten so etwas sehen:

$ git rebase -i HEAD~3
[abgelöster KOPF 0798991] Hinzugefügt b.py
Datum: Fr 30. Mär 21:09:43 2018 -0700
1 Datei geändert, 1 Einfügung (+)
Modus erstellen 100644 b.py
Refs/Heads/Master erfolgreich umbasiert und aktualisiert.

Wenn Sie jetzt den Commit-Verlauf überprüfen:

$ git log --oneline --graph --decorate
* 0798991 (HEAD -> master) Hinzugefügt b.py
* 952244a Hinzugefügt a.py

Alle Commits für b.py wurden in einen Commit gequetscht. Sie können dies überprüfen, indem Sie sich das b ansehen.py-Datei:

$ Katze b.py
print("Hallo BBB")

Es hat den Inhalt von Modifikation 2.

Fazit

Das Rebase ist ein mächtiger Befehl. Es kann Ihnen helfen, Ihre Geschichte sauber zu halten. Vermeiden Sie es jedoch, es für bereits öffentliche Commits zu verwenden, da dies zu Konflikten und Verwirrung führen kann. Verwenden Sie es nur für Ihr eigenes lokales Repository.

Weitere Studie:

Beste Gamepad-Mapping-Apps für Linux
Wenn du Spiele unter Linux gerne mit einem Gamepad statt mit einem typischen Tastatur- und Maus-Eingabesystem spielst, gibt es einige nützliche Apps f...
Nützliche Tools für Linux-Spieler
Wenn Sie gerne unter Linux spielen, haben Sie wahrscheinlich Apps und Dienstprogramme wie Wine, Lutris und OBS Studio verwendet, um das Spielerlebnis ...
HD-Remastered-Spiele für Linux, die noch nie zuvor eine Linux-Version hatten
Viele Spieleentwickler und -herausgeber entwickeln HD-Remaster alter Spiele, um die Lebensdauer des Franchise zu verlängern. Bitte Fans, die Kompatibi...