Dies gibt eine gute Erklärung für das Quetschen mehrerer Commits:
http://git-scm.com/book/en/Git-Branching-Rebasing
Es funktioniert jedoch nicht für Commits, die bereits gepusht wurden. Wie quetsche ich die letzten Commits sowohl in meinen lokalen als auch in meinen Remote-Repos?
BEARBEITEN: Wenn ich das tue git rebase -i origin/master~4 master
, behalte den ersten als pick
, setze die anderen drei als squash
und beende dann (über cx cc in emacs), ich bekomme:
$ git rebase -i origin/master~4 master
# Not currently on any branch.
nothing to commit (working directory clean)
Could not apply 2f40e2c... Revert "issue 4427: bpf device permission change option added"
$ git rebase -i origin/master~4 master
Interactive rebase already started
Dabei ist 2f40 das pick
Commit. Und jetzt erscheint keines der 4 Commits in git log
. Ich habe erwartet, dass mein Editor neu gestartet wird, damit ich eine Commit-Nachricht eingeben kann. Was mache ich falsch?
git push --force origin master
git rebase -i origin/master
und tatsächlich wissen möchte, wie Commits weiter zurückgesetzt werden können, zgit rebase -i origin/master~20 master
.+
nur die Refspec, der ein Präfix vorangestellt ist.--force
wird erzwingen, dass alle Refspecs gedrückt werden. Bitte beachten Sie die aktualisierte Antwort.Auf einem Zweig konnte ich das so machen (für die letzten 4 Commits)
quelle
Kleiner Unterschied zur akzeptierten Antwort, aber ich hatte große Schwierigkeiten beim Quetschen und bekam es schließlich.
esc --> :wq
Drücken Sie auf die Fernbedienung mit:
quelle
Viele Probleme lassen sich nur dadurch verhindert werden , eine zu schaffen ,
branch
um die Arbeit an und nicht arbeitenmaster
:git checkout -b mybranch
Das Folgende funktioniert für
remote
bereits gepusste Commits und eine Mischung ausremote
geposteten Commits /local
nur Commits:Ich habe auch einige Pull-Request-Notizen, die hilfreich sein können.
quelle
git rebase -i master
Sie werden den Editor vm geöffnet und msgs so etwas
Hier habe ich die Auswahl für alle anderen Commits auf "f" geändert (steht für Fixup).
git push -f origin feature/feature-branch-name-xyz
Dadurch werden alle Commits für ein Commit korrigiert und alle anderen Commits entfernt. Ich habe das getan und es hat mir geholfen.
quelle
Wenn Sie mit einem Gitlab oder Github arbeiten, können Sie auf diese Weise Probleme bekommen. Sie quetschen Ihre Commits mit einer der oben genannten Methoden. Mein bevorzugter ist:
Wählen Sie Squash oder Fixup für Ihr Commit. An diesem Punkt würden Sie mit git Status überprüfen. Und die Nachricht könnte sein:
Und Sie können versucht sein, es zu ziehen. TUN SIE DAS NICHT, sonst befinden Sie sich in der gleichen Situation wie zuvor.
Drücken Sie stattdessen zu Ihrem Ursprung mit:
Mit + können Sie nur einen Zweig erzwingen.
quelle
Für das Quetschen von zwei Commits, von denen eines bereits verschoben wurde, auf einem einzelnen Zweig funktionierte Folgendes:
Standardmäßig enthält dies die Festschreibungsnachricht des neuesten Festschreibens als Kommentar zum älteren Festschreiben.
quelle
1)
git rebase -i HEAD~4
Um es näher zu erläutern: Es funktioniert in der aktuellen Branche. der KOPF ~ 4 bedeutet, die letzten vier Commits zu quetschen; interaktiver Modus (-i)
2) Zu diesem Zeitpunkt öffnete der Editor mit der Liste der Commits, um die zweiten und folgenden Commits zu ändern, indem er pick durch squash ersetzte und dann speicherte.
Ausgabe: Erfolgreich neu basiert und refs / Heads / Branch-Name aktualisiert.
3)
git push origin refs/heads/branch-name --force
Ausgabe:
quelle