Wie rückgängig zu machen „git commit --amend“ getan anstelle von „git commit“

StackOverflow https://stackoverflow.com/questions/1459150

  •  12-09-2019
  •  | 
  •  

Frage

I geändert versehentlich meine früheren begehen. Die Festschreibung sollten getrennt gewesen Geschichte der Änderungen zu halten ich auf eine bestimmte Datei aus.

Gibt es eine Möglichkeit, dass im letzten Commit rückgängig zu machen? Wenn ich so etwas wie git reset --hard HEAD^ tun, begehen die erste auch rückgängig gemacht wird.

(ich habe noch nicht zu allen anderen entfernten Verzeichnissen geschoben)

War es hilfreich?

Lösung

Was Sie tun müssen, ist ein neue zu schaffen, mit den gleichen Details zu begehen wie der aktuelle HEAD begehen, sondern mit den Eltern wie die vorherige Version von HEAD. git reset --soft den Zweig Zeiger bewegen, so dass die nächste begehen geschieht auf einem anderen begehen, von wo der Stromzweig Kopf ist jetzt.

# 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}

Andere Tipps

Mit der ref-log :

git branch fixing-things HEAD@{1}
git reset fixing-things

Sie sollten dann alle Ihre bisher nur geändert Änderungen in Ihrer Arbeitskopie und kann wieder begehen

eine vollständige Liste der bisherigen Indizes Typ git reflog

sehen

Finden Sie Ihre geänderten Commits durch:

git log --reflog

Hinweis: Sie --patch kostenlos in den Körper der Commits für Klarheit zu sehen. Gleich wie git reflog.

dann setzen Sie Ihren HEAD einen an dem Punkt vorherigen begehen war es in Ordnung durch:

git reset SHA1 --hard

Hinweis: Ersetzen SHA1 mit Ihrer wirklichen Hash begehen. Beachten Sie auch, dass dieser Befehl verlieren alle nicht festgeschriebenen Änderungen, so dass Sie sie vor verstauen kann. Alternativ Verwendung --soft stattdessen die neuesten Änderungen behalten und sie dann begehen.

Dann herauspicken die andere begehen, dass Sie auf es brauchen:

git cherry-pick SHA1

Sie können geteilt immer ein begehen, Aus der Handbuch

  • Starten Sie ein interaktives Fütterungsmaterial mit git rebase -i ^ begehen, wo begehen werden die Festschreibung mögen Sie teilen. In der Tat begehen jeder Bereich tun wird, solange es enthält, zu begehen.
  • Markieren Sie die begehen Sie mit der Aktion „Bearbeiten“ geteilt werden soll.
  • Wenn es um die Bearbeitung kommt, dass ausführen git reset HEAD ^ begehen. Der Effekt ist, dass der Kopf durch eine umgespult wird, und der Index folgt Anzug. Allerdings bleibt der Arbeits Baum gleich.
  • Nun fügen Sie die Änderungen an dem Index, den Sie in der ersten begehen haben wollen. Sie können git add (möglicherweise interaktiv) oder git-gui (oder beides) verwenden, das zu tun.
  • Commit den nun aktuellen Index mit dem, was Commitnachricht jetzt angemessen ist.
  • Wiederholen Sie die letzten beiden Schritte, bis der Arbeits Baum sauber ist.
  • Weiter das Fütterungsmaterial mit git rebase --continue.

Vielleicht git reflog können zwei bekommen commit vor ändern und nach ändern.

Dann git diff before_commit_id after_commit_id > d.diff diff zu erhalten, um zwischen vor und nach der Änderung ändern.

Als nächstes verwenden git checkout before_commit_id zu sichern, bevor commit

Und letzte Verwendung git apply d.diff die wirkliche Änderung zu übernehmen Sie getan haben.

Das löst mein Problem.

Möglicherweise erwähnenswert, dass, wenn Sie noch in Ihrem Editor mit der Nachricht begehen sind, können Sie die Commit-Nachricht löschen und es wird den git commit --amend Befehl abbrechen.

Sie können unten tun, um Ihre git commit —amend rückgängig zu machen

  1. git reset --soft HEAD^
  2. git checkout files_from_old_commit_on_branch
  3. git pull origin your_branch_name

====================================

Nun sind Ihre Änderungen sind laut vorherigen. Sie sind also mit der Undo für git commit —amend getan

Jetzt können Sie tun git push origin <your_branch_name>, um den Zweig zu drücken.

Wenn Sie die zu Fern begehen geschoben haben und dann irrtümlich geänderte Änderungen an, dass diese begehen wird Ihr Problem zu beheben. Geben Sie einen git log den SHA zu finden, bevor der Commit. (Dies setzt voraus, ist remote genannt Herkunft). Nun erteilt diesen Befehl, dass SHA verwendet wird.

git reset --soft <SHA BEFORE THE AMMEND>
#you now see all the changes in the commit and the amend undone

#save ALL the changes to the stash
git stash

git pull origin <your-branch> --ff-only
#if you issue git log you can see that you have the commit you didn't want to amend

git stash pop
#git status reveals only the changes you incorrectly amended

#now you can create your new unamended commit

Fast 9 Jahre zu spät dies aber nicht sehen, diese Variante erwähnte das gleiche erreichen (es ist so eine Art Kombination von einigen von ihnen, ähnlich wie nach oben Antwort ( https://stackoverflow.com/a/1459264/4642530 ).

Suche nach allen frei stehenden Köpfen auf Zweig

git reflog show origin/BRANCH_NAME --date=relative

Dann finden die SHA1-Hash

Zurücksetzen auf dem alten SHA1

git reset --hard SHA1

Drücken Sie sie dann wieder nach oben.

git push origin BRANCH_NAME

Fertig.

Dies wird Sie zurück zum alten zurückkehren begehen ganz.

(einschließlich dem Datum des Standes überschrieben abgelöst begehen Kopf)

  1. Zur Kasse zu temporärem Zweig mit letzten Commit

    git branch temp HEAD@{1}

  2. Zurücksetzen letzte commit

    git reset temp

  3. Nun, werden Sie alle Dateien haben Ihre sowie frühere begehen begehen. Überprüfen Sie den Status aller Dateien.

    git status

  4. Setzen Sie verpflichten Dateien von git Bühne.

    git reset myfile1.js (usw.)

  5. Bringen Sie diese commit

    git commit -C HEAD@{1}

  6. Fügen und verpflichten Ihre Dateien neu zu begehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top