Ich mache einen neuen Zweig aus master
:
git checkout -b testbranch
Ich mache 20 Commits.
Jetzt möchte ich diese 20 Commits zerquetschen. Ich mache das mit:
git rebase -i HEAD~20
Was ist, wenn ich nicht weiß, wie viele Commits? Gibt es eine Möglichkeit, etwas zu tun wie:
git rebase -i all on this branch
git
version-control
user3803850
quelle
quelle
git rebase -i 58333012713fc168bd70ad00d191b3bdc601fa2d
eine interaktive Rebase durchführen, bei der die Commit-Nummer die letzte Commit ist, die unverändertAntworten:
Eine andere Möglichkeit, alle Ihre Commits zu quetschen, besteht darin, den Index auf master zurückzusetzen:
Dies ist nicht perfekt, da Sie wissen, aus welcher Branche "yourBranch" stammt.
Hinweis: Das Finden dieses Ursprungszweigs ist mit Git nicht einfach / möglich (der visuelle Weg ist oft der einfachste , wie hier gezeigt ).
BEARBEITEN: Sie müssen verwenden
git push --force
Karlotcha Hoa fügt in den Kommentaren hinzu :
quelle
YourBranch
gerade ist. Dies wirdYourBranch
intakt bleiben, wenn Sie dies tunreset
git reset $(git merge-base master $(git rev-parse --abbrev-ref HEAD))
den Zweig, in dem Sie sich gerade befinden, automatisch verwenden. Und wenn Sie das verwenden, können Sie auch einen Alias verwenden, da der Befehl nicht vom Zweignamen abhängt.git push --force
(und warnen Ihre Kollegen, wenn Sie mehrere Personen sind, die an diesem Zweig arbeiten)Überprüfen Sie den Zweig, für den Sie alle Commits in einem Commit zusammenfassen möchten. Sagen wir, es heißt ,
feature_branch
.git checkout feature_branch
Schritt 1:
Führen Sie einen Soft-Reset
origin/feature_branch
mit Ihrer lokalenmaster
Niederlassung durch (je nach Bedarf können Sie auch mit origin / master zurücksetzen). Dadurch werden alle zusätzlichen Commits in Ihrem System zurückgesetztfeature_branch
, ohne dass Änderungen an Ihren Dateien lokal vorgenommen werden müssen.git reset --soft master
Schritt 2:
Fügen Sie alle Änderungen in Ihrem Git-Repo-Verzeichnis zu dem neuen Commit hinzu, das erstellt werden soll. Und begehen Sie dasselbe mit einer Nachricht.
git add -A && git commit -m "commit message goes here"
quelle
-f
Flag an Ihren Remote-Zweig senden.Was Sie tun, ist ziemlich fehleranfällig. Mach einfach:
Dadurch werden automatisch nur die Commits Ihrer Zweigstelle auf den aktuell neuesten Master zurückgesetzt.
quelle
commit -am "the whole thing!"
reset origin/master
Methode ist wirklich schlecht, da sie genauso ist wie das Festschreiben direkt auf dem Master - es gibt keinen "Merge Branch" -Historie, keine Pull-Request-Option. Die Antwort von @WaZaA entspricht meiner Meinung nach viel mehr dem normalen Git-WorkflowEine andere einfache Möglichkeit, dies zu tun: Gehen Sie zum Ursprungszweig und führen Sie a aus
merge --squash
. Dieser Befehl führt das "gequetschte" Commit nicht aus. Wenn Sie dies tun, werden alle Festschreibungsnachrichten Ihrer Branche gesammelt.quelle
Angenommen, Sie haben vom Master verzweigt, müssen Sie nicht immer
yourBranch
in den Reset-Schritt eintreten :Erklärung :
git rev-list --count HEAD ^master
zählt die Commits, seit Sie Ihren Feature-Zweig vom Master aus erstellt haben, z. 20.git reset --soft HEAD~20
führt einen Soft-Reset der letzten 20 Commits durch. Dadurch bleiben Ihre Änderungen in den Dateien, die Commits werden jedoch entfernt.Verwendung :
In meinem .bash_profile habe ich einen Alias hinzugefügt
gisquash
, um dies mit einem Befehl zu tun:Nach dem Zurücksetzen und Festschreiben müssen Sie eine
git push --force
.Hinweis :
Wenn Sie Gitlab> = 11.0 verwenden, müssen Sie dies nicht mehr tun, da es beim Zusammenführen von Zweigen eine Squashing-Option bietet .
quelle
Basierend auf dem Lesen mehrerer Stackoverflow-Fragen und Antworten zum Squashing denke ich, dass dies ein guter Einzeiler ist, um alle Commits in einem Zweig zu quetschen:
Dies setzt voraus, dass der Master der Basiszweig ist.
quelle
Lösung für Leute, die lieber klicken:
Sourcetree installieren (kostenlos)
Überprüfen Sie, wie Ihre Commits aussehen. Höchstwahrscheinlich haben Sie etwas Ähnliches
Klicken Sie mit der rechten Maustaste auf das übergeordnete Commit. In unserem Fall handelt es sich um eine Hauptniederlassung.
Sie können das Commit mit dem vorherigen quetschen, indem Sie auf eine Schaltfläche klicken. In unserem Fall müssen wir 2 mal klicken. Sie können auch die Festschreibungsnachricht ändern
Die Ergebnisse sind fantastisch und wir sind bereit zu pushen!
Randnotiz: Wenn Sie Ihre Teil-Commits auf die Fernbedienung übertragen haben, müssen Sie nach dem Squash Force Push anwenden
quelle
Eine andere Lösung wäre, alle Festschreibungsprotokolle in einer Datei zu speichern
git log> branch.log
Jetzt hat branch.log alle Commit-IDs von Anfang an. Scrollen Sie nach unten und nehmen Sie das erste Commit (dies wird im Terminal schwierig sein) mit dem ersten Commit
git reset --soft
Alle Commits werden gequetscht
quelle
Git-Reset ist, wie in vielen Antworten bereits erwähnt, bei weitem der beste und einfachste Weg, um das zu erreichen, was Sie wollen. Ich benutze es im folgenden Workflow:
(auf Entwicklungszweig)
quelle
All dieses Git-Reset, hart, weich und alles andere, was hier erwähnt wird, funktioniert wahrscheinlich (es hat bei mir nicht funktioniert), wenn Sie die Schritte richtig machen und eine Art Geist.
Wenn Sie der durchschnittliche Joe Smo sind, versuchen Sie Folgendes :
Wie verwende ich Git Merge --squash?
Ich habe mein Leben gerettet und werde mein Squash sein. Ich habe es 4 Mal benutzt, seit ich davon erfahren habe. Einfach, sauber und im Grunde 1 comamnd. Kurz gesagt:
Wenn Sie sich in einem Zweig befinden, nennen Sie ihn "my_new_feature" off "Entwickeln" und Ihre Pull-Anfrage hat 35 Commits (oder wie viele auch immer) und Sie möchten, dass es 1 ist.
A. Stellen Sie sicher, dass Ihr Zweig auf dem neuesten Stand ist. Fahren Sie fort Entwickeln Sie, erhalten Sie die neuesten Informationen und führen Sie Konflikte mit "my_new_feature" zusammen und lösen Sie sie
(diesen Schritt sollten Sie wirklich so schnell wie möglich
ausführen ). B. Holen Sie sich die neuesten Entwicklungen und verzweigen Sie in einen neuen Zweig, nennen Sie ihn "my_new_feature_squashed".
C. Magie ist hier.
Sie möchten Ihre Arbeit von "my_new_feature" zu "my_new_feature_squashed" bringen. Gehen Sie
also einfach vor (während Sie in Ihrem neuen Zweig die Entwicklung erstellt haben):
git merge --squash my_new_feature
Alle Ihre Änderungen befinden sich jetzt in Ihrer neuen Niederlassung. Testen Sie sie einfach. Führen Sie dann einfach 1 Commit, Push und neue PR für diese Niederlassung durch - und warten Sie auf die Wiederholung am nächsten Tag.
Liebst du nicht das Codieren? :) :)
quelle
Sie können das Tool verwenden, das ich speziell für diese Aufgabe erstellt habe:
https://github.com/sheerun/git-squash
Grundsätzlich müssen Sie anrufen
git squash master
und Sie sind fertigquelle