Git: mise à jour d'un référentiel de révision
Dire que j'ai un référentiel qui a un numéro de révision A. Et je voudrais le mettre à jour à la révision B, tandis que la dernière révision est C. (révision A est antérieur à B, et B est antérieure à celle de C). Je suis nouveau sur git, donc j'ai fait quelques recherches et trouvé cette, qui m'inspire une solution:
git pull # update from A to the latest revision C
git reset --hard B
Qui ne fonctionne pas. Mais puisque je ne peux pas git reset --hard B
de Un directement, le précédent dernière mise à jour est encore trop lourd, je me demande, il pourrait y en avoir quelques une de ligne de commande pour correspondre à mon besoin. Tous les indicateurs s'il vous plaît?
OriginalL'auteur | 2013-07-30
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de "mise à jour d'un référentiel vers une certaine version". Vous référentiel a toutes les versions, c'est ce que
git fetch
/git pull
.Si vous voulez mettre une révision spécifique de l'opération dans votre travail actuel arbre localement, il y a plusieurs façons de le faire. Le plus proche à vos questions est:
mise à jour de votre référentiel local:
créer une nouvelle branche (quelle qu'en soit la direction générale vous êtes actuellement sur, nous allons réinitialiser dur, plus tard, de sorte qu'il n'a pas d'importance):
Ci-dessus 2 opérations peut être abrégé en un seul (l'actuel CHEF est considéré comme la source de la branche):
puis placez le pointeur de la branche pour la livraison vous avez besoin (
B
):git reset --hard fonctionnera toujours, il ne dépend pas de votre direction générale de l'histoire, la seule condition pour que cela fonctionne est que commettre B est en local sur l'objet de base (c'est à dire B doit exister et doit avoir été récupéré à partir d'une distance repo est qu'il n'est pas votre travail).
@Hasturkun points, vous pouvez aussi passer directement de l'arbitraire de hachage avec un argument supplémentaire:
git branch newbranch SHA1-of-B
, ougit checkout -b newbranch SHA1-of-B
Merci de me présenter certains concepts de base.
votre réponse fonctionne parfaitement pour moi, merci.
oui, je ne veux pas énumérer toutes les façons possibles et de la pensée de celui-ci pourrait être plus facile à comprendre étant donné que l'OP a demandé spécifiquement sur
reset --hard
. Je peux adapter la réponse à votre entrée. MerciJe trouve cette réponse un peu trompeur: Un
git reset
est ni ce que l'OP doit utiliser, ni ce qu'il doit utiliser. La bonne façon de le faire est une combinaison degit checkout
etgit branch
. voire destructeurs des commandes commegit reset hard
ne devrait pas être recommandée sans nécessité.OriginalL'auteur Sébastien Dawans
Vous devez utiliser
git checkout
pour cela. Il suffit de ne:git checkout B
et vous aurez cette révision.
git checkout
:reference is not a tree
.Je pense Hasturkun commentaire de Sébastien Dawans réponse va résoudre ce problème pour vous.
En effet, l'aide vous donne: git checkout [OPTIONS] <branch> Il s'attend à une branche, pas de validation!
OriginalL'auteur jbr
Votre approche est tout à fait faux. Vous êtes en train de modifier quelque chose que vous ne voulez pas modifier: Votre branche courante (sans doute
master
).Simple, linéaire dépôt git est une chaîne de commits comme ce
Qui est l'état de votre dépôt après avoir appelé
git fetch
. Noter que la totalité de l'histoire avec toutes ses étapes intermédiaires est là, sur votre disque dur local. C'est juste que vous n'avez que l'état à s'engagerA
vérifié (HEAD
points demaster
qui points àA
), de sorte que les fichiers que vous voyez appartiennent à cet état.Maintenant, si vous voulez juste regarder l'état qui a commis comme
B
, vous pouvez simplement vérifier que s'engager avecgit checkout B
. Cela met à jour les fichiers que vous voyez à l'état deB
, et les points deHEAD
à ce commit:HEAD
toujours les références de la validation ou de la direction quegit
pense que vous êtes sur, et à qui il permettra de comparer votre répertoire de travail lorsque vous appelezgit status
.La simple
git checkout B
est suffisant, si vous voulez juste regarder ce commit. Si vous souhaitez apporter des modifications que vous vous engagez et que vous souhaitez conserver, vous devez introduire une nouvelle branche pour enregistrer ces modifications. Ceci est réalisé par un simplegit checkout -b newBranch
après lagit checkout B
. Cela vous donnera l'étatCela donne juste un nom pour commettre
B
autre que sa valeur de hachage. Après quelques engage, votre état pourrait ressembler à ceci:Le point est, que, après vérification de certaines autres branches/s'engager avec
git checkout ...
, vous pouvez toujours revenir facilement à s'engagerD
en appelantgit checkout newBranch
, et la référence permanente s'arrêtegit
de la collecte des ordures s'engagerD
.Maintenant, pourquoi est-à l'aide de
git reset --hard
mauvais? Tout d'abord, il clobbers tous vos changements locaux que vous n'avez pas commis mais sans autre avis. Deuxièmement, il peut perdre dans l'histoire, si vous n'êtes pas prudent avec elle.Considérons, par exemple, le cas que vous avez fait quelques changements après la dernière poussé à vos amont de référentiel, et que vous voulez prendre un coup d'oeil à l'histoire commettre
B
. (Un peu l'inverse de l'affaire dans votre question.) L'histoire ressemble à ceci:Avec
git reset --hard B
, vous obtenez cet état:Les commits entre parenthèses ne sont pas référencées directement ou indirectement par toute la branche, et de plus, peut-être nettoyés de tout temps.
git
peut ne pas être très agressif avec les ordures ménagères, la collecte, mais si c'est le garbage recueillons lorsque vous êtes dans cet état, il n'existe aucun moyen pour vous de vous engagerC
de retour, il sera perdu à jamais. Vous ne voulez pas que cela arrive, il n'est donc pas une bonne idée de prendre l'habitude d'utilisergit reset --hard
à la légère.Aviez-vous utilisé
git checkout
au lieu de cela, la direction de lamaster
serait encore pointer àC
, et vous devriez toujours être en mesure de les récupérer à l'aide d'un simplegit checkout master
.OriginalL'auteur cmaster