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?

46voto

Nitin Garg Punkte 580

Wenn Sie alle Änderungen im gesamten Repository mitsamt den Untermodulen verwerfen möchten, können Sie dies tun:

git restore . --recurse-submodules

Hinweis dass dies nur alle lokalen Änderungen (im Repository und in allen Untermodulen) rückgängig macht.

Aber git reset ... nimmt eine target-commit-id als Eingabe, und kann die HEAD zu jeder Übergabe.

38voto

Sergiu Todirascu Punkte 1283

Das hat bei mir funktioniert, auch rekursiv in Submodule (vielleicht hat dein -f deshalb nicht funktioniert, weil du ein Submodul innerhalb des Submoduls geändert hast):

git submodule update -f --recursive

23voto

Jean Libera Punkte 461

Versuchen Sie zunächst dies, wie andere bereits gesagt haben:

git submodule update --init

Wenn das nicht funktioniert, wechseln Sie in das Submodul-Verzeichnis und verwenden Sie den folgenden Befehl, um zu sehen, ob es irgendwelche Änderungen am Submodul gibt:

git status

Wenn es Änderungen an Ihrem Submodul gibt, entfernen Sie diese. Überprüfen Sie, dass Sie keine Änderungen sehen, wenn Sie "git status" ausführen.

Gehen Sie dann zurück zum Hauptrepository und führen Sie erneut "git submodule update --init" aus.

13voto

VonC Punkte 1117238

Seit Git 2.14 (Q3 2017) müssen Sie nicht mehr in jedes Submodul gehen, um eine git reset (wie in git submodule foreach git reset --hard )

Das liegt daran, dass git reset nun selbst weiß, wie man rekursiv in Untermodule geht.

Siehe 35b96d1 festlegen (21. April 2017), und Übergabe f2d4899 , 823bab0 übertragen , festlegen cd279e2 (18 Apr 2017) von Stefan Beller ( stefanbeller ) .
(Zusammengefasst von Junio C. Hamano -- gitster -- sur festlegen 5f074ca , 29. Mai 2017)

builtin/reset: Schalter --recurse-submodules hinzufügen

git-reset ist ein weiterer funktionierender Baummanipulator, der über Untermodule unterrichtet werden sollte.

Wenn ein Benutzer git-reset verwendet und einen Rücksprung in s werden die Submodule auf den Objektnamen zurückgesetzt, der in der Datei Superprojekt aufgezeichneten Objektnamen zurück, wobei die HEADs entfernt werden.

Warnung : der Unterschied zwischen:

  • git reset --hard --recurse-submodule y
  • git submodule foreach git reset --hard

ist, dass ersteres auch den Arbeitsbaum des übergeordneten Projektarchivs zurücksetzt, während letzteres nur den Arbeitsbaum der Untermodule zurücksetzen würde.
Seien Sie also vorsichtig.

12voto

A. K. Punkte 29708

Das ist ganz einfach:

cd /path/to/submodule/root
git submodule update -f --init  .

Die meisten Antworten schlagen vor, alle Submodule zurückzusetzen, was meiner Meinung nach nicht der beste Ansatz ist, da es in diesen Submodulen legitime Änderungen geben könnte.

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