Ich habe eine Änderung festgeschrieben und vergessen, dem Änderungssatz eine Datei hinzuzufügen. Nach anderen Commits wurde mir klar, dass die Datei jetzt in einem HEAD^4
Commit fehlt .
Wie schreibe ich ein vorheriges Commit neu, um die fehlende Datei einzuschließen?
git
git-commit
kolrie
quelle
quelle
Antworten:
Verwenden
git rebase --interactive HEAD~4
und setzen Sie dieedit
Option für das Commit, das Sie ändern möchten.Denken Sie daran, dass Sie Commits, die an das Remote-Repository gesendet werden, nicht auf diese Weise ändern sollten . In diesem Fall ist es besser, ein neues Commit mit fehlender Datei hinzuzufügen.
quelle
git push -f
wenn ich sicher bin, dass sich der Upstream nicht geändert hat?add
die fehlenden Dateien bereits -ed, also habe ich ein Commit mit "xxx" als Nachricht durchgeführt. Dann habe ich den Rebase-Befehl ausgeführt und das Commit "xxx" von "pick" in "edit" geändert. Dann habe ich "git rebase --continue" gemacht. Wenn ich mir jetzt den Verlauf ansehe, habe ich "xxx" als letztes Commit, und das frühere Commit, zu dem ich sie hinzufügen wollte, ist unverändert! Ich frage mich, wo mein Fehler war?Mir ist klar, dass Leute googeln und hierher kommen können, um eine einfachere Antwort zu finden: Was wäre, wenn es nur das letzte Commit wäre? (Die Frage von OP betrifft die Behebung des 4. Commits in der Geschichte.)
Wenn Sie festschreiben und feststellen, dass Sie vergessen haben, sofort eine Datei hinzuzufügen , gehen Sie einfach wie folgt vor:
Wo
--no-edit
wird die gleiche Commit-Nachricht aufbewahrt.Kinderleicht!
quelle
--amend
haben unterschiedliche HashesHEAD^4
. Es ist in Ordnung, so wie es ist, nur als Nachtrag als Referenz. ;)Wenn Sie diese 4 Commits NICHT gepusht haben, können Sie dies wie folgt tun:
Erstellen Sie Patch-Dateien für alle diese Commits:
Rücklauf um 4 Commits:
Fehlende Datei hinzufügen:
Verpflichte es mit
--amend
:Wenden Sie alle gespeicherten Patches wieder an:
Wenn Sie gedrückt haben, sollten Sie diese Methode NICHT verwenden. Geben Sie stattdessen einfach Ihren Fehler zu und erstellen Sie zusätzlich zu HEAD ein weiteres Commit, das dieses Problem behebt.
quelle
git format-patch
/git am
viel besser. Am wichtigsten ist, dass Sie mehr Vertrauen haben, wenn Sie etwas vermasseln - Commit, das als Patch in einer physischen Datei gespeichert ist, ist Ihr bestes Sicherheitsnetz.git gc
:)rm *.patch
)Obwohl die akzeptierte Antwort korrekt ist, fehlen detaillierte Anweisungen zum Bearbeiten eines Commits während eines Rebase-Prozesses.
Starten Sie zunächst einen Rebase-Prozess:
Eine Liste der Commits wird angezeigt. Wählen Sie ein Commit aus, das Sie bearbeiten möchten, indem Sie das Wort
pick
in ändern ,edit
und speichern Sie die Datei.Nehmen Sie die erforderlichen Änderungen in Ihrem Code vor (denken Sie daran,
git add
neue Dateien aufzurufen ).Nachdem alle Änderungen vorgenommen wurden,
git commit --amend
wird ausgegeben - dies ändert ein Commit, das als gekennzeichnet istedit
Rufen Sie auf
git rebase --continue
, um den Vorgang abzuschließen (wenn mehr Commits als gekennzeichnet sindedit
, müssen die obigen Schritte wiederholt werden).Wichtige Notizen:
Entfernen
pick
Sie KEINE Linien, die als nicht bearbeitet markiert sind - lassen Sie sie unverändert. Das Löschen dieser Zeilen führt zum Löschen verwandter CommitsGIT zwingt Sie
stash
vor dem erneuten Basieren, wenn Ihr Arbeitsverzeichnis nicht sauber ist. Sie können jedochgit stash pop / git stash apply
während des Rebases diese Änderungen (dh Änderungen, die vor dem Starten des Rebase-Prozesses gespeichert wurden) in ein Commit ändern, das als gekennzeichnet istedit
Wenn ein Fehler aufgetreten ist und Sie Änderungen rückgängig machen möchten, die während des Rebase-Vorgangs vor dessen Abschluss vorgenommen wurden (dh Sie möchten auf den Punkt zurückgreifen, bevor Sie den Rebase starten), verwenden Sie
git rebase --abort
- lesen Sie auch: So brechen Sie einen interaktiven Rebase ab, wenn --abort dies nicht tut. nicht arbeiten?Wie in der akzeptierten Antwort gesagt:
Die Antwort, warum, ist im Git-Buch (Absatz mit dem Titel " The Perils of Rebasing "):
quelle