Git Squash erklärt

Was ist Git Squash?

Eines der Dinge, die Entwickler häufig über ihre Pull-Anfragen hören, ist so etwas wie "Das sieht für mich gut aus, bitte quetschen und zusammenführen". Der lustige Teil ist, dass es keinen solchen Befehl gibt git squash(es sei denn, Sie erstellen einen Alias ​​dafür).

Das squashAbrufen von Anforderungen bedeutet üblicherweise, alle Commits in dieser Anforderung in eine (selten auf eine andere Zahl) zu komprimieren, um sie präziser und lesbarer zu gestalten und den Verlauf des Hauptzweigs nicht zu verschmutzen. Um dies zu erreichen, muss ein Entwickler den interaktiven Modus des Git Rebase-Befehls verwenden.

Sehr oft, wenn Sie eine neue Funktion entwickeln, kommt es in Ihrem Verlauf zu mehreren zeitweiligen Commits - schließlich entwickeln Sie sich schrittweise. Dies können nur einige Tippfehler oder Schritte zur endgültigen Lösung sein. In den meisten Fällen ist es sinnlos, alle diese Commits in der endgültigen öffentlichen Version Ihres Codes zu haben. Daher ist es vorteilhafter, alle in eine, eine und eine endgültige Version zu komprimieren.

Nehmen wir also an, Sie haben das folgende Festschreibungsprotokoll in dem Zweig, den Sie als Teil der Pull-Anforderung zusammenführen möchten:

$ git log --pretty=oneline --abbrev-commit 30374054 Add Jupyter Notebook stub to Data Science Tools 8490f5fc Minor formatting and Punctuation changes 3233cb21 Prototype for Notebook page

Natürlich würden wir es vorziehen, hier nur ein Commit zu haben, da es keinen Vorteil hat zu wissen, was wir mit dem Schreiben begonnen haben und welche Tippfehler wir dort später behoben haben. Nur das Endergebnis ist wichtig.

Wir starten also eine interaktive Rebase-Sitzung vom aktuellen HEAD (Commit 30374054 ) zum Commit 3233cb21 mit der Absicht, die drei neuesten Commits zu einem zu kombinieren :

$ git rebase -i HEAD~3

Dadurch wird ein Editor mit folgenden Funktionen geöffnet:

pick 3233cb21 Prototype for Notebook page pick 8490f5fc Minor formatting and Punctuation changes pick 30374054 Add Jupyter Notebook to Data Science Tools # Rebase # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out

Wie immer gibt Git uns eine sehr nette Hilfemeldung, in der Sie die squashOption sehen können, nach der wir suchen.

Derzeit sagen die Anweisungen für die interaktive Neubasis zu pickjedem angegebenen Commit und behalten die entsprechende Commit-Nachricht bei. Das heißt - nichts ändern. Aber wir wollen am Ende nur ein Commit haben.

Sie können also einfach den Text in Ihrem Editor bearbeiten und pickdurch squash(oder nur s) das nächste Commit ersetzen , das wir entfernen möchten, und den Editor speichern / beenden. Das könnte so aussehen:

s 3233cb21 Prototype for Notebook page s 8490f5fc Minor formatting and Punctuation changes pick 30374054 Add Jupyter Notebook to Data Science Tools

Wenn Sie Ihren Editor nach dem Speichern dieser Änderung schließen, wird er sofort wieder geöffnet und schlägt vor, diese Festschreibungsnachrichten auszuwählen und neu zu formulieren. Etwas wie das:

# This is a combination of 3 commits. # The first commit's message is: Prototype for Notebook page # This is the 2nd commit message: Minor formatting and Punctuation changes # This is the 3rd commit message: Add Jupyter Notebook to Data Science Tools # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit.

Zu diesem Zeitpunkt können Sie alle Nachrichten löschen, die nicht in die endgültige Festschreibungsversion aufgenommen werden sollen. Sie können sie auch umformulieren oder einfach eine Commit-Nachricht von Grund auf neu schreiben.

Denken Sie daran, dass die neue Version alle Zeilen enthält, die nicht mit dem #Zeichen beginnen. Speichern und beenden Sie Ihren Editor erneut.

Ihr Terminal sollte jetzt eine Erfolgsmeldung enthalten, einschließlich, Successfully rebased and updated und das Git-Protokoll sollte einen schönen und komprimierten Verlauf mit nur einem Commit anzeigen. Alle zwischengeschalteten Verpflichtungen sind weg und wir sind bereit zu fusionieren!

Warnung vor Nichtübereinstimmung des lokalen und Remote-Commit-Verlaufs

Dieser Vorgang ist etwas gefährlich, wenn Sie Ihren Zweig bereits in einem Remote-Repository veröffentlicht haben - Sie ändern schließlich den Commit-Verlauf. Daher ist es am besten, die Squash-Operation in einem lokalen Zweig durchzuführen, bevor Sie pushen .

Manchmal wird es bereits gepusht - wie würden Sie schließlich eine Pull-Anfrage erstellen? In diesem Fall werden Sie müssen erzwingen , die Änderungen auf dem Remote - Zweig nach dem Quetschen tun, da Ihre lokale Geschichte und Niederlassung Geschichte im Remote - Repository sind unterschiedlich:

$ git push origin +my-branch-name

Geben Sie Ihr Bestes, um sicherzustellen, dass Sie zu diesem Zeitpunkt der einzige sind, der diesen Remote-Zweig verwendet, oder Sie erschweren das Leben des anderen Entwicklers, wenn der Verlauf nicht übereinstimmt. Aber da das Quetschen normalerweise als letzte Operation an einem Ast durchgeführt wird, bevor es entfernt wird, ist es normalerweise kein so großes Problem .