Sie müssen lediglich ein neues Commit mit denselben Details wie das aktuelle HEAD
Commit erstellen , jedoch mit dem übergeordneten Commit als vorherige Version von HEAD
. git reset --soft
Verschiebt den Verzweigungszeiger so, dass das nächste Festschreiben über einem anderen Festschreiben erfolgt als der aktuelle Verzweigungskopf.
# Move the current head so that it's pointing at the old commit
# Leave the index intact for redoing the commit.
# HEAD@{1} gives you "the commit that HEAD pointed at before
# it was moved to where it currently points at". Note that this is
# different from HEAD~1, which gives you "the commit that is the
# parent node of the commit that HEAD is currently pointing to."
git reset --soft HEAD@{1}
# commit the current tree using the commit details of the previous
# HEAD commit. (Note that HEAD@{1} is pointing somewhere different from the
# previous command. It's now pointing at the erroneously amended commit.)
git commit -C HEAD@{1}
git reflog
, um die richtige Nummer zu finden, z{2}
.git commit --amend
. Das zweite ist ein "Wiederherstellen" eines neuen Commits. Diese funktionieren für jedengit commit
, nicht nur--amend
.git commit
.git reset --soft HEAD@{1}
:fatal: ambiguous argument 'HEAD@1': unknown revision or path not in the working tree. Use '--' to separate paths from revisions
. Als ich durchHEAD@{1}
den ingit reflog
(danke JJD!) Gezeigten entsprechenden Commit-Hash ersetzt habe , hat diese Antwort wunderbar funktioniert!HEAD@{1}
. Wenn ichecho HEAD@{1}
zum Beispiel in tcsh laufe , liegt die AusgabeHEAD@1
daran, dass die geschweiften Klammern von tcsh interpretiert wurden. Wenn ich einfache Anführungszeichen verwende, bleiben die geschweiften Klammern erhalten.Verwenden Sie das Ref-Protokoll :
Sie sollten dann alle zuvor geänderten Änderungen nur in Ihrer Arbeitskopie haben und können sie erneut festschreiben
um eine vollständige Liste der vorherigen Indizes anzuzeigen
git reflog
quelle
HEAD@{1}
undHEAD~1
?HEAD~1
ist genau das gleiche wieHEAD^
und kennzeichnet das übergeordnete Element des aktuellen Commits.HEAD@{1}
Auf der anderen Seite bezieht sich dies auf das Commit, auf das HEAD vor diesem Commit hingewiesen hat, dh es bedeutet unterschiedliche Commits, wenn Sie einen anderen Zweig auschecken oder ein Commit ändern.git reset HEAD@{1}
ist genug.Finden Sie Ihre geänderten Commits durch:
Hinweis: Sie können hinzufügen
--patch
, um den Hauptteil der Commits der Übersichtlichkeit halber anzuzeigen. Gleich wiegit reflog
.Setzen Sie dann Ihren HEAD an dem Punkt auf ein vorheriges Commit zurück, an dem es in Ordnung war durch:
Hinweis: Ersetzen Sie SHA1 durch Ihren echten Commit-Hash. Beachten Sie auch, dass dieser Befehl alle nicht festgeschriebenen Änderungen verliert , sodass Sie sie möglicherweise vorher aufbewahren können. Alternativ verwendet
--soft
stattdessen die neuesten Änderungen zu behalten und sie dann begehen.Wählen Sie dann das andere Commit aus, das Sie zusätzlich benötigen:
quelle
git reset SHA1 --soft
die neuesten Änderungen beibehalten und anschließend festschreiben.Sie können ein Commit jederzeit aus dem Handbuch aufteilen
quelle
git reflog
ist alles was Sie brauchengit reset
statt stattgit reset --soft
, dann tungit add --patch
.Möglicherweise sollten Sie beachten, dass Sie die Festschreibungsnachricht löschen können, wenn Sie sich noch in Ihrem Editor mit der Festschreibungsnachricht befinden. Dadurch wird der
git commit --amend
Befehl abgebrochen .quelle
Vielleicht kann verwendet werden
git reflog
, um zwei Commits vor und nach der Änderung zu erhalten.Verwenden Sie dann
git diff before_commit_id after_commit_id > d.diff
, um den Unterschied zwischen vor und nach der Änderung zu ermitteln.Weiter verwenden
git checkout before_commit_id
, um vor dem Festschreiben zurückzukehrenUnd zuletzt verwenden Sie
git apply d.diff
, um die tatsächliche Änderung anzuwenden, die Sie vorgenommen haben.Das löst mein Problem.
quelle
Wenn Sie das Commit auf Remote verschoben und dann Änderungen an diesem Commit fälschlicherweise geändert haben, wird Ihr Problem behoben. Geben Sie a aus
git log
, um die SHA vor dem Festschreiben zu finden. (Dies setzt voraus, dass Remote als Ursprung bezeichnet wird). Geben Sie nun diesen Befehl mit diesem SHA aus.quelle
Sie können unten tun, um Ihre rückgängig zu machen
git commit —amend
git reset --soft HEAD^
git checkout files_from_old_commit_on_branch
git pull origin your_branch_name
===================================
Jetzt sind Ihre Änderungen wie zuvor. Damit sind Sie mit dem Rückgängigmachen für fertig
git commit —amend
Jetzt können Sie tun
git push origin <your_branch_name>
, um zum Zweig zu schieben.quelle
Fast 9 Jahre zu spät, aber diese Variante wurde nicht erwähnt, um dasselbe zu erreichen (es ist eine Art Kombination aus einigen davon, ähnlich der Top-Antwort ( https://stackoverflow.com/a/1459264/4642530 ). .
Durchsuche alle abgetrennten Köpfe auf dem Ast
git reflog show origin/BRANCH_NAME --date=relative
Dann finden Sie den SHA1-Hash
Auf alten SHA1 zurücksetzen
git reset --hard SHA1
Dann schieben Sie es wieder nach oben.
git push origin BRANCH_NAME
Erledigt.
Dadurch kehren Sie vollständig zum alten Commit zurück.
(Einschließlich des Datums des zuvor überschriebenen, losgelösten Commit-Kopfes)
quelle
--soft
, um meine Änderungen beizubehalten. Ich möchte es nur separatKasse zum temporären Zweig mit letztem Commit
git branch temp HEAD@{1}
Letztes Commit zurücksetzen
git reset temp
Jetzt haben Sie alle Dateien, die Sie festschreiben, sowie die vorherigen Festschreibungen. Überprüfen Sie den Status aller Dateien.
git status
Setzen Sie Ihre Commit-Dateien von der Git-Phase zurück.
git reset myfile1.js
(bald)Bringen Sie dieses Commit wieder an
git commit -C HEAD@{1}
Fügen Sie Ihre Dateien hinzu und übergeben Sie sie einem neuen Commit.
quelle