Mam podmoduł git w moim głównym repozytorium git. Jak rozumiem, repozytorium główne przechowuje wartość SHA (gdzieś ...), wskazując na konkretne zatwierdzenie podmodułu, z którym jest „połączone”.
Wszedłem do mojego podmodułu i napisałem git checkout some_other_branch
. Nie mam pojęcia, z jakiego popełnienia pochodzę.
Chciałbym przywrócić ten wskaźnik, aby repozytorium główne i moduł podrzędny były ponownie zsynchronizowane.
Moim pierwszym (prawdopodobnie naiwnym) odruchem było stwierdzenie git reset --hard
- to wydaje się działać na wszystko inne. Ku mojemu zdziwieniu nie zadziałało to w tym scenariuszu.
Więc wymyśliłem, że mogę pisać git diff
, zanotować identyfikator SHA, który miał wskaźnik podmodułu, a następnie udać się do podmodułu i git checkout [SHA ID]
... ale na pewno musi być łatwiejszy sposób?
Ponieważ wciąż uczę się o modułach podrzędnych git, prosimy o poprawienie mojej terminologii, jeśli są słowa na koncepcje, których nie znam.
źródło
--init
. Bez tego submoduły pozostałyby w stanie z(new commits)
. Mimo że moje moduły podrzędne zostały już zainicjowane.--init
opcja jest w tym wszystkim kluczowa. Otrzymałem monit o podanie nazwy użytkownika i hasła, ponieważ moje podmoduły zostały sklonowane przez https. Wszedłem do obu folderów i ustawiłem piloty, aby używałyssh
protokołu do kasy.Aby zmienić zatwierdzenie, na które wskazuje podmoduł, musisz pobrać tę wersję w module podrzędnym, a następnie wrócić do zawierającego repozytorium, dodać i zatwierdzić tę zmianę.
Lub, jeśli chcesz, aby podmoduł był w wersji, na którą wskazuje najlepsze repozytorium, zrób
git submodule update --recursive
. Dodaj,--init
jeśli właśnie sklonowałeś.Również
git submodule
bez komendy podmodułu pokaże ci zatwierdzenie, na które wskazujesz. Przed zatwierdzeniem pojawi się - lub +, jeśli nie jest zsynchronizowane.Jeśli spojrzysz na drzewo zawierające podmoduł, zobaczysz, że podmoduł jest oznaczony jako, w
commit
przeciwieństwie do pozostałych, które są kropkami lub drzewami.aby zobaczyć, co konkretne zatwierdzenie wskazuje na podmoduły, możesz:
możesz wtedy zobaczyć zatwierdzenie lub cokolwiek innego, jeśli chcesz, przekazując to do dziennika itp. (
git-dir
opcja na poziomie polecenia git pozwala pominąć konieczność przechodzenia do modułu podrzędnego):źródło
Innym przypadkiem, na który właśnie natknąłem się, jest niestabilna zmiana w module podrzędnym, którą chcesz odrzucić. Aktualizacja modułu podrzędnego git nie usunie tej zmiany ani git reset --hard w katalogu nadrzędnym. Musisz przejść do katalogu modułów podrzędnych i wykonać reset gita - hard. Jeśli więc chcę całkowicie odrzucić zmiany niestacjonarne zarówno w module nadrzędnym, jak i podrzędnym, wykonuję następujące czynności:
W rodzicu:
W module podrzędnym:
źródło
Użyj
git ls-tree HEAD
w folderze "superproject", aby zobaczyć, w jakim zatwierdzeniu był pierwotnie twój podmoduł. Następnie przejdź do katalogu podmodułów i użyj,git log --oneline --decorate
aby zobaczyć, w której gałęzi znajduje się oryginalne zatwierdzenie. Wreszciegit checkout original-commit-branch
.Korzystając z niektórych skonfigurowanych przeze mnie katalogów testowych, oto jak mogą wyglądać polecenia:
"Superproject" pokazuje podmoduł sm2 po zatwierdzeniu,
f68bed6
ale sm2 ma jego HEAD w5b8d48f
. Zatwierdzenie podmodułuf68bed6
ma trzy rozgałęzienia, które mogą być użyte do pobrania w katalogu podmodułów.źródło
Odpowiedź tutaj w jakiś sposób nie rozwiązała mojego konkretnego problemu z modułem podrzędnym, więc jeśli ci się to przydarzy, wypróbuj następujące ...
https://kalyanchakravarthy.net/blog/git-discard-submodule-changes/
źródło
Chciałem zignorować wszelkie zmiany w module podrzędnym, a także w moim module
Pomogło mi poniższe polecenie:
źródło