Clone do Git versão específica do repositório remoto

181

Eu clonei um repositório remoto do git cerca de um mês atrás. O repositório remoto passou por muitas alterações e agora ficou instável. Agora preciso de outra cópia do repositório, versão idêntica à que eu clonei há um mês.

Como eu faço isso?

nandu
fonte
Possível duplicado de stackoverflow.com/questions/3489173/...
Nicolas Raoul

Respostas:

242

Você pode "redefinir" seu repositório para qualquer confirmação que desejar (por exemplo, 1 mês atrás).

Use git-reset para isso:

git clone [remote_address_here] my_repo
cd my_repo
git reset --hard [ENTER HERE THE COMMIT HASH YOU WANT]
Rui Carneiro
fonte
27
Você não mencionou, mas isso redefinirá apenas a masterramificação, que é retirada por padrão em um clone. Se um ramo que não masterseja o principal ramo de desenvolvimento que deve ser verificado antes antesgit reset
Steve Folly
16
por que você não faria um checkout simples do commit desejado?
Nemoo # 23/13
10
Porque você estará no estado "desanexado HEAD" após o checkout para um commit específico.
Rui Carneiro
6
@RuiCarneiro, seria melhor usar git checkout -b new_branch hashvocê para criar uma nova ramificação com base no hash sem tocar em nenhuma outra ramificação. Mover a cabeça de uma ramificação existente pode causar problemas na hora de enviar algo para um servidor remoto.
Loïc Faure-Lacroix
1
@YuriGhensev Se o commit já foi enviado para uma ramificação remota, você pode fazer o git pull origin [branch]contrário, após isso ele será perdido.
Rui Carneiro
94

Você pode usar simplesmente

git checkout  commithash

nesta sequência

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

o hash de confirmação tem esta aparência "45ef55ac20ce2389c9180658fdba35f4a663d204"

M.Othman
fonte
9
Eu gosto desta resposta da melhor maneira. Eu acho que a git reset --harddeve ser evitado, a favor de a git checkout commit-hash. A git reset --hardremove parte da história do git, que às vezes não é desejável.
Jordan Stewart
8
git initnão é necessário
Lautaro Paskevicius
37

Use git logpara encontrar a revisão para a qual você deseja reverter e anote o hash de confirmação. Depois disso, você tem 2 opções:

  1. Se você planeja confirmar qualquer coisa após essa revisão, recomendo que faça o checkout para uma nova ramificação:git checkout -b <new_branch_name> <hash>

  2. Se você não planeja confirmar nada após essa revisão, pode simplesmente fazer o checkout sem uma ramificação: git checkout <hash>- NOTA: Isso colocará seu repositório no estado 'desanexado HEAD', o que significa que ele não está atualmente anexado a nenhuma ramificação - então você ' Terei algum trabalho extra para mesclar novas confirmações em uma ramificação real .

Exemplo:

$ 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.

Dessa forma, você não perde nenhuma informação e, portanto, pode passar para uma revisão mais nova quando ela se tornar estável.

jweyrich
fonte
2
Mas também observe que você está em uma cabeça desanexada, o que é bom para operações somente leitura. Mas quando você pretende fazer alterações a partir desta revisão, você precisa criar uma nova ramificação. Consulte sitaramc.github.com/concepts/detached-head.html para obter mais informações.
Rudi
@ Rudi: Obrigado. Foi apenas um exemplo para mostrar o uso. Atualizado para mencionar.
precisa saber é o seguinte
Para voltar ao "status de trabalho", você pode exatamente git checkout developonde desenvolver é o nome da sua filial.
Steve Tauber
1
@SteveTauber bem, supondo que você tenha um ramo diferente que esteja funcionando , basta mudar para esse ramo.
jweyrich
19

Se a versão que você precisa obter for uma ramificação ou uma tag, então:

git clone -b branch_or_tag_name repo_address_or_path
unclechu
fonte
2

Diferentemente dos sistemas centralizados de controle de versão, o Git clona todo o repositório, para que você não apenas obtenha os arquivos remotos atuais, mas também todo o histórico. Seu repositório local incluirá tudo isso.

Pode ter havido tags para marcar uma versão específica no momento. Caso contrário, você pode criá-los localmente. Uma boa maneira de fazer isso é usar git logou talvez mais visualmente com ferramentas como gitk(talvez gitk --allver todos os ramos e tags). Se você conseguir identificar os hashes de consolidação que foram usados ​​no momento, poderá marcá-los usando git tag <hash>e depois verificá-los em novas cópias de trabalho (por exemplo, git checkout -b new_branch_name tag_nameou diretamente com o hash em vez do nome da marca).

Bruno
fonte
1

Você pode resolvê-lo assim:

git reset --hard sha

onde shapor exemplo:85a108ec5d8443626c690a84bc7901195d19c446

Você pode obter o sha desejado com o comando:

git log
Ghislain Zabatio
fonte
1

uploadpack.allowReachableSHA1InWant

Desde o Git 2.5.0, essa variável de configuração pode ser ativada no servidor, aqui a solicitação do recurso GitHub e o GitHub confirmam a ativação desse recurso .

O Bitbucket Server o ativou desde a versão 5.5 ou superior .

Uso:

# 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 adicionou uma nova foto
fonte
0

A árvore de origem que você está exigindo ainda está disponível no repositório git; no entanto, você precisará do SHA1 do commit no qual está interessado. Suponho que você possa obter o SHA1 do clone atual que você possui?

Se você conseguir o SHA1, poderá criar uma ramificação / redefinição para ter o repositório idêntico.

Comandos conforme a resposta de Rui

gpampara
fonte
0

Provavelmente git resetresolve o seu problema.

git reset --hard -#commit hash-

fonte