Frage Wie kann ich zwei Commits zu einem zusammenführen, wenn ich bereits mit Rebase begonnen habe?


Ich versuche, 2 Commits in 1 zusammenzufassen, also folgte ich "Squashing Commits mit Rebase" von Git bereit.

ich rannte

git rebase --interactive HEAD~2

Im resultierenden Editor ändere ich pick zu squash und dann save-quit, aber die Rebase schlägt mit dem Fehler fehl

Kann nicht ohne vorherigen Commit "Squash"

Jetzt, da mein Arbeitsbaum diesen Zustand erreicht hat, kann ich mich nicht mehr erholen. Der Befehl git rebase --interactive HEAD~2 scheitert mit

Interaktive Rebase hat bereits begonnen

und git rebase --continue scheitert mit

Kann nicht ohne vorherigen Commit "Squash"


989
2018-04-01 20:56


Ursprung


Antworten:


Zusammenfassung

Die Fehlermeldung

Kann nicht ohne vorherigen Commit "Squash"

bedeutet, dass Sie wahrscheinlich versucht haben, "nach unten zu quetschen". Git komprimiert immer einen neueren Commit in einen älteren Commit oder "aufwärts", wie in der interaktiven Totenliste angezeigt, also in einer vorherigen Zeile. Ändern Sie den Befehl in der ersten Zeile Ihrer Todo-Liste zu squash wird immer diesen Fehler erzeugen, da es für den ersten Commit nichts gibt, in den man hineinquetschen könnte.

Die Reparatur

Kehre zuerst dorthin zurück, wo du angefangen hast

$ git rebase --abort

Sagen Sie, Ihre Geschichte ist

$ git log --pretty=oneline
a931ac7c808e2471b22b5bd20f0cad046b1c5d0d c
b76d157d507e819d7511132bdb5a80dd421d854f b
df239176e1a2ffac927d8b496ea00d5488481db5 a

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: Running git log pumpt seine Ausgabe in einen Pager, less Standardmäßig auf den meisten Plattformen. Um den Pager zu beenden und zur Eingabeaufforderung zurückzukehren, drücken Sie die Taste q Schlüssel.)

Laufen git rebase --interactive HEAD~2 gibt Ihnen einen Editor mit

pick b76d157 b
pick a931ac7 c

# Rebase df23917..a931ac7 onto df23917
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

(Beachten Sie, dass diese Todo - Liste in umgekehrter Reihenfolge wie die Ausgabe von git log.)

Ändern von b pick zu squash wird zu dem Fehler führen, den Sie gesehen haben, aber wenn Sie stattdessen c in b zerquetschen (neuere Commit in die ältere oder "Squashing aufwärts"), indem Sie die Todo-Liste in ändern

pick   b76d157 b
squash a931ac7 c

und speichern-Beenden Sie Ihren Editor, erhalten Sie einen anderen Editor, dessen Inhalt ist

# This is a combination of 2 commits.
# The first commit's message is:

b

# This is the 2nd commit message:

c

Wenn Sie speichern und beenden, wird der Inhalt der bearbeiteten Datei zur Übermittlungsnachricht des neuen kombinierten Commits:

$ git log --pretty=oneline
18fd73d3ce748f2a58d1b566c03dd9dafe0b6b4f b and c
df239176e1a2ffac927d8b496ea00d5488481db5 a

Hinweis zum Umschreiben des Verlaufs

Interaktive Rebase schreibt den Verlauf neu. Der Versuch, zu einer Fernbedienung zu gelangen, die den alten Verlauf enthält, schlägt fehl, da es sich nicht um einen Schnellvorlauf handelt.

Wenn es sich bei der Zweigstelle, die Sie referenziert haben, um ein Zweig oder eine Zweigstelle handelt in dem du alleine arbeitest, keine große Sache. Um zu einem anderen Repository zu gelangen, benötigen Sie das --force Option oder alternativ können Sie abhängig von den Berechtigungen des Remote-Repositorys zuerst die alte Verzweigung löschen und dann die referenzierte Version verschieben. Beispiele für solche Befehle, die möglicherweise Arbeit zerstören, liegen außerhalb des Bereichs dieser Antwort.

Überschreiben von bereits veröffentlichter Geschichte in einer Branche, in der Sie mit anderen Personen arbeiten sehr Ein guter Grund wie das Passieren eines Passworts oder anderer sensibler Details zwingt Ihre Mitarbeiter dazu, antisozial zu arbeiten und andere Entwickler zu verärgern. Das "Wiederherstellen aus einem Upstream - Rebase" Abschnitt in der git rebase Dokumentation erklärt, mit zusätzlicher Betonung.

Rebasing (oder jede andere Form des Umschreibens) eines Zweiges, auf dem andere basieren, ist eine schlechte Idee: Jeder, der sich dahinter befindet, wird gezwungen, ihren Verlauf manuell zu korrigieren. In diesem Abschnitt wird erläutert, wie Sie den Fix aus der Sicht des Downstreams durchführen können. Die wirkliche Lösung wäre jedoch, den Upstream von vornherein zu vermeiden. ...


1533
2018-04-02 19:04



Wenn es mehrere Commits gibt, können Sie verwenden git rebase -i um zwei Commits in eins zu zerquetschen.

Wenn es nur zwei Commits gibt, die Sie zusammenführen möchten, und sie die "letzten zwei" sind, können die folgenden Befehle verwendet werden, um die beiden Commits in einem zu kombinieren:

git reset --soft "HEAD^"
git commit --amend

335
2017-07-11 05:31



Zuerst sollten Sie überprüfen, wie viele Commits Sie haben:

git log

Es gibt zwei Status:

Einer ist, dass es da ist nur zwei Commits:

Beispielsweise:

commit A
commit B

(In diesem Fall können Sie git rebase nicht verwenden) Sie müssen Folgendes tun.

$ git reset --soft HEAD^1

$ git commit --amend

Ein anderes ist, dass es mehr als zwei Commits gibt; Sie möchten Commit C und D zusammenführen

Beispielsweise:

commit A
commit B
commit C
commit D

(unter dieser Bedingung können Sie Git Rebase verwenden)

git rebase -i B

Und dann "Squash" zu tun. Der Rest ist sehr einfach. Wenn Sie immer noch nicht wissen, lesen Sie bitte http://zerodie.github.io/blog/2012/01/19/git-rebase-i/ 


50
2018-05-27 19:01



Rebase: Sie werden es nicht brauchen:

Ein einfacher Weg für das häufigste Szenario.

In den meisten Fällen:

Eigentlich wenn alles was du willst ist nur füge einfach mehrere kürzliche Commits in einem zusammen  aber brauche nicht drop, reword und andere Umarbeitungen.

Sie können einfach tun:

git reset --soft "HEAD~n"
  • Angenommen ~n ist die Anzahl der Commits, um sich sanft zu verpflichten (d. h. ~1, ~2, ...)

Verwenden Sie dann folgenden Befehl, um die Commit-Nachricht zu ändern.

git commit --amend

Das ist ziemlich das gleiche wie eine lange Reihe von squash und ein pick.

Und es funktioniert für n commits, aber nicht nur für zwei Commits, wie oben erwähnt.


49
2018-04-26 09:15



Angenommen, Sie waren in Ihrer eigenen Zweigstelle. Wenn Sie die letzten beiden Commits zu einem zusammenführen wollen und wie ein Held aussehen, verzweigen Sie das Commit kurz bevor Sie die letzten beiden Commits gemacht haben.

git checkout -b temp_branch HEAD^2

Dann commit den anderen Zweig in diesem neuen Zweig:

git merge branch_with_two_commits --squash

Das bringt die Veränderungen, aber nicht sie. Also begib sie einfach und du bist fertig.

git commit -m "my message"

Jetzt können Sie diesen Zweig wieder in Ihren Hauptzweig einbinden.


26
2017-10-23 23:44



Sie können die Rebase mit abbrechen

git rebase --abort

und wenn Sie den Befehl interactive rebase erneut ausführen, wird der Squash; commit muss unter dem Pick Commit in der Liste sein


22
2018-04-01 20:59



Ich benutze oft git reset --mixed Um eine Basisversion vor mehreren Commits wiederherzustellen, die Sie zusammenführen wollen, dann mache ich einen neuen Commit, damit Ihre Commits am neuesten Stand sind, stellen Sie sicher, dass Ihre Version HEAD ist, nachdem Sie auf den Server gedrängt haben.

commit ac72a4308ba70cc42aace47509a5e
Author: <me@me.com>
Date:   Tue Jun 11 10:23:07 2013 +0500

    Added algorithms for Cosine-similarity

commit 77df2a40e53136c7a2d58fd847372
Author: <me@me.com>
Date:   Tue Jun 11 13:02:14 2013 -0700

    Set stage for similar objects

commit 249cf9392da197573a17c8426c282
Author: Ralph <ralph@me.com>
Date:   Thu Jun 13 16:44:12 2013 -0700

    Fixed a bug in space world automation

Wenn ich Head Commits in eins zusammenfassen möchte, verwende ich zuerst:

git reset --mixed 249cf9392da197573a17c8426c282

"249cf9392da197573a17c8426c282" war die dritte Version, ist auch Ihre Basisversion, bevor Sie zusammenführen, danach mache ich ein neues Commit:

git add .
git commit -m 'some commit message'

Es ist alles, Hoffnung ist ein anderer Weg für alle.

FYI, aus git reset --help:

 --mixed
     Resets the index but not the working tree (i.e., the changed files are
     preserved but not marked for commit) and reports what has not been
     updated. This is the default action.

13
2017-09-09 02:48



$ 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

  • [ Der letzte Commit wird unten sein ]. Ändere das Letzte sich zu Squash (s) verpflichten. Da Squash mit vorherigem Commit verschmelzen wird.
  • Dann drücke die Esc-Taste und tippe: wq um zu speichern und zu schließen

Nach: wq bist du im aktiven Rebase-Modus

Hinweis: Sie erhalten einen anderen Editor, wenn keine Warnung / Fehlermeldung, Wenn ein Fehler oder eine Warnung ein anderer Editor nicht angezeigt wird, können Sie durch Ausführen abbrechen $ git rebase --abort Wenn Sie einen Fehler oder eine Warnung sehen, fahren Sie einfach fort $ git rebase --continue

Sie werden Ihre 2 Commit-Nachricht sehen. Wähle eine oder schreibe deine eigene Commit-Nachricht, speichere und beende [: wq]

Anmerkung 2: Eventuell müssen Sie Ihre Änderungen zum Remote-Repo zwingen, wenn Sie den Rebase-Befehl ausführen

$ git push -f

$ git push -f origin master


10
2018-02-20 21:49



Wenn dein Master sich verzweigt git log sieht ungefähr so ​​aus:

commit ac72a4308ba70cc42aace47509a5e
Author: <me@me.com>
Date:   Tue Jun 11 10:23:07 2013 +0500

    Added algorithms for Cosine-similarity

commit 77df2a40e53136c7a2d58fd847372
Author: <me@me.com>
Date:   Tue Jun 11 13:02:14 2013 -0700

    Set stage for similar objects

commit 249cf9392da197573a17c8426c282
Author: Ralph <ralph@me.com>
Date:   Thu Jun 13 16:44:12 2013 -0700

    Fixed a bug in space world automation

und Sie möchten die beiden wichtigsten Commits einfach durch folgende einfache Schritte zusammenführen:

  1. Erstens, um auf der sicheren Seite zu sein, checke das vorletzte Commit in einem separaten Zweig. Sie können der Branche nichts nennen. git checkout 77df2a40e53136c7a2d58fd847372 -b merged-commits
  2. Jetzt wählen Sie einfach Ihre Änderungen aus dem letzten Commit in diesem neuen Zweig aus: git cherry-pick -n -x ac72a4308ba70cc42aace47509a5e. (Konflikte lösen, falls solche entstehen)
  3. Jetzt sind Ihre Änderungen beim letzten Commit in Ihrem vorletzten Commit enthalten. Aber Sie müssen noch festlegen, fügen Sie zuerst die Änderungen hinzu, die Sie gerade ausgewählt haben, und führen Sie sie dann aus git commit --amend.

Das ist es. Sie können diese zusammengeführte Version in den Zweig "merged-commits" schieben, wenn Sie möchten.

Außerdem können Sie jetzt die zwei aufeinanderfolgenden Commits in Ihrem Master-Zweig verwerfen. Aktualisiere deinen Masterzweig einfach als:

git checkout master
git reset --hard origin/master (CAUTION: This command will remove any local changes to your master branch)
git pull

1
2018-06-16 15:57