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.
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"
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:
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>
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.
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:
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).
# 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"
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.
Respostas:
Você pode "redefinir" seu repositório para qualquer confirmação que desejar (por exemplo, 1 mês atrás).
Use git-reset para isso:
fonte
master
ramificação, que é retirada por padrão em um clone. Se um ramo que nãomaster
seja o principal ramo de desenvolvimento que deve ser verificado antes antesgit reset
git checkout -b new_branch hash
você 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.git pull origin [branch]
contrário, após isso ele será perdido.Você pode usar simplesmente
nesta sequência
o hash de confirmação tem esta aparência "45ef55ac20ce2389c9180658fdba35f4a663d204"
fonte
git reset --hard
deve ser evitado, a favor de agit checkout commit-hash
. Agit reset --hard
remove parte da história do git, que às vezes não é desejável.git init
não é necessárioUse
git log
para encontrar a revisão para a qual você deseja reverter e anote o hash de confirmação. Depois disso, você tem 2 opções: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>
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:
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.
fonte
git checkout develop
onde desenvolver é o nome da sua filial.Se a versão que você precisa obter for uma ramificação ou uma tag, então:
fonte
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 log
ou talvez mais visualmente com ferramentas comogitk
(talvezgitk --all
ver todos os ramos e tags). Se você conseguir identificar os hashes de consolidação que foram usados no momento, poderá marcá-los usandogit tag <hash>
e depois verificá-los em novas cópias de trabalho (por exemplo,git checkout -b new_branch_name tag_name
ou diretamente com o hash em vez do nome da marca).fonte
Você pode resolvê-lo assim:
onde
sha
por exemplo:85a108ec5d8443626c690a84bc7901195d19c446
Você pode obter o sha desejado com o comando:
fonte
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:
fonte
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
fonte
Provavelmente
git reset
resolve o seu problema.fonte