it-swarm.com.de

Wie stelle ich eine frühere Version als neues Commit in Git wieder her?

Erstens habe ich die Antwort auf diese Frage hier schon einmal gesehen, aber sie wird von so vielen "Antworten" begraben, die meine Frage nicht richtig beantworten, dass ich sie nicht wiederfinden kann.

Hier ist es also: Wie stelle ich in Git eine frühere Version in meinem Verlauf wieder her, sodass es das neue Festschreiben über dem aktuellen Verlauf wird?

Grundsätzlich ist dies die grundlegendste Sache, die ich mit einem Versionskontrollsystem machen möchte. Das einfache Zurücksetzen funktioniert nicht, weil es meinen Verlauf verwirft, und das einfache Zurücksetzen funktioniert auch nicht, weil mir manchmal Fehlermeldungen angezeigt werden (was ich tun möchte, sollte ohne Fehlermeldungen möglich sein).

Bearbeiten: Wenn ich nur einen git revert mache, passiert dieser Fehler:

git revert HEAD~1
error: could not revert f1b44e3... Towards translating API to kernel.
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
6
Steven Obua

Einfach "checkout the commit". Dies überschreibt Ihr aktuelles Arbeitsverzeichnis mit dem angegebenen Schnappschuss (Commit) Ihres Repos aus dem Verlauf und macht dieses zu Ihrem neuen Arbeitsset, das Sie bereitstellen und festschreiben können, wie Sie möchten. Wenn Sie commit unmittelbar danach ausführen, hat Ihr Repo den gleichen Dateisysteminhalt wie das Commit, für das Sie checkout ausgeführt haben (vorausgesetzt, Sie haben keine anderen nicht bereitgestellten oder bereitgestellten Änderungen vorgenommen).

Dies wird nicht den Verlauf umschreiben oder vorherige Commits bearbeiten oder löschen - es funktioniert also ähnlich wie ein "Rollback" auf Mediawiki:

cd ~/git/your-repo-root
git log
# find the commit id you want
git checkout <commitId> . 
# IMPORTANT NOTE: the trailing `.` in the previous line is important!
git commit -m "Restoring old source code"

Siehe auch: Rollback zu einem alten Git-Commit in einem öffentlichen Repo

Zum . (Punkt)

Das Zeichen . (Punkt) bedeutet "aktuelles Verzeichnis" - es ist nichts Besonderes oder Einzigartiges für git. Es handelt sich um eine Standardkonvention für Befehlszeilen-Dateisysteme, die unter Windows, Linux, MacOS und sogar MS-DOS identisch ist. Es funktioniert ähnlich wie .. "übergeordnetes Verzeichnis" bedeutet. Ich empfehle diese zu lesen:

In Bezug auf checkout

Beachten Sie: checkout ist ein überladener Befehl in git - es kann bedeuten, die Zweige zu wechseln (a la svn switch) oder eine bestimmte Datei abzurufen oder aus dem Verlauf zu übernehmen und in Ihren Arbeitsbereich zu stellen (a la svn update -r <id>). Es kann auch andere Dinge bedeuten: https://git-scm.com/docs/git-checkout - Ich schätze, es kann Leute verwirren, besonders mich selbst, als ich anfing, Git zu benutzen, nachdem ich TFS jahrelang benutzt hatte (wo "Checkout "bedeutet etwas ganz anderes).

6
Dai

Verwenden Sie git revert https://git-scm.com/docs/git-revert

git revert HEAD~1
0
Vyacheslav Enis

Bearbeiten: Ich sehe, dass Sie den Verlauf behalten möchten, daher ist meine Antwort unten ungültig. Es ist jedoch immer noch nützlich. Sie können die Zeilen im Editor neu anordnen und fortfahren.

Nun zurück zur ursprünglichen Antwort.

Sie könnten den Rebase-Befehl versuchen.

git rebase -i HEAD~n

Dabei ist n ungefähr eins mehr als die Anzahl der Festschreibungen zwischen der aktuellen und derjenigen, zu der Sie zurückkehren möchten. Nehmen wir also an, Sie löschen die letzten drei Commits:

git rebase -i HEAD~4

Sobald Sie dort sind, wird es in VIM oder Nano (oder einem anderen Editor) geöffnet. Löschen Sie einfach die Zeilen der zu entfernenden Commits und beenden Sie den Editor.

In VIM wäre das esc und geben Sie :exitenter ein.

Jetzt schieben Sie es einfach. Dies führt zu einem Fehler. Führen Sie einen Force Push durch.

git Push -f

Möglicherweise müssen Sie auch den Filialnamen und den Upstream angeben. Das sollte es tun!

Diese Methode löscht die fehlerhaften Festschreibungen vollständig , sodass nicht nur eine neue Festschreibung mit den zurückgesetzten Änderungen hinzugefügt wird.

Hier sind die Dokumente: https://git-scm.com/docs/rebase

0
spikespaz