web-dev-qa-db-fra.com

Git clone une version particulière du dépôt distant

J'ai cloné un référentiel git distant il y a environ un mois. Le référentiel distant a subi de nombreuses modifications et est maintenant devenu instable. Maintenant, j'ai besoin d'une autre copie du référentiel, de version identique à celle que j'ai clonée il y a un mois.

Comment puis-je faire cela?

149
nandu

Vous pouvez "réinitialiser" votre référentiel sur n'importe quel commit (par exemple, il y a 1 mois). 

Utilisez git-reset pour cela:

git clone [remote_address_here] my_repo
cd my_repo
git reset --hard [ENTER HERE THE COMMIT HASH YOU WANT]
199
Rui Carneiro

Vous pouvez utiliser simplement 

git checkout  commithash

dans cette séquence

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

commit hash ressemble à ceci "45ef55ac20ce2389c9180658fdba35f4a663d204"

66
M.Othman

Utilisez git log pour rechercher la révision à laquelle vous voulez revenir et prenez note du hachage de validation. Après cela, vous avez 2 options:

  1. Si vous prévoyez de commettre quoi que ce soit après cette révision, je vous recommande de passer à une nouvelle branche: git checkout -b <new_branch_name> <hash>

  2. Si vous ne prévoyez rien commettre après cette révision, vous pouvez simplement extraire votre commande sans branche: git checkout <hash> - REMARQUE: cela placera votre référentiel dans un état "en tête", ce qui signifie qu'il n'est actuellement associé à aucun branch - then vous aurez du travail supplémentaire pour fusionner les nouveaux commits dans une branche réelle .

Exemple:

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

De cette façon, vous ne perdez aucune information, vous pouvez donc passer à une nouvelle révision lorsqu'elle devient stable.

31
jweyrich

Si cette version que vous devez obtenir est soit une branche, soit une balise, alors:

git clone -b branch_or_tag_name repo_address_or_path
4
unclechu

Contrairement aux systèmes de contrôle de version centralisés, Git clone l'ensemble du référentiel, de sorte que vous n'obtenez pas uniquement les fichiers distants actuels, mais également l'historique complet. Votre référentiel local inclura tout cela.

Il aurait pu y avoir tags pour marquer une version particulière à la fois. Sinon, vous pouvez les créer vous-même localement. Un bon moyen consiste à utiliser git log ou peut-être plus visuellement avec des outils tels que gitk (peut-être gitk --all pour voir toutes les branches et les balises). Si vous pouvez repérer les hachages de validation utilisés à l'époque, vous pouvez les marquer à l'aide de git tag <hash>, puis les extraire dans de nouvelles copies de travail (par exemple git checkout -b new_branch_name tag_name ou directement avec le hachage au lieu du nom de la balise).

2
Bruno

Vous pouvez le résoudre comme ceci:

git reset --hard sha

sha exemple: 85a108ec5d8443626c690a84bc7901195d19c446

Vous pouvez obtenir le sha désiré avec la commande: 

git log
1
Ghislain Zabatio

git reset résout probablement votre problème.

git reset --hard -#commit hash-
0
user4783046

L'arborescence dont vous avez besoin est toujours disponible dans le référentiel git. Cependant, vous aurez besoin de la SHA1 du commit qui vous intéresse. Je suppose que vous pouvez obtenir la SHA1 à partir du clone actuel que vous avez?

Si vous pouvez obtenir ce SHA1, vous pouvez créer une branche/réinitialiser à cet emplacement pour avoir le même référentiel.

Commandes selon la réponse de Rui

0
gpampara

uploadpack.allowReachableSHA1InWant

Puisque Git 2.5.0 cette variable de configuration peut être activée sur le serveur, voici la demande de fonctionnalité GitHub et la validation/ GitHub qui active cette fonctionnalité .

Bitbucket Server l’a activé depuis la version 5.5+ .

Usage:

# 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"