Ich versuche, 2 Commits zu 1 zusammenzuführen, also habe ich "Squashing Commits mit Rebase" von git ready verfolgt .
ich rannte
git rebase --interactive HEAD~2
Im resultierenden Editor wechsle ich pick
zu squash
und speichere dann, aber die Rebase schlägt mit dem Fehler fehl
Ohne vorheriges Festschreiben kann nicht "gequetscht" werden
Nachdem mein Arbeitsbaum diesen Zustand erreicht hat, kann ich mich nicht mehr erholen.
Der Befehl git rebase --interactive HEAD~2
schlägt fehl mit:
Die interaktive Rebase wurde bereits gestartet
und git rebase --continue
scheitert mit
Ohne vorheriges Festschreiben kann nicht "gequetscht" werden
Antworten:
Zusammenfassung
Die Fehlermeldung
bedeutet, dass Sie wahrscheinlich versucht haben, "nach unten zu quetschen". Git zerquetscht ein neueres Commit immer in ein älteres Commit oder "aufwärts", wie in der interaktiven Rebase-Aufgabenliste angezeigt, dh in einem Commit in einer vorherigen Zeile. Wenn Sie den Befehl in der ersten Zeile Ihrer Aufgabenliste in ändern,
squash
wird immer dieser Fehler ausgegeben, da für das erste Commit nichts zum Squash vorhanden ist.Die Reparatur
Kommen Sie zuerst dorthin zurück, wo Sie angefangen haben
Sagen Sie, Ihre Geschichte ist
Das heißt, a war das erste Commit, dann b und schließlich c. Nachdem wir c festgelegt haben, beschließen wir, b und c zusammen zu quetschen:
(Hinweis: Beim Ausführen von
git log
Pipes wird die Ausgabeless
standardmäßig auf den meisten Plattformen in einen Pager geleitet . Um den Pager zu beenden und zur Eingabeaufforderung zurückzukehren, drücken Sie dieq
Taste.)Laufen
git rebase --interactive HEAD~2
gibt Ihnen einen Editor mit(Beachten Sie, dass diese Aufgabenliste im Vergleich zur Ausgabe von in umgekehrter Reihenfolge ist
git log
.)Ändern bs führt zum Fehler , den Sie gesehen haben, aber wenn Sie stattdessen c in b zerquetschen (neuere begeht in die älteren oder „Quetschen nach oben“) , indem Sie die To - do - Liste zu ändern , um
pick
squash
Wenn Sie Ihren Editor speichern, erhalten Sie einen anderen Editor, dessen Inhalt ist
Wenn Sie speichern und beenden, wird der Inhalt der bearbeiteten Datei zur Festschreibungsnachricht des neuen kombinierten Festschreibens:
Hinweis zum Umschreiben des Verlaufs
Interaktive Rebase schreibt den Verlauf neu. Der Versuch, auf eine Fernbedienung zu pushen, die den alten Verlauf enthält, schlägt fehl, da es sich nicht um einen schnellen Vorlauf handelt.
Wenn der Zweig, den Sie neu gegründet haben, ein Thema oder ein Feature-Zweig ist, in dem Sie selbst arbeiten , ist das keine große Sache. Für das Verschieben in ein anderes Repository ist die
--force
Option erforderlich. Abhängig von den Berechtigungen des Remote-Repositorys können Sie möglicherweise zuerst den alten Zweig löschen und dann die neu basierte Version übertragen. Beispiele für Befehle, die möglicherweise die Arbeit zerstören, sind nicht Gegenstand dieser Antwort.Umschreiben von bereits veröffentlichten Geschichte auf einem Zweig , in dem Sie mit anderen Menschen arbeiten , ohne sehr guten Grund , wie ein Passwort oder andere sensible Details Kräfte arbeiten auf Ihre Mitarbeiter undicht und ist unsozial und andere Entwickler ärgern. Der Abschnitt „Wiederherstellen von einer Upstream-Rebase“ in der
git rebase
Dokumentation wird mit zusätzlichem Schwerpunkt erläutert.quelle
git log hashoftheoldcommit
git log --graph
Wenn mehrere Commits vorhanden sind, können Sie
git rebase -i
zwei Commits zu einem zusammenfassen.Wenn Sie nur zwei Commits zusammenführen möchten und es sich um die "letzten zwei" handelt, können Sie die beiden Commits mit den folgenden Befehlen zu einem kombinieren:
quelle
git reset --soft HEAD~10
, wobei 10 die Anzahl der Commits ist, die Sie zusammenführen möchten.HEAD
durch die Verwendung ,git reset --soft 47b5c5...
wo47b5c5...
die SHA1 ist ID des begehen.Rebase: Du wirst es nicht brauchen:
Ein einfacherer Weg für das häufigste Szenario.
In den meisten Fällen:
Eigentlich, wenn alles, was Sie wollen, einfach mehrere aktuelle Commits zu einem kombinieren, aber nicht benötigen
drop
,reword
und andere Rebase-Arbeiten.Sie können einfach tun:
~n
ist die Anzahl der Commits leise un-commit (dh~1
,~2
...)Verwenden Sie dann den folgenden Befehl, um die Festschreibungsnachricht zu ändern.
Das ist so ziemlich das Gleiche wie eine große Reichweite von
squash
und einspick
.Und es funktioniert für n Commits, aber nicht nur für zwei Commits, wie oben angegeben.
quelle
~n
ist die Anzahl der Commits leise un-commit (dh~1
,~2
...)n
letzten Commits zusammenführen möchte , sondern dien
Commits in der Mitte? Kann ich das so einfach machen?git rebase -i
müssen Siesquash
arbeiten. @ Chumakoffn
letzten Commits in einem, dem ersten Gebrauchgit reset --soft @~m
, wom = n - 1
Zuerst sollten Sie überprüfen, wie viele Commits Sie haben:
Es gibt zwei Status:
Zum einen gibt es nur zwei Commits:
Zum Beispiel:
(In diesem Fall können Sie git rebase nicht verwenden.) Sie müssen Folgendes tun.
Ein weiterer Grund ist, dass es mehr als zwei Commits gibt. Sie möchten Commit C und D zusammenführen.
Zum Beispiel:
(Unter dieser Bedingung können Sie Git Rebase verwenden.)
Und dann "Squash" verwenden. Der Rest ist sehr einfach. Wenn Sie es immer noch nicht wissen, lesen Sie bitte http://zerodie.github.io/blog/2012/01/19/git-rebase-i/
quelle
git push -f origin master
dies erforderlich sein könnte.Angenommen, Sie waren in Ihrem eigenen Themenbereich. Wenn Sie die letzten 2 Commits zu einem zusammenführen und wie ein Held aussehen möchten, verzweigen Sie das Commit kurz bevor Sie die letzten beiden Commits durchgeführt haben.
Dann schreibt Squash den anderen Zweig in diesem neuen Zweig fest:
Das wird die Änderungen einbringen, aber nicht festschreiben. Also legen Sie sie einfach fest und Sie sind fertig.
Jetzt können Sie diesen neuen Themenzweig wieder in Ihrem Hauptzweig zusammenführen.
quelle
a
undc
erfordert zusammen werden verschmolzen und zu halten ,b
wie es ist.git checkout -b combine-last-two-commits "HEAD^2"
) in Git Version 2.17 versuche , erhalte ich eine Fehlermeldung:fatal: 'HEAD^2' is not a commit and a branch 'combine-last-two-commits' cannot be created from it
Sie können die Rebase mit abbrechen
und wenn Sie den interaktiven Rebase-Befehl erneut ausführen, wird der 'Squash; Commit muss unter dem Pick Commit in der Liste liegen
quelle
Ich verwende häufig git reset --mixed , um eine Basisversion vor mehreren Commits, die Sie zusammenführen möchten, zurückzusetzen. Dann mache ich ein neues Commit. Auf diese Weise kann Ihr Commit das neueste sein und sicherstellen, dass Ihre Version HEAD ist, nachdem Sie auf den Server übertragen haben.
Wenn ich zwei Commits zu einem zusammenführen möchte, verwende ich zuerst:
"249cf9392da197573a17c8426c282" war die dritte Version, ist auch Ihre Basisversion, bevor Sie zusammenführen. Danach mache ich ein neues Commit:
Es ist alles, Hoffnung ist ein anderer Weg für alle.
Zu Ihrer Information, von
git reset --help
:quelle
$ git rebase --abort
Führen Sie diesen Code jederzeit aus, wenn Sie die Git-Rebase rückgängig machen möchten
$ git rebase -i HEAD~2
Die letzten beiden Commits erneut anwenden. Der obige Befehl öffnet einen Code-Editor
Nach: wq befinden Sie sich im aktiven Rebase-Modus
Hinweis : Sie erhalten einen anderen Editor, wenn keine Warn- / Fehlermeldungen angezeigt werden. Wenn ein Fehler oder eine Warnung eines anderen Editors nicht angezeigt wird, können Sie den Vorgang durch Ausführen abbrechen,
$ git rebase --abort
wenn Sie einen Fehler oder eine Warnung sehen.Andernfalls fahren Sie einfach mit der Ausführung fort$ git rebase --continue
Sie sehen Ihre 2 Commit-Nachricht. Wählen Sie eine aus oder schreiben Sie Ihre eigene Commit-Nachricht, speichern Sie sie und beenden Sie [: wq]
Hinweis 2: Möglicherweise müssen Sie Ihre Änderungen zwangsweise auf das Remote-Repo übertragen, wenn Sie den Befehl rebase ausführen
$ git push -f
$ git push -f origin master
quelle
git push -f origin/master
Andere Antworten fehlen. +1Da ich
git cherry-pick
für fast alles benutze , ist es für mich selbstverständlich, dies auch hier zu tun.Da ich
branchX
ausgecheckt habe und zwei Commits an der Spitze stehen, von denen ich ein Commit erstellen möchte, das ihren Inhalt kombiniert, mache ich Folgendes:Wenn ich auch aktualisieren möchte
branchX
(und ich nehme an, dass dies der Nachteil dieser Methode ist), muss ich auch:quelle
Wenn Ihre Hauptniederlassung
git log
ungefähr so aussieht:und Sie möchten die beiden obersten Commits zusammenführen, indem Sie einfach die folgenden einfachen Schritte ausführen:
git checkout 77df2a40e53136c7a2d58fd847372 -b merged-commits
git cherry-pick -n -x ac72a4308ba70cc42aace47509a5e
. (Konflikte lösen, falls vorhanden)git commit --amend
.Das ist es. Sie können diese zusammengeführte Version in den Zweig "Merged-Commits" verschieben, wenn Sie möchten.
Außerdem können Sie jetzt zwei aufeinanderfolgende Commits in Ihrem Hauptzweig verwerfen. Aktualisieren Sie einfach Ihren Hauptzweig wie folgt:
quelle
Wenn Sie die beiden letzten Commits kombinieren und nur die Nachricht des älteren Commits verwenden möchten, können Sie den Prozess mithilfe automatisieren
expect
.Ich nehme an:
Ich habe mit getestet
git version 2.14.3 (Apple Git-98)
.quelle
expect
ist unbeschrieben.expect
.