Git clone une version particulière du référentiel distant

181

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

Comment puis-je faire cela?

nandu
la source
Possible duplicata de stackoverflow.com/questions/3489173/...
Nicolas Raoul
Duplication possible de Comment cloner le dépôt git avec une révision / un ensemble de modifications spécifique?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

242

Vous pouvez "réinitialiser" votre dépôt à n'importe quel commit que vous voulez (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]
Rui Carneiro
la source
27
Vous ne l'avez pas mentionné, mais cela ne réinitialisera que la masterbranche, qui est extraite par défaut sur un clone. Si une branche autre que mastervotre branche de développement principale doit être vérifiée avantgit reset
Steve Folly
16
pourquoi ne feriez-vous pas une simple extraction du commit voulu?
nemoo
10
Parce que vous serez dans l'état "HEAD détaché" après l'extraction d'un commit particulier.
Rui Carneiro
6
@RuiCarneiro, il serait préférable de git checkout -b new_branch hashcréer une nouvelle branche basée sur le hachage sans toucher à aucune autre branche. Le déplacement de la tête d'une branche existante peut poser des problèmes lorsqu'il est temps de pousser quelque chose vers un serveur distant.
Loïc Faure-Lacroix
1
@YuriGhensev Si le commit a déjà été poussé vers une branche distante, vous pouvez faire git pull origin [branch]autrement, afaik, c'est perdu.
Rui Carneiro le
94

Vous pouvez utiliser simplement

git checkout  commithash

dans cette séquence

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

Le hachage de validation ressemble à ceci "45ef55ac20ce2389c9180658fdba35f4a663d204"

M.Othman
la source
9
J'aime bien cette réponse. Je pense qu'un git reset --harddevrait être évité, en faveur d'un git checkout commit-hash. A git reset --hardsupprime une partie de l'historique git qui n'est parfois pas souhaitable.
Jordan Stewart
8
git initn'est pas nécessaire
Lautaro Paskevicius
37

Utilisez git logpour trouver la révision vers laquelle vous souhaitez revenir en arrière et prenez note du hachage de validation. Après cela, vous avez 2 options:

  1. Si vous prévoyez de valider 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 de valider quoi que ce soit après cette révision, vous pouvez simplement vérifier sans branche: git checkout <hash>- REMARQUE: cela mettra votre référentiel dans un état `` HEAD détaché '', ce qui signifie qu'il n'est actuellement attaché à aucune branche - alors vous ' J'ai 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 révision plus récente lorsqu'elle devient stable.

Jweyrich
la source
2
Mais aussi pas que vous soyez sur une tête détachée, ce qui est OK pour les opérations en lecture seule. Mais lorsque vous avez l'intention d'apporter des modifications à partir de cette révision, vous devez créer une nouvelle branche. Voir sitaramc.github.com/concepts/detached-head.html pour plus d'informations.
Rudi
@Rudi: Merci. C'était juste un exemple pour montrer l'utilisation. Mis à jour pour le mentionner.
jweyrich
Pour revenir au "statut de travail", vous pouvez juste git checkout developoù develop est le nom de votre branche.
Steve Tauber
1
@SteveTauber bien, en supposant que vous ayez une branche différente qui fonctionne , changer vers cette branche suffit en effet.
jweyrich
19

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
unclechu
la source
2

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

Il peut y avoir eu des balises pour marquer une version particulière à l'époque. Sinon, vous pouvez les créer vous-même localement. Une bonne façon de faire est d'utiliser git logou peut-être plus visuellement avec des outils comme gitk(peut-être gitk --allpour voir toutes les branches et balises). Si vous pouvez repérer les hachages de validation qui ont été utilisés à l'époque, vous pouvez les étiqueter à l'aide de git tag <hash>, puis les extraire dans de nouvelles copies de travail (par exemple git checkout -b new_branch_name tag_nameou directement avec le hachage au lieu du nom de la balise).

Bruno
la source
1

Vous pouvez le résoudre comme ceci:

git reset --hard sha

shapar exemple:85a108ec5d8443626c690a84bc7901195d19c446

Vous pouvez obtenir le sha souhaité avec la commande:

git log
Ghislain Zabatio
la source
1

uploadpack.allowReachableSHA1InWant

Depuis Git 2.5.0 cette variable de configuration peut être activée sur le serveur, ici la demande de fonctionnalité GitHub et le commit GitHub activant 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"
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
la source
0

L'arbre source dont vous avez besoin est toujours disponible dans le dépôt git, cependant, vous aurez besoin du SHA1 du commit qui vous intéresse. Je suppose que vous pouvez obtenir le SHA1 à partir du clone actuel que vous avez?

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

Commandes selon la réponse de Rui

gpampara
la source
0

git resetRésout probablement votre problème.

git reset --hard -#commit hash-

la source