453 Stimmen

Wie kann ich meine Änderungen an einem Git-Submodul rückgängig machen?

Ich habe ein Git-Submodul (RestKit), die ich zu meinem Repo hinzugefügt haben.

Ich habe dort versehentlich einige Dateien geändert und würde gerne zur Ausgangsversion zurückkehren. Um das zu tun, habe ich versucht, Folgendes auszuführen

Mac:app-ios user$ git submodule update RestKit

Aber wie Sie hier sehen können, hat dies nicht funktioniert, da es sich immer noch um "geänderte Inhalte" handelt:

Mac:app-ios user$ git status
...
#   modified:   RestKit (modified content)

Sogar

Mac:app-ios user$ git submodule update -f RestKit 

macht lokal geänderte Dateien nicht rückgängig.
Wie kann ich den Inhalt dieses Submoduls zurücksetzen?

499voto

qwertzguy Punkte 12729

Diese Methode ist ausfallsicherer als alle bisherigen Antworten:

git submodule deinit -f .
git submodule update --init

Der erste Befehl hebt die Bindung aller Untermodule vollständig auf, der zweite Befehl führt einen erneuten Checkout der Module durch.
Es dauert länger als die anderen Methoden, funktioniert aber unabhängig vom Zustand Ihrer Submodule.

395voto

theraven Punkte 4365

Wenn Sie dies für alle Untermodule tun wollen, ohne die Verzeichnisse wechseln zu müssen, können Sie

git submodule foreach git reset --hard

Sie können auch das rekursive Flag verwenden, um alle Untermodule zu berücksichtigen:

git submodule foreach --recursive git reset --hard

271voto

Jamie Penney Punkte 9110

Wechseln Sie in das Verzeichnis des Submoduls und führen Sie dann ein git reset --hard um alle geänderten Dateien auf ihren zuletzt übertragenen Zustand zurückzusetzen. Beachten Sie, dass dabei alle nicht übertragenen Änderungen verworfen werden.

95voto

checksum Punkte 6037

Nun, für mich ist die

git reset --hard

setzt das Submodul einfach auf den Zustand zurück, in dem es ausgecheckt wurde, und nicht auf den Zustand, auf den das Hauptrepository verweist. Ich werde immer noch "modifizierte Inhalte" haben, wie OP sagte. Also, um das Submodul wieder auf den richtigen Commit zu bringen, führe ich aus:

git submodule update --init

Und wenn ich das tue git status ist es sauber auf dem Submodul.

56voto

jiahut Punkte 1393

4 Schritte nacheinander durchführen:

git submodule foreach git reset --hard HEAD
git submodule update
git submodule foreach "git checkout master; git pull"
git submodule foreach git clean -f

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X