Git: "Kann ohne vorheriges Festschreiben nicht" quetschen "Fehler beim Rebase

94

Ich habe Folgendes im To-Do-Text von git rebase -i HEAD~2:

pick 56bcce7 Closes #2774
pick e43ceba Lint.py: Replace deprecated link

# Rebase 684f917..e43ceba onto 684f917 (2 command(s))
#
...

Wenn ich nun versuche, das erste ( 56bcce7) zu quetschen und das zweite durch Hinzufügen von "s" vor dem ersten auszuwählen, wird folgende Fehlermeldung angezeigt:

Cannot 'squash' without a previous commit

Kann mir jemand erklären, was es bedeutet und wie ich es mache?

Ich möchte zerquetschen die erste commit ( 56bcce7) und „wählen und umformulieren“ , um die zweite ( e43ceba) verpflichten

Dawny33
quelle
1
Ändern Sie HEAD ~ 2 in HEAD ~ 3, wenn Sie wirklich quetschen möchten.
ElpieKay
1
Und möglicherweise verwenden Sie --root, wenn HEAD ~ 2 Ihr erstes Commit ist: stackoverflow.com/a/598788/2444812
Sybille Peters

Antworten:

79

Die interaktive Rebase zeigt Commits in umgekehrter Reihenfolge an, wie Sie es bei der Verwendung gewohnt sind git log. git rebase -iWiederholt die ausgewählten Commits in der genauen Reihenfolge (von oben nach unten), in der sie in der gespeicherten Rebase-Anweisungsdatei aufgeführt sind. Beim Squashing wird das zum Squashing ausgewählte Commit mit dem Commit kombiniert, das in der (bearbeiteten) Liste davor steht, dh dem Commit aus der vorherigen Zeile. In Ihrem Fall gibt es kein vorheriges Commit für 56bcce7. Sie müssen einen der folgenden Schritte ausführen

  • git rebase -i HEAD~3(wenn Sie quetschen wollen 56bcce7in 684f917)
  • Wenn Sie meinen , kombinieren 56bcce7mit e43cebaund e43cebahängt nicht 56bcce7, dann einfach Neuordnungs sie:

    r e43ceba Lint.py: Replace deprecated link
    s 56bcce7 Closes #2774
    

    UPDATE : Gus 'Antwort unten schlägt einen besseren Weg vor, dasselbe zu tun, ohne die beiden Commits neu zu ordnen:

    r 56bcce7 Closes #2774
    s e43ceba Lint.py: Replace deprecated link
    

    Dadurch werden die beiden Commits zu einem zusammengefasst. Wenn die interaktive Rebase nach einer umformulierten Festschreibungsnachricht für fragt 56bcce7, geben Sie die Festschreibungsnachricht an , die die Vereinigung von 56bcce7und beschreibt e43ceba.

Leon
quelle
1
Ich möchte quetschen 56bcce7 in e43ceba. Wie mache ich hier den ersten Schritt?
Dawny33
81

Ich hatte ein ähnliches Problem, das ich wie folgt gelöst habe:

Dies ist die Commit-Gruppe, die ich quetschen wollte:

1 s 01cc5a08 Removes open div
2 s a2b6eecf Restores old fonts
3 s 603479ff Cleans left out div
4 pick 5afdbc33 Update: show logo on landing page
5 s 04c1cb13 change version of dev and prod from 1 to 2
6 s bbe6a8f8 Update: show logo on landing page if they have one
7 s c0d6008a Adds check for C users

Wie Sie sehen können, wollte ich nein. 4, aber 1, 2 und 3 hatten zuvor keine Verpflichtung, sich hineinzuquetschen . Daher kann der Squash nicht ohne vorherigen Commit- Fehler ausgeführt werden.

Meine Lösung bestand darin, die rOption für zu verwenden# r, reword = use commit, but edit the commit message

Meine Commit-Liste sah also so aus:

1 r 01cc5a08 Removes open div
2 s a2b6eecf Restores old fonts
3 s 603479ff Cleans left out div
4 s 5afdbc33 Update: show logo on landing page
5 s 04c1cb13 change version of dev and prod from 1 to 2
6 s bbe6a8f8 Update: show logo on landing page if they have one
7 s c0d6008a Adds check for C users

Nach dem Speichern bat mich die interaktive Shell um die Neuformulierung des ausgewählten Commits.

Danach führte mein Festschreibungsprotokoll zu einem einzelnen Festschreiben, was zu einem saubereren Festschreibungsverlauf führte.

Gus
quelle
2
Wie ich, wenn Sie einen Fehler erhalten haben, weil Sie kein Commit zum Umformulieren oder Auswählen und Erhalten des erwähnten Fehlers (auf Frage) ausgewählt haben, müssen Sie git rebase --edit-tododiese Antwort verweisen und dann behebengit rebase --continue
alter Mönch
Diese Antwort war prägnant und auf den Punkt gebracht, wirklich geholfen, danke
Gonzofish
16

Ich hatte dieses Problem und der Grund, warum es in meinem Fall passiert ist, war, dass Sie ältere Commits nicht auf ein neues Commit quetschen können. Hier ist ein Beispiel, das besagt, dass Sie 3 Commits haben:

1 pick 01mn9h78 The lastest commit
2 pick a2b6pcfr A commit before the latest
3 pick 093479uf An old commit i made a while back

Nun, wenn du sagst git rebase -i HEAD~3und so etwas tust

1 pick 01mn9h78 The lastest commit
2 s a2b6pcfr A commit before the latest
3 s 093479uf An old commit i made a while back

Dies führt zu dem Fehler:

Fehler: Ohne vorheriges Festschreiben kann nicht "gequetscht" werden. Sie können dies mit "git rebase --edit-todo" beheben und dann "git rebase --continue" ausführen. Oder Sie können die Rebase mit 'git rebase --abort' abbrechen.

Lösung:

Wenn Sie Commits quetschen, sollten Sie die letzten Commits auf alte quetschen, nicht umgekehrt. Im Beispiel ist dies ungefähr so:

1 s 01mn9h78 The lastest commit
2 s a2b6pcfr A commit before the latest
3 pick 093479uf An old commit i made a while back

Dies wird gut funktionieren, falls Sie alle Ihre Commit-Nachrichten möchten, würde ich eine Korrektur anstelle von Squash vorschlagen .

DvixExtract
quelle
5
Vielen Dank - ich quetsche Commits nicht oft und der Rat, das älteste Commit auszuwählen, hat mir geholfen, einen nicht hilfreichen Git-Fehler zu überwinden.
0x574F4F54
2

Squash mit der umgekehrten Logik . Sie können die gewünschte Festschreibungsnachricht im späteren Schritt auswählen.

  • pickDas erste Commit , für das Sie die Commit-Nachricht nicht möchten .
  • squashoder fixupdie Commits, die Sie zusammenführen möchten, bis zu denen, die die Commit-Nachricht enthalten, die Sie tatsächlich wollten.
pick 56bcce7 Closes #2774
squash e43ceba Lint.py: Replace deprecated link
  • bestätige die Änderung ( :x)
  • Löschen Sie die Commit-Nachricht (en), die Sie nicht möchten, und hinterlassen Sie nur die Nachricht aus dem Commit , das Sie möchten (in diesem Fall :) Lint.py: Replace deprecated link.
  • Bestätige die Auswahl ( :x)

Hoffe es ist klarer für jemanden ✌🏽

Kamafeather
quelle
1

Es ist am besten, im interaktiven Editor, der die Commits enthält, zu sagen, dass git immer von unten nach oben quetscht und man oben einen "Pick" -Eintrag hinterlassen sollte, um die Squashes von unten zu erhalten.

ekyu88
quelle
1

Ich habe gerade diesen Ansatz ausprobiert.

Git Log -n3

Dies würde die letzten 3 Commits anzeigen, die mir die Idee geben würden, was das letzte Commit ist und welches zuvor. Nun heißt es, neu zu gründen,

Git Rebase -i HEAD ~ 3

Wählen Sie das letzte Commit, auf das wir die beiden anderen drücken müssen. Die Commit-ID, die als Basis-Commit ausgewählt wird, lautet wie folgt:

Wählen Sie commit_id aus

Ändern Sie die beiden anderen Festschreibungs-IDs in:

squash commit_id

oder einfach,

s commit_id

Tom Taylor
quelle
0

Ich habe dieses Problem auch schon jetzt getroffen, das ist nur nachlässig. Sie können das Problem wie folgt lösen: Wenn Sie versuchen, das erste (56bcce7) zu quetschen und das zweite auszuwählen, sollten Sie aber "s" vor der zweiten Zeile hinzufügen nicht der erste. Sie können auch auf die nächste Website verweisen: http://backlogtool.com/git-guide/en/stepup/stepup7_5.html

user8073722
quelle
1
Hallo ! Es ist besser, wenn Sie sich ansehen, wie Sie ein minimales, vollständiges und überprüfbares Beispiel für zukünftige Bemühungen um einen Stapelüberlauf erstellen . -Danke
Momin