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?
Réponses:
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:
la source
master
branche, qui est extraite par défaut sur un clone. Si une branche autre quemaster
votre branche de développement principale doit être vérifiée avantgit reset
git checkout -b new_branch hash
cré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.git pull origin [branch]
autrement, afaik, c'est perdu.Vous pouvez utiliser simplement
dans cette séquence
Le hachage de validation ressemble à ceci "45ef55ac20ce2389c9180658fdba35f4a663d204"
la source
git reset --hard
devrait être évité, en faveur d'ungit checkout commit-hash
. Agit reset --hard
supprime une partie de l'historique git qui n'est parfois pas souhaitable.git init
n'est pas nécessaireUtilisez
git log
pour 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: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>
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:
De cette façon, vous ne perdez aucune information, vous pouvez donc passer à une révision plus récente lorsqu'elle devient stable.
la source
git checkout develop
où develop est le nom de votre branche.Si cette version que vous devez obtenir est soit une branche, soit une balise, alors:
la source
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 log
ou peut-être plus visuellement avec des outils commegitk
(peut-êtregitk --all
pour 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 degit tag <hash>
, puis les extraire dans de nouvelles copies de travail (par exemplegit checkout -b new_branch_name tag_name
ou directement avec le hachage au lieu du nom de la balise).la source
Vous pouvez le résoudre comme ceci:
où
sha
par exemple:85a108ec5d8443626c690a84bc7901195d19c446
Vous pouvez obtenir le sha souhaité avec la commande:
la source
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:
la source
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
la source
git reset
Résout probablement votre problème.la source