1285 Stimmen

Wie kann ich zwei Commits zu einem zusammenführen, wenn ich bereits einen Rebase gestartet habe?

Ich versuche, 2 Commits zu einem zusammenzuführen, also habe ich "Commits mit Rebase zusammenführen" von Git ready befolgt.

Ich habe ausgeführt

git rebase --interactive HEAD~2

In dem resultierenden Editor ändere ich pick zu squash und speichere und beende dann, aber der Rebase schlägt fehl mit dem Fehler

Kann nicht 'squash' ohne einen vorherigen Commit

Jetzt, da mein Arbeitsverzeichnis diesen Zustand erreicht hat, habe ich Probleme, mich zu erholen.

Der Befehl git rebase --interactive HEAD~2 schlägt fehl mit:

Interaktiver Rebase bereits gestartet

und git rebase --continue schlägt fehl mit

Kann nicht 'squash' ohne einen vorherigen Commit

27voto

Leom Burke Punkte 8040

Sie können das Rebase mit

git rebase --abort

abbrechen und wenn Sie den interaktiven Rebase-Befehl erneut ausführen, muss der 'squash'-Commit unter dem 'pick'-Commit in der Liste stehen

20voto

Gnanasekar S Punkte 1650

$ git rebase --abort

Führen Sie diesen Code jederzeit aus, wenn Sie das git rebase rückgängig machen möchten

$ git rebase -i HEAD~2

Um die letzten zwei Commits erneut anzuwenden. Der obige Befehl öffnet einen Code-Editor

  • [ Der neueste Commit wird unten sein ]. Ändern Sie den letzten Commit in squash(es). Da squash sich mit dem vorherigen Commit vermischt.
  • Dann drücken Sie die esc-Taste und geben Sie :wq ein, um zu speichern und zu schließen

Nach :wq befinden Sie sich im aktiven Rebase-Modus

Hinweis: Sie erhalten einen weiteren Editor, wenn keine Warn- oder Fehlermeldungen vorliegen. Wenn ein Fehler oder eine Warnung vorliegt, wird kein weiterer Editor angezeigt. Sie können den Vorgang abbrechen, indem Sie $ git rebase --abortausführen, wenn ein Fehler oder eine Warnung angezeigt wird, ansonsten können Sie einfach fortsetzen, indem Sie $ git rebase --continueausführen

Sie werden Ihre 2 Commit-Nachricht sehen. Wählen Sie eine aus oder schreiben Sie Ihre eigene Commit-Nachricht, speichern und beenden [:wq]

Hinweis 2: Sie müssen möglicherweise Ihre Änderungen remote erzwingen, wenn Sie den Rebase-Befehl ausführen

$ git push -f

$ git push -f origin master

19voto

VinceStyling Punkte 3588

Ich verwende oft git reset --mixed, um eine Basisversion vor mehreren Commits zurückzusetzen, die Sie zusammenführen möchten. Dann mache ich einen neuen Commit, auf diese Weise können Sie Ihren neuesten Commit sicherstellen, um Ihre Version ist HEAD, nachdem Sie ihn auf den Server gepusht haben.

commit ac72a4308ba70cc42aace47509a5e
Autor: 
Datum: Di 11 Jun 10:23:07 2013 +0500

    Algorithmen für Cosinus-Ähnlichkeit hinzugefügt

commit 77df2a40e53136c7a2d58fd847372
Autor: 
Datum: Di 11 Jun 13:02:14 2013 -0700

    Bühne für ähnliche Objekte vorbereitet

commit 249cf9392da197573a17c8426c282
Autor: Ralph 
Datum: Do 13 Jun 16:44:12 2013 -0700

    Einen Fehler in der Weltraumautomatisierung behoben

Wenn ich die letzten beiden Commits zusammenführen möchte, benutze ich zuerst:

git reset --mixed 249cf9392da197573a17c8426c282

"249cf9392da197573a17c8426c282" war die dritte Version, auch Ihre Basisversion vor dem Zusammenführen, danach mache ich einen neuen Commit:

git add .
git commit -m 'eine Commit-Nachricht'

Das ist alles, hoffe es ist ein neuer Weg für alle.

Zur Info, von git reset --help:

 --mixed
     Setzt den Index zurück, aber nicht das Arbeitsverzeichnis (d.h. die geänderten Dateien bleiben erhalten, werden aber nicht für einen Commit markiert) und gibt an, was nicht aktualisiert wurde. Dies ist die Standardaktion.

4voto

Martin G Punkte 15799

Da ich git cherry-pick für so ziemlich alles benutze, fällt es mir hier auch ganz natürlich, das Gleiche zu tun.

Angenommen, ich habe branchX ausgecheckt und es gibt zwei Commits am Ende davon, von denen ich einen Commit erstellen möchte, der ihren Inhalt kombiniert, mache ich folgendes:

git checkout HEAD^ // Den vorherigen Commit auschecken
git cherry-pick --no-commit branchX // Den Inhalt des zweiten Commits übernehmen
git commit --amend // Einen neuen Commit mit ihrem kombinierten Inhalt erstellen

Wenn ich auch branchX aktualisieren möchte (und ich vermute, das ist der Nachteil dieser Methode), muss ich auch:

git checkout branchX
git reset --hard

4voto

Wenn Sie mehrere Commits zusammenführen möchten, können Sie dies mit der Methode des interaktiven Rebase tun. (Danke Mads, dass du mich darüber unterrichtet hast!)

  • git rebase origin/develop -i
  • Dann schreiben Sie einfach ein 's' vor den Commits, die Sie zusammenführen möchten, und lassen sie in den Hauptcommit einfließen

Pro-Tipp im git rebase-interactive-Modus (vim):

  1. Navigieren Sie zur Commit-Zeile, die Sie ändern möchten
  2. (ESC) ciw - (change inner word) ersetzt das gesamte Wort unter dem Cursor.
  3. Geben Sie ein, was Sie tun möchten, z. B. s für das Zusammenführen
  4. (ESC) wq schreiben Sie ruhig, Sie sind fertig.

Bildbeschreibung hier eingeben

dann git push -f

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