Ich habe ein Git-Submodul in meinem Haupt-Git-Repo. Soweit ich weiß, speichert das Haupt-Repo einen SHA-Wert (irgendwo ...), der auf das spezifische Commit des Submoduls verweist, mit dem es "verknüpft" ist.
Ich ging in mein Submodul und tippte git checkout some_other_branch
. Ich habe keine Ahnung, von welchem Commit ich gekommen bin.
Ich möchte diesen Zeiger zurücksetzen, damit das Haupt-Repo und das Submodul wieder synchron sind.
Mein erster (wahrscheinlich naiver) Instinkt war zu sagen git reset --hard
- das scheint für alles andere zu funktionieren. Zu meiner Überraschung hat es in diesem Szenario nicht funktioniert.
Also habe ich herausgefunden, dass ich tippen git diff
, die SHA-ID notieren kann , die der Submodulzeiger früher hatte, und dann in das Submodul gehen und git checkout [SHA ID]
... aber es muss doch einen einfacheren Weg geben?
Da ich noch etwas über Git-Submodule lerne, können Sie meine Terminologie gerne korrigieren, wenn es Wörter für Konzepte gibt, die ich nicht kenne.
quelle
--init
. Ohne sie würden die Submodule in einem Zustand mit bleiben(new commits)
. Obwohl meine Submodule bereits initialisiert wurden.--init
Option ist dabei entscheidend. Ich wurde aufgefordert, Benutzername und Passwort einzugeben, da meine Submodule über https geklont wurden. Ich ging in beide Ordner und stellte die Fernbedienungen so ein, dass dasssh
Protokoll zum Auschecken verwendet wurde.Um das Commit zu ändern, auf das ein Submodul verweist, müssen Sie diese Version im Submodul auschecken und dann zum enthaltenen Repo zurückkehren, diese Änderung hinzufügen und festschreiben.
Wenn Sie möchten, dass sich das Submodul in der Version befindet, auf die das Top-Repo verweist, tun Sie dies
git submodule update --recursive
. Fügen--init
Sie hinzu, wenn Sie gerade geklont haben.Auch
git submodule
ohne ein Submodul Befehl wird Ihnen zeigen, die verpflichten Sie verweisen auf. Vor dem Commit steht ein - oder ein +, wenn es nicht synchron ist.Wenn Sie sich einen Baum mit einem Submodul ansehen, können Sie sehen, dass das Submodul
commit
im Gegensatz zu den übrigen Blobs oder Bäumen als markiert ist .Um zu sehen, was ein bestimmtes Commit für Submodule bedeutet, können Sie:
Sie können dann das Commit oder etwas anderes sehen, wenn Sie möchten, indem Sie es an das Protokoll usw. übergeben (mit der
git-dir
Option auf der Befehlsebene git können Sie überspringen, dass Sie eine CD zum Submodul herunterfahren müssen):quelle
Ein anderer Fall, auf den ich gerade gestoßen bin, ist, wenn es eine nicht bereitgestellte Änderung im Submodul gibt, die Sie verwerfen möchten. Das Git-Submodul-Update entfernt diese Änderung nicht und setzt Git --hard im übergeordneten Verzeichnis nicht zurück. Sie müssen in das Submodul-Verzeichnis gehen und einen Git-Reset durchführen --hard. Wenn ich also nicht bereitgestellte Änderungen sowohl in meinem übergeordneten als auch in meinem Submodul vollständig verwerfen möchte, gehe ich wie folgt vor:
In Eltern:
Im Submodul:
quelle
Verwenden Sie
git ls-tree HEAD
im Ordner "Superprojekt", um zu sehen, bei welchem Commit sich Ihr Submodul ursprünglich befand. Wechseln Sie dann in das Submodulverzeichnis und verwenden Sie, umgit log --oneline --decorate
zu sehen, in welchem Zweig sich das ursprüngliche Commit befindet. Schließlichgit checkout original-commit-branch
.Unter Verwendung einiger von mir eingerichteter Testverzeichnisse könnten die Befehle folgendermaßen aussehen:
Das "Superprojekt" zeigt das sm2-Submodul beim
f68bed6
Festschreiben , aber sm2 hat seinen HEAD bei5b8d48f
. Das Submodul-Commitf68bed6
enthält drei Zweige, die zum Auschecken im Submodulverzeichnis verwendet werden können.quelle
Die Antwort hier hat mein spezifisches Problem mit dem Submodul irgendwie nicht gelöst. Falls es Ihnen auch passiert, versuchen Sie Folgendes ...
https://kalyanchakravarthy.net/blog/git-discard-submodule-changes/
quelle
Ich wollte alle Änderungen im Submodul und auch in meinem Modul ignorieren
Der folgende Befehl hat mir geholfen:
quelle