Ich habe eine Reihe von Commits in meinem lokalen Repository, die thematisch ähnlich sind. Ich möchte sie zu einem einzigen Commit zusammenfassen, bevor ich sie in ein entferntes Repository hochlade. Wie kann ich das tun? Ich denke rebase
tut dies, aber ich kann mir keinen Reim auf die Unterlagen machen.
Antworten
Zu viele Anzeigen?Was Sie tun wollen, wird in Git als "Squashing" bezeichnet. Es gibt viele Optionen, wenn Sie dies tun (zu viele?), aber wenn Sie nur alle Ihre nicht gepushten Commits in einen einzigen Commit zusammenführen wollen, tun Sie dies:
git rebase -i origin/master
Daraufhin wird Ihr Texteditor ( -i
steht für "interaktiv") mit einer Datei, die wie folgt aussieht:
pick 16b5fcc Code in, tests not passing
pick c964dea Getting closer
pick 06cf8ee Something changed
pick 396b4a3 Tests pass
pick 9be7fdb Better comments
pick 7dba9cb All done
Ändern Sie alle pick
a squash
(o s
) mit Ausnahme des ersten:
pick 16b5fcc Code in, tests not passing
squash c964dea Getting closer
squash 06cf8ee Something changed
squash 396b4a3 Tests pass
squash 9be7fdb Better comments
squash 7dba9cb All done
Speichern Sie Ihre Datei und beenden Sie Ihren Editor. Dann öffnet sich ein weiterer Texteditor, mit dem Sie die Commit-Nachrichten aller Commits zu einer großen Commit-Nachricht zusammenfassen können.
Voilà! Wenn Sie nach "git squashing" googeln, erhalten Sie Erklärungen zu allen anderen verfügbaren Optionen.
Wenn Sie eine Lose von Übertragungen und Sie wollen nur die letzten X Übertragungen unterdrücken, suchen Sie die Übertragungs-ID der Übertragung, mit der Sie beginnen wollen, und machen Sie
git rebase -i <that_commit_id>
Gehen Sie dann wie in der Antwort von leopd beschrieben vor und ändern Sie alle pick
s zu squash
außer dem ersten.
Beispiel :
871adf OK, feature Z is fully implemented --- newer commit --
0c3317 Whoops, not yet... |
87871a I'm ready! |
643d0e Code cleanup |-- Join these into one
afb581 Fix this and that |
4e9baa Cool implementation |
d94e78 Prepare the workbench for feature Z -------------------
6394dc Feature Y --- older commit
Sie können dies entweder tun (die Anzahl der Übertragungen angeben):
git rebase --interactive HEAD~[7]
Oder so (schreiben Sie den Hash der letzten Übertragung, die Sie nicht zerquetschen wollen):
git rebase --interactive 6394dc
Es gibt eine ganze Reihe funktionierender Antworten, aber ich fand diese hier am einfachsten. Dieser Befehl öffnet einen Editor, in dem Sie einfach die folgende Zeile ersetzen können pick
con squash
um sie zu entfernen/zu verschmelzen
git rebase -i HEAD~4
wo, 4
ist die Anzahl der Übertragungen, die Sie zu einer einzigen zusammenfassen wollen. Dies wird erklärt aquí auch.
Wenn Sie auf der Suche sind nach squash
die Commits, die auch den allerersten Commit enthalten, dann verwenden Sie diesen Befehl
git rebase -i --root
Sie können dies tun mit git rebase -i
und geben Sie die Revision an, die Sie als "Root" verwenden wollen:
git rebase -i origin/master
öffnet ein Editorfenster, das alle Übertragungen anzeigt, die Sie nach der letzten Übertragung in origin/master
. Sie können Commits ablehnen, Commits zu einem einzigen Commit zusammenfassen oder vorherige Commits bearbeiten.
Es gibt einige Ressourcen, die dies wahrscheinlich besser erklären und einige andere Beispiele zeigen können:
http://book.git-scm.com/4_interactive_rebasing.html
y
http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html
sind die ersten beiden guten Seiten, die ich finden konnte.
Ich habe mir Folgendes ausgedacht
#!/bin/sh
message=`git log --format=%B origin..HEAD | sort | uniq | grep -v '^$'`
git reset --soft origin
git commit -m "$message"
Kombiniert, sortiert, vereinheitlicht und entfernt leere Zeilen aus der Commit-Nachricht. Ich verwende dies für lokale Änderungen an einem Github-Wiki (mit Gollum)
- See previous answers
- Weitere Antworten anzeigen