Sklonowałem zdalne repozytorium git około miesiąc temu. Zdalne repozytorium przeszło wiele zmian i teraz stało się niestabilne. Teraz potrzebuję kolejnej kopii repozytorium, wersji identycznej z tą, którą sklonowałem miesiąc temu.
Jak mam to zrobic?
Odpowiedzi:
Możesz „zresetować” swoje repozytorium do dowolnego zatwierdzenia, które chcesz (np. 1 miesiąc temu).
Użyj do tego git-reset :
źródło
master
gałąź, która jest domyślnie wypisana na klonie. Jeśli gałąź inna niżmaster
Twoja główna gałąź rozwoju, którą musisz sprawdzić wcześniejgit reset
git checkout -b new_branch hash
utworzenia nowego oddziału na podstawie skrótu bez dotykania innych gałęzi. Przesunięcie głowy istniejącego oddziału może powodować problemy, gdy nadejdzie czas, aby przekazać coś na zdalny serwer.git pull origin [branch]
inaczej, afaik, utracone.Możesz użyć po prostu
w tej sekwencji
zatwierdzenie skrótu wygląda tak: „45ef55ac20ce2389c9180658fdba35f4a663d204”
źródło
git reset --hard
należy unikać na korzyśćgit checkout commit-hash
.git reset --hard
Usuwa część git historii, która czasami nie jest pożądane.git init
nie jest konieczneUżyj,
git log
aby znaleźć wersję, którą chcesz wycofać, i zanotuj skrót zatwierdzenia. Następnie masz 2 opcje:Jeśli planujesz coś zatwierdzić po tej rewizji, polecam zamówienie w nowym oddziale:
git checkout -b <new_branch_name> <hash>
Jeśli po tej rewizji nie planujesz niczego zatwierdzać, możesz po prostu dokonać transakcji bez oddziału:
git checkout <hash>
- UWAGA: Spowoduje to przejście repozytorium w stan „odłączonej HEAD”, co oznacza, że nie jest on obecnie przyłączony do żadnej gałęzi - wtedy „ Będę miał trochę pracy, aby scalić nowe commity z rzeczywistym oddziałem .Przykład:
W ten sposób nie tracisz żadnych informacji, dzięki czemu możesz przejść do nowszej wersji, gdy stanie się stabilna.
źródło
git checkout develop
gdzie develop jest nazwa twojego oddziału.Jeśli ta wersja, którą musisz uzyskać, to gałąź lub znacznik, to:
źródło
W przeciwieństwie do scentralizowanych systemów kontroli wersji, Git klonuje całe repozytorium, więc nie tylko otrzymujesz bieżące zdalne pliki, ale całą historię. Twoje lokalne repozytorium obejmie to wszystko.
W tym czasie mogły istnieć tagi do oznaczenia konkretnej wersji. Jeśli nie, możesz utworzyć je samodzielnie. Dobrym sposobem na to jest użycie,
git log
a może bardziej wizualnie, narzędzi takich jakgitk
(być może,gitk --all
aby zobaczyć wszystkie gałęzie i tagi). Jeśli zauważysz skróty zatwierdzeń, które były w tym czasie używane, możesz je oznaczyć za pomocą,git tag <hash>
a następnie sprawdzić je w nowych kopiach roboczych (na przykładgit checkout -b new_branch_name tag_name
lub bezpośrednio za pomocą skrótu zamiast nazwy znacznika).źródło
Możesz to rozwiązać w następujący sposób:
gdzie
sha
np .:85a108ec5d8443626c690a84bc7901195d19c446
Możesz uzyskać pożądany sha za pomocą polecenia:
źródło
uploadpack.allowReachableSHA1InWant
Od wersji Git 2.5.0 tę zmienną konfiguracyjną można włączyć na serwerze, tutaj żądanie funkcji GitHub i zatwierdzenie GitHub włączające tę funkcję .
Serwer Bitbucket włączył go od wersji 5.5+ .
Stosowanie:
źródło
Drzewo źródłowe, którego potrzebujesz, jest nadal dostępne w repozytorium git, jednak będziesz potrzebować SHA1 zatwierdzenia, które Cię interesuje. Zakładam, że możesz uzyskać SHA1 z bieżącego klonu, który posiadasz?
Jeśli możesz uzyskać ten SHA1, możesz utworzyć tam oddział / reset, aby mieć identyczne repozytorium.
Polecenia zgodnie z odpowiedzią Rui
źródło
Prawdopodobnie
git reset
rozwiązuje twój problem.źródło