Wie man Git -Commits squit macht

Wie man Git -Commits squit macht

Wie man in Git begeht, um Ihre Geschichte sauber zu halten

Wenn Sie mit Git zusammenarbeiten, ist es eine gute Idee, sich häufig zu verpflichten, sodass Sie immer zum Zustand des Codes zurückkehren können, wenn Sie es vermasseln. Es ist jedoch nicht immer eine gute Idee, all diese Mini-Changes für den Hauptzweig zu begehen. Es macht die Geschichte chaotisch und schwer zu folgen.

Git bietet eine Möglichkeit, eine Reihe Ihrer Commits mit dem Befehl rebase zu zerquetschen. Sobald Sie Ihre Änderungen an einer bestimmten Datei oder für eine bestimmte Funktion lokal vorgenommen haben, können Sie immer die Kürbismethode verwenden, um die Änderungen miteinander zu kombinieren, bevor Sie sich zur Hauptzweig. Dies wird anderen helfen, Ihre Änderungen besser zu verstehen.

Warnung: Obwohl Sie aus externen Repositorys und Kürbis -Commits zusammen ziehen können, ist es eine schlechte Idee. Es kann Konflikte und Verwirrung verursachen. Vermeiden Sie es, die bereits öffentliche Geschichte zu ändern. Halten Sie sich nur an Squashing -Commits, die lokal zu Ihrer 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 des Erstellens der Dateien durchlaufen und die Änderungen vornehmen:

$ mkdir MyProject
$ cd MyProject/
$ git init
$ echo "print (" Hallo a ")"> a.py
$ git add -a && git Commit -m "fügte a hinzu.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 die Geschichte der Commits überprüfen, werden wir Folgendes sehen:

$ git log --oneline --graph -dekorieren
* DFC0295 (Kopf -> Master) B.PY -Modifikation 2
* CE9E582 b.PY -Modifikation 1
* 7a62538 hinzugefügt B.py
* 952244a fügte a hinzu.py

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

Git Rebase -i Kopf ~ 3

Die Option -I fordert GIT auf, den interaktiven Modus zu verwenden.

Es sollte ein Fenster in Ihrem Git -Texteditor auftreten:

Wählen Sie 7A62538 hinzu b.py
Wählen Sie CE9E582 b.PY -Modifikation 1
Wählen Sie DFC0295 b.PY -Modifikation 2
# Rebase 952244a… DFC0295 auf 952244a (3 Befehl (en))
#
# Befehle:
# P, pick = Verwenden Sie Commit
# R, Reword = Verwenden Sie Commit, aber bearbeiten Sie die Commit -Nachricht
# e, edit = verwenden
# S, Squash = Verwenden Sie Commit, aber verschmelzen Sie in den vorherigen Commit
# f, fixup = wie "squash", aber verwerfen Sie die Protokollnachricht dieses Commits
# x, exec = runbefehl (der Rest der Zeile) mit Shell
#
# Diese Zeilen können neu bestellt werden; Sie werden von oben nach unten ausgeführt.
#
# Wenn Sie hier eine Linie entfernen, die das Vergehen verloren geht.
#
# Wenn Sie jedoch alles entfernen, wird die Rebase abgebrochen.
#
# Beachten Sie, dass leere Commits ausgezeichnet werden
~

Die Commits sind chronologisch von den frühesten bis zum neuesten an der Spitze aufgeführt. Sie können auswählen, welches Verpflichtung für „auswählen“ und welche für den Squash verpflichtet sind. Der Einfachheit halber werden wir den ersten Commit auswählen und den Rest hineinquetschen. Wir werden den Text so ändern:

Wählen Sie 7A62538 hinzu b.py
Squash CE9E582 b.PY -Modifikation 1
Squash DFC0295 b.PY -Modifikation 2
# Rebase 952244a… DFC0295 auf 952244a (3 Befehl (en))
#
# Befehle:
# P, pick = Verwenden Sie Commit
# R, Reword = Verwenden Sie Commit, aber bearbeiten Sie die Commit -Nachricht
# e, edit = verwenden
# S, Squash = Verwenden Sie Commit, aber verschmelzen Sie in den vorherigen Commit
# f, fixup = wie "squash", aber verwerfen Sie die Protokollnachricht dieses Commits
# x, exec = runbefehl (der Rest der Zeile) mit Shell
#
# Diese Zeilen können neu bestellt werden; Sie werden von oben nach unten ausgeführt.
#
# Wenn Sie hier eine Linie entfernen, die das Vergehen verloren geht.
#
# Wenn Sie jedoch alles entfernen, wird die Rebase abgebrochen.
#
# Beachten Sie, dass leere Commits ausgezeichnet werden

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

# Dies ist eine Kombination von 3 Commits.
# Die Botschaft des ersten Ausschusses lautet:
Hinzugefügt b.py
# Dies ist die 2. Commit -Nachricht:
B.PY -Modifikation 1
# Dies ist die 3. Commit -Nachricht:
B.PY -Modifikation 2
# Bitte geben Sie die Commit -Nachricht für Ihre Änderungen ein. Zeilen beginnen
# mit '#' wird ignoriert und eine leere Nachricht abbricht das Commit ab.
#
# Datum: Fri 30. März 21:09:43 2018 -0700
#
# in Arbeit rebase; auf 952244a
# Sie bearbeiten derzeit ein Commit, während Sie den Zweig -Master in '952244a' wiederherstellen.
#
# Änderungen zu verpflichten:
# neue Datei: b.py
#

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

$ git rebase -i Kopf ~ 3
[Abnahmem Kopf 0798991] hinzugefügt B.py
Datum: Fr. 30. März 21:09:43 2018 -0700
1 Datei geändert, 1 Einfügung (+)
Erstellen Sie den Modus 100644 B.py
Erfolgreich umgebaut und aktualisiert Refs/Heads/Master.

Wenn Sie jetzt die Commit -Geschichte überprüfen:

$ git log --oneline --graph -dekorieren
* 0798991 (Kopf -> Master) hinzugefügt B.py
* 952244a fügte a hinzu.py

Alle Commits für B.PY wurde in einen Commit zusammengedrückt. Sie können überprüfen, indem Sie sich das B ansehen.PY -Datei:

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

Es hat den Inhalt der Modifikation 2.

Abschluss

Die 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 Konflikte und Verwirrung verursachen kann. Verwenden Sie es nur für Ihr eigenes lokales Repository.

Weiteres Studium:

  • https: // git-scm.com/docs/git-rebase
  • https: // git-scm.com/book/en/v2/git-branchieren
  • https: // git-scm.com/book/en/v2/git-tools-brewriting-history