Der Rebase-Befehl bietet einige fantastische Optionen im --interactive
(oder -i
) Modus, und eine der am häufigsten verwendeten ist die Fähigkeit, Commits zu quetschen. Dies führt dazu, dass kleinere Commits zu größeren zusammengefasst werden. Dies kann hilfreich sein, wenn Sie die Arbeit des Tages abschließen oder Ihre Änderungen nur anders verpacken möchten. Wir werden darüber nachdenken, wie Sie dies einfach tun können.
Ein Wort der Vorsicht: Tun Sie dies nur bei Commits, die nicht in ein externes Repository verschoben wurden. Wenn andere auf den Commits basieren, die Sie löschen möchten, können viele Konflikte auftreten. Schreiben Sie Ihren Verlauf nur nicht neu, wenn er mit anderen geteilt wurde.
Nehmen wir also an, Sie haben gerade ein paar kleine Commits gemacht und möchten daraus ein größeres Commit machen. Die Geschichte unseres Repositorys sieht derzeit folgendermaßen aus:
Die letzten 4 Commits wären viel glücklicher, wenn sie zusammengepackt würden. Lassen Sie uns genau das durch interaktives Rebasing tun:
$ git rebase -i HEAD~4
pick 01d1124 Adding license
pick 6340aaa Moving license into its own file
pick ebfd367 Jekyll has become self-aware.
pick 30e0ccb Changed the tagline in the binary, too.
# Rebase 60709da..30e0ccb onto 60709da
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
Hier sind also ein paar Dinge passiert. Zuerst sagte ich Git, dass ich mit den letzten vier Commits, von denen aus sich HEAD mit HEAD ~ 4 befindet, eine Rebase erstellen wollte. Git hat mich jetzt in einen Editor mit dem obigen Text und einer kleinen Erklärung dessen, was getan werden kann, versetzt. Auf diesem Bildschirm stehen Ihnen zahlreiche Optionen zur Verfügung, aber im Moment werden wir nur alles in einem Commit zusammenfassen. Wenn Sie also die ersten vier Zeilen der Datei in diese ändern, reicht dies aus:
pick 01d1124 Adding license
squash 6340aaa Moving license into its own file
squash ebfd367 Jekyll has become self-aware.
squash 30e0ccb Changed the tagline in the binary, too.
Grundsätzlich weist dies Git an, alle vier Commits zum ersten Commit in der Liste zu kombinieren. Sobald dies erledigt und gespeichert ist, wird ein anderer Editor mit den folgenden Optionen angezeigt:
# This is a combination of 4 commits.
# The first commit's message is:
Adding license
# This is the 2nd commit message:
Moving license into its own file
# This is the 3rd commit message:
Jekyll has become self-aware.
# This is the 4th commit message:
Changed the tagline in the binary, too.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# Explicit paths specified without -i nor -o; assuming --only paths...
# Not currently on any branch.
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: LICENSE
# modified: README.textile
# modified: Rakefile
# modified: bin/jekyll
#
Da wir so viele Commits kombinieren, können Sie mit Git die Nachricht des neuen Commits basierend auf den übrigen am Prozess beteiligten Commits ändern. Bearbeiten Sie die Nachricht nach Belieben, speichern Sie sie und beenden Sie sie. Sobald dies erledigt ist, wurden Ihre Commits erfolgreich gequetscht!
Created commit 0fc4eea: Creating license file, and making jekyll self-aware.
4 files changed, 27 insertions(+), 30 deletions(-)
create mode 100644 LICENSE
Successfully rebased and updated refs/heads/master.
Und wenn wir uns die Geschichte noch einmal ansehen ...
Das war bisher relativ schmerzlos. Wenn Sie während der Rebase auf Konflikte stoßen, sind diese normalerweise recht einfach zu lösen und Git führt Sie so weit wie möglich durch. Die Grundlagen hierfür sind, den fraglichen Konflikt, git add
die Datei, zu beheben und dann git rebase --continue
den Vorgang fortzusetzen. git rebase --abort
Wenn Sie a ausführen, kehren Sie natürlich zu Ihrem vorherigen Zustand zurück, wenn Sie möchten. Wenn Sie aus irgendeinem Grund ein Commit in der Rebase verloren haben, können Sie das Reflog verwenden, um es zurückzubekommen.
Details finden Sie unter diesem Link .