„Bitte rebase auf Master und wir werden Ihre Pull-Anfrage zusammenführen“.
“ Können Sie bitte Ihre Commits zusammendrücken, damit wir eine saubere, reversible Githistory erhalten?”.
“ Können Sie die Nachricht Ihres Commits umschreiben, um das Problem, das es löst, und wie es es löst, besser zu beschreiben?”.
Fragen wie diese werden Häufig gefragt, in pull-Anforderungen. Mal sehen, warum sieexistieren, wie man sie ausführt und ihre möglichen Probleme.,
Reword die letzte Commit-Nachricht
Eine der einfachsten Geschichte umschreibt wir mit git tun können, ist die lastcommit Nachricht ändern. Nehmen wir an, direkt nach einem Commit finden Sie einen Tippfehler in itsdescription, oder Sie finden eine bessere Möglichkeit, das Änderungsset zu beschreiben. Um die Korrektur durchzuführen, führen Sie Folgendes aus:
git commit --amend
Es wird ein Editormit der letzten Commit-Nachricht geöffnet, sodass Sie sie ändern können. Nach dem Speichern ein neues Commitwird mit den gleichen Änderungen und der neuen Nachricht erstellt und ersetzt das Commitmitmit der vorherigen Nachricht.,
Dies kann nützlich sein, um Dateien, die Sie vergessen haben, zu verfolgen, oder includemodifications, um die Dateien, die Sie gerade verpflichtet. Um dies zu tun, können Sie die Änderungen hinzufügenund dann die Änderung durchführen:
git add README.md config/routes.rb git rm notes.txt git commit --amend
Abgesehen von der Bearbeitung der Commit-Nachricht enthält das neue Commit die Änderungspezifiziert mit git add
und git rm
. Sie können auch den Autor bearbeiten. Forexample:
git commit --amend --author="Tute Costa and Dan Croak <[email protected]>"
Achievement Unlocked!, Sie können jetzt das letzte Commit Ihres Repositorys ändern, um neuere Änderungen an den Dateien aufzunehmen und / oder die Commit-Nachricht zu verbessern. Aber fange nicht an, All-the-Things zu ändern, bevor du den letzten Abschnitt dieses Blogbeitrags mit dem Titel „GEFAHR“verstehst.
Umformulieren anderen commit-Nachrichten
lieben Würde, darüber zu sprechen, aber wir müssen verstehen, mehr generaltool vor. Stay tuned! Alles andere wird einfacher, sobald wir darüber gelesen haben…
Interaktive Rebase
git rebase
wendet Commits einzeln in der Reihenfolge von Ihrem aktuellen Zweig auf einen anderen an., Es akzeptiert mehrere Optionenund Parameter, das ist also eine Spitze des Eisbergs Erklärung, genug, um thegap zwischen StackOverflow oder GitHub Kommentare und die git Man Pages zu überbrücken.
Eine interessante Option, die es akzeptiert, ist --interactive
(-i
kurz gesagt), die einen Editor mit einer Liste der Commits öffnet, die geändert werden sollen. Thislist akzeptiert Befehle, mit denen der Benutzer die Liste bearbeiten kann, bevor er die Aktion initiiert.
Sehen wir uns ein Beispiel an.,
Reword andere Commit-Nachrichten, nehmen Sie 2
Nehmen wir an, ich möchte einen der letzten 4 Commits dieses Blogs Reword. Ich führe danngit rebase -i HEAD~4
, und hier ist, was ich sehe:
Wir sehen die vier letzten Commits, von älter zu neuer. Siehe den Kommentar unter der Liste der Commits? Gute Arbeit zu erklären, git! pick
(p
kurz) ist die defaultaction. In diesem Fall würde es das Commit so wie es ist erneut anwenden, keine Änderungen in itscontents oder message. Das Speichern (und Ausführen) dieser Datei würde keine Änderungen am Repository vornehmen.,
Wenn ich reword
(r
kurz gesagt) in einem Commit sage, das ich bearbeiten möchte:
pick 07c5abd Introduce OpenPGP and teach basic usage pick de9b1eb Fix PostChecker::Post#urls r 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend
Wenn ich den Editor speichere und beende, folgt git den beschriebenen Befehlen und landetmyself erneut in den Editor, als ob ich commit 3e7ee36
. Ich bearbeite Thatcommit-Nachricht, speichere und beende den Editor, und hier ist die Ausgabe:
Jetzt sagt Caleb in seiner Commit-Nachricht „Stop all the Highlighting“, ob du ein Kind bist oder nicht.
Leistung freigeschaltet! Sie können jetzt die gewünschte Nachricht von anycommit ändern., Sie können dies tun, stellen Sie einfach sicher, dass Sie den Abschnitt „GEFAHR“verstehen.
Squash commits together
Zwei weitere Befehle, die rebase interactive uns anbietet, sind:
-
squash
(s
kurz), die das Commit in das vorherige (das erste in der Zeile zuvor) -
fixup
(f
kurz), das sich wie „squash“ verhält, aber die Nachricht
dieses Commits verwirft Wir werden weiterhin an dem Rebase-Beispiel arbeiten, an dem wir gearbeitet habenbefore., Wir hatten vier Commits, meine eigenen für diesen Blogbeitrag, unddrei andere von Caleb, die mit seinem vorherigen Beitrag auf PGP verwandt waren:
pick 07c5abd Introduce OpenPGP and teach basic usage pick de9b1eb Fix PostChecker::Post#urls pick 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend
Nehmen wir an, ich möchte Calebs Commits zusammenfügen, weil sie zu thesame logical changeset gehören, und so können wir git revert
es leicht, wenn wir feststellen, dass weprefer diese Änderungen nicht in diesem Repository hat. Wir möchten die erste Commit-Nachricht beibehalten und die beiden nachfolgenden Commits in die previousone., Ich ändere pick
gegebenenfalls in squash
:
pick 07c5abd Introduce OpenPGP and teach basic usage s de9b1eb Fix PostChecker::Post#urls s 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend
Speichern und lande im Editor, um die Commit-Nachricht der Meldedthree-Commits zu bestimmen (siehe, wie sie nacheinander verkettet werden):
# This is a combination of 3 commits. # The first commit's message is: Introduce OpenPGP and teach basic usage Besides demystifying a relatively complex tool, protocol, and etiquette, this post is intended to help with problems such as the one outlined in this tweet: > Emailed sensitive info to someone with PGP. They replied, with my > original email, all in clear text. They didn't realize it. # This is the 2nd commit message: Fix PostChecker::Post#urls # This is the 3rd commit message: Hey kids, stop all the highlighting # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Author: Caleb Hearth # Date: Tue Sep 2 09:39:07 2014 -0500 # # rebase in progress; onto 71d4789 # You are currently editing a commit while rebasing branch 'tc-git-rebase' on '71d4789'.
Ich entscheide mich, die dritte Commit-Nachricht zu entfernen und dieser zweiten Commit-Nachricht eine relevantere Notiz hinzuzufügen. Speichern Sie den Editor, und die vier Commits wurden transformiertin zwei: die von Caleb und meine danach. Gut!,
Wir hätten den Befehl fixup
verwenden können, wenn wir zuvor gesehen hätten, dass wir dieänderungen, aber nicht die Commit-Nachricht des dritten Commits. In diesem Fall hätte thecommands wie folgt ausgesehen:
pick 07c5abd Introduce OpenPGP and teach basic usage s de9b1eb Fix PostChecker::Post#urls f 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend
Beim Speichern hätte der Editor die dritte Commit-Nachricht bereits mitgeliefertkommentiert für uns:
Speichern und Ausgaben:
Das Ergebnis ist das gleiche: 2 Commits anstelle von 4 mit jeweils einem einzelnen Blogpost.
Leistung freigeschaltet! Sie können jetzt Commits zusammenführen. Achte wie immer auf den Gefahrenbereich.,
Rebase auf Master
Wir verzweigen eine Open-Source-Bibliothek, beginnen mit der Arbeit an einem Feature-Zweig und Master inDas Upstream-Projekt geht voran. Unser Verlauf sieht folgendermaßen aus:
A---B---C feature / D---E---F---G upstream/master
Der Bibliotheksbetreuer fragt nach“ rebase on top of master“, sodass wir alle Mergeconflicts beheben, die zwischen beiden Zweigen auftreten können, und unser Änderungsset zusammenhalten.Der Betreuer möchte einen Verlauf wie sehen:
A'--B'--C' feature / D---E---F---G upstream/master
Wir möchten unsere Commits einzeln nacheinander auf upstream ‚ s Master anwenden.,Klingt wie die Beschreibung des Rebase-Befehls! Mal sehen, welche Befehle uns in das gewünschte Szenario führen würden:
# Point our `upstream` remote to the original fork git remote add upstream https://github.com/thoughtbot/factory_girl.git # Fetch latest commits from `upstream` (the original fork) git fetch upstream # Checkout our feature branch git checkout feature # Reapply it onto upstream's master git rebase upstream/master # Fix conflicts, then `git rebase --continue`, repeat until done # Push to our fork git push --force origin feature
nlocked! Ihr Feature-Zweig wird oben auf den neuesten Master der ursprünglichen Gabel angewendet.
Und so kommen wir zu…
GEFAHR: Sie schreiben den Verlauf
Siehe --force
im letztengit push
Befehl? Das heißt, wir überschreiben die Geschichte von repository., Dies ist bei Commits, die wir nicht mit anderen Teammitgliedern teilen, oder in Zweigen, die uns gehören, immer sicher (siehe meine Initialen im Beispiel dieses Blogbeitrags).
Wenn Sie jedoch Push-Editionen erzwingen, die bereits für das Team freigegeben wurden (Commits, die außerhalb meines Repositorys vorhanden sind, wie die Änderungen, die ich an den PGP-Commits vorgenommen habe, die bereits freigegeben wurden), ist der Zweig aller nicht mehr synchron.
Das Umschreiben des Verlaufs bedeutet, bestehende Commits aufzugeben und neue Commits zu erstellen, die zwar sehr ähnlich sind, aber unterschiedlich sind., Wenn andere auf Ihren vorherigen Commits arbeiten und Sie dann Ihre Commits umschreiben und erzwingen, müssen Ihre Teammitgliedswill ihre Arbeit neu zusammenführen (wenn sie den potenziellen Verlust bemerken).
Bei thoughtbot setzen wir unseren Zweigen unsere Initialen voran und signalisieren, dass thosecommits möglicherweise neu geschrieben werden und andere dem Zweig keine Commits hinzufügen sollten. Whenthose begeht land in den master oder einen gemeinsamen Zweig wir nie schreiben Sie Sie erneut.
Schreiben Sie also den Git-Verlauf neu, vorausgesetzt, umgeschriebene Commits existieren nur in yourrepository, oder Sie und Ihr Team wissen, dass niemand sonst jemals von diesem funktionieren sollte.,
Leistung freigeschaltet! Sie wissen jetzt, wie man rebase, während Sie agood Bürger.