Git klonuje określoną wersję zdalnego repozytorium

181

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?

nandu
źródło
Możliwy duplikat stackoverflow.com/questions/3489173/…
Nicolas Raoul,
Możliwy duplikat Jak sklonować repozytorium git za pomocą określonej wersji / zestawu zmian?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Odpowiedzi:

242

Możesz „zresetować” swoje repozytorium do dowolnego zatwierdzenia, które chcesz (np. 1 miesiąc temu).

Użyj do tego git-reset :

git clone [remote_address_here] my_repo
cd my_repo
git reset --hard [ENTER HERE THE COMMIT HASH YOU WANT]
Rui Carneiro
źródło
27
Nie wspomniałeś o tym, ale to zresetuje tylko mastergałąź, która jest domyślnie wypisana na klonie. Jeśli gałąź inna niż masterTwoja główna gałąź rozwoju, którą musisz sprawdzić wcześniejgit reset
Steve Folly
16
dlaczego nie zrobiłbyś prostej kasy żądanego zatwierdzenia?
nemoo
10
Ponieważ po przejściu do określonego zatwierdzenia będziesz w stanie „odłączonej HEAD”.
Rui Carneiro
6
@RuiCarneiro lepiej byłoby użyć do git checkout -b new_branch hashutworzenia 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.
Loïc Faure-Lacroix
1
@YuriGhensev Jeśli zatwierdzenie zostało już przekazane do zdalnego oddziału, możesz zrobić git pull origin [branch]inaczej, afaik, utracone.
Rui Carneiro
94

Możesz użyć po prostu

git checkout  commithash

w tej sekwencji

git clone `URLTORepository`
cd `into your cloned folder`
git checkout commithash

zatwierdzenie skrótu wygląda tak: „45ef55ac20ce2389c9180658fdba35f4a663d204”

Człowiek ćma
źródło
9
Najbardziej podoba mi się ta odpowiedź. Uważam, że git reset --hardnależy unikać na korzyść git checkout commit-hash. git reset --hardUsuwa część git historii, która czasami nie jest pożądane.
Jordan Stewart
8
git initnie jest konieczne
Lautaro Paskevicius
37

Użyj, git logaby znaleźć wersję, którą chcesz wycofać, i zanotuj skrót zatwierdzenia. Następnie masz 2 opcje:

  1. Jeśli planujesz coś zatwierdzić po tej rewizji, polecam zamówienie w nowym oddziale:git checkout -b <new_branch_name> <hash>

  2. 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:

$ git log
commit 89915b4cc0810a9c9e67b3706a2850c58120cf75
Author: Jardel Weyrich <suppressed>
Date:   Wed Aug 18 20:15:01 2010 -0300

    Added a custom extension.

commit 4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7
Author: Jardel Weyrich <suppressed>
Date:   Wed Aug 18 20:13:48 2010 -0300

    Missing constness.

$ git checkout 4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7
Note: moving to '4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7'
which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
  git checkout -b <new_branch_name>
HEAD is now at 4553c14... Missing constness.

W ten sposób nie tracisz żadnych informacji, dzięki czemu możesz przejść do nowszej wersji, gdy stanie się stabilna.

Jweyrich
źródło
2
Ale również nie zauważaj, że masz odłączoną głowę, co jest odpowiednie dla operacji tylko do odczytu. Ale jeśli zamierzasz wprowadzić zmiany począwszy od tej wersji, musisz utworzyć nowy oddział. Zobacz sitaramc.github.com/concepts/detached-head.html więcej informacji.
Rudi
@Rudi: Dziękuję. To był tylko przykład pokazujący użycie. Zaktualizowano, aby o tym wspomnieć.
jweyrich
Aby powrócić do „statusu pracy”, możesz po prostu określić, git checkout developgdzie develop jest nazwa twojego oddziału.
Steve Tauber,
1
@SteveTauber dobrze, zakładając, ty masz inny oddział, który działa , zmieniając się, że oddział jest rzeczywiście mało.
jweyrich
19

Jeśli ta wersja, którą musisz uzyskać, to gałąź lub znacznik, to:

git clone -b branch_or_tag_name repo_address_or_path
unclechu
źródło
2

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 loga może bardziej wizualnie, narzędzi takich jak gitk(być może, gitk --allaby 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ład git checkout -b new_branch_name tag_namelub bezpośrednio za pomocą skrótu zamiast nazwy znacznika).

Bruno
źródło
1

Możesz to rozwiązać w następujący sposób:

git reset --hard sha

gdzie shanp .:85a108ec5d8443626c690a84bc7901195d19c446

Możesz uzyskać pożądany sha za pomocą polecenia:

git log
Ghislain Zabatio
źródło
1

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:

# Make remote with 4 commits, and local with just one.
mkdir server
cd server
git init
touch 1
git add 1
git commit -m 1
git clone ./ ../local
for i in {2..4}; do
    touch "$i"
    git add "$i"
    git commit -m "$i"
done

# Before last commit.
SHA3="$(git log --format='%H' --skip=1 -n1)"
# Last commit.
SHA4="$(git log --format='%H' -n1)"

# Failing control without feature.
cd ../local
# Does not give an error, but does not fetch either.
git fetch origin "$SHA3"
# Error.
git checkout "$SHA3"

# Enable the feature.
cd ../server
git config uploadpack.allowReachableSHA1InWant true

# Now it works.
cd ../local
git fetch origin "$SHA3"
git checkout "$SHA3"
# Error.
git checkout "$SHA4"
Ciro Santilli
źródło
0

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

gpampara
źródło
0

Prawdopodobnie git resetrozwiązuje twój problem.

git reset --hard -#commit hash-

źródło