516 Stimmen

Kombinieren mehrerer Übertragungen vor der Übertragung in Git

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.

792voto

Leopd Punkte 39216

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.

133voto

Noich Punkte 13161

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

57voto

vikas027 Punkte 4402

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

36voto

Justin Weiss Punkte 1108

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.

20voto

ruediste Punkte 1948

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)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X