Comment réinitialiser dans Git, la récupération, le retour à l'état précédent

L'un des peu connu (et ne se rendent pas compte que) lorsque vous utilisez le travail Git est, comment revenir facilement à votre position précédente - qui est, comment dans l'entrepôt pour être facilement révoqué même un changement important. Dans cet article, nous allons vous prendre pour savoir comment réinitialiser, restaurer et retour complet à l'état précédent, faire cela ne prend que quelques commandes simples mais élégantes Git.

Remise à zéro

Nous commençons par commande de réinitialisation Git. En effet, vous devriez être en mesure de penser comme un « rollback » - reviendras-tu soumis à l'environnement local avant. Ici, le « environnement local » du terme, nous entendons votre zone de transit de l'entrepôt local et répertoire de travail.

Regardez la figure 1. Ici, nous avons une série de représentation schématique présentée dans Git. Dans Git une branche est simplement un nom, un pointeur pointant vers un mobile particulier soumis. Ici, notre branche principale est un pointeur sur la chaîne soumise.

Figure 1: entrepôt, zone de transit de l'environnement local et répertoire de travail

Si vous regardez ce qui est notre branche principale, vous pouvez regarder notre chaîne soumis jusqu'à présent produit.

--oneline journal $ Git

Fichier b764644 avec trois lignes

Fichier 7c709f0 avec deux lignes

9ef9173 fichier avec une ligne

Si nous voulons soumettre un dossier de pré-roll pour ce qui se passera? Il est simple - il suffit de déplacer le pointeur sur la branche. Git fournit pour nous de faire cette commande de remise à zéro d'action. Par exemple, si nous nous soumettons à remettre le rouleau maître arrière deux soumissions à la position actuelle, nous pouvons utiliser l'une des méthodes suivantes:

$ Git reset 9ef9173

(Soumission d'utiliser une valeur de SHA19ef9173)

ou:

courant de réinitialisation $ Git ~ 2

(Avant la balise « en cours », en utilisant une valeur relative de -2)

La figure 2 montre les résultats de l'opération. Après cela, si nous courons une commande de journal git sur la branche courante (maître), nous verrons seulement la soumission.

--oneline journal $ Git

9ef9173 fichier avec une ligne

Figure 2: Après la remise à zéro

git commande de réinitialisation comprend également l'utilisation d'un certain nombre d'options, vous permettant de soumettre un contenu final satisfaisant de mettre à jour d'autres parties de l'environnement local. Ces options incluent: réinitialisation matérielle dans l'entrepôt au point de soumission, rempli de contenu soumis au répertoire de travail, et remis à zéro la zone de mise en scène, soft reset uniquement pointeur de l'entrepôt, et mixte (valeur par défaut) remet à zéro le pointeur et la mise en scène espace.

Ces options sont très utiles dans des circonstances particulières, telles que la réinitialisation git --hard < engager SHA1 | référence >  Cette commande remplace toutes les modifications non validées locales. En fait, il est remis à zéro (effacer) la zone de mise en scène, et utiliser le contenu que vous soumettez réinitialisée à couvrir le contenu de l'espace de travail. Avant d'utiliser l'option disque, assurez-vous qu'il vous fonctionne voulez vraiment faire, parce que cette commande remplace toutes les modifications non validées.

récupération

commande revert git résultats réels similaires à réinitialiser, il est une autre approche. commande remise à zéro (par défaut) est de déplacer les branches de pointeur dans la chaîne de retour à des changements « Annuler », commande revert dans la chaîne ajoute une nouvelle soumission à « Annuler » les modifications. Voir 1 à nouveau peut être très facilement voir ce schéma d'effet. Si l'on ajoute une ligne dans la chaîne de chaque soumission aux documents, est d'utiliser la remise à zéro font valoir que seul le retour à la version à deux lignes, telles que: reset git HEAD ~ 1.

Une autre méthode consiste à ajouter une nouvelle soumission à supprimer la troisième ligne, de sorte que la fin dernière de la ligne devient deux versions - l'effet pratique du changement est annulé. En utilisant une commande revert git pour atteindre l'objet ci-dessus, par exemple:

$ Git revert HEAD

Parce qu'il ajoute une nouvelle commettras, Git sera invité à présenter les informations suivantes:

Revert « Fichier avec trois lignes »

Revient commettent ce b764644bad524b804577684bf74e7bca3117f554.

# S'il vous plaît entrer le message de livraison pour vos modifications. Les lignes de départ

# Avec « # » sera ignorée, et un message vide avorte le commit.

# Le maître de branche

# Les changements à engager:

# Mise à jour: file1.txt

#

3 (ci-dessous) montre les résultats de l'opération de revert est terminée.

Si nous courons maintenant une commande git log, nous verrons une nouvelle demande avant la présentation précédente.

--oneline journal $ Git

11b7712 Revert « Fichier avec trois lignes »

Fichier b764644 avec trois lignes

Fichier 7c709f0 avec deux lignes

9ef9173 fichier avec une ligne

Voici le répertoire de travail courant du contenu de ce fichier:

Cat $ < nom de fichier >

ligne 1

ligne 2

Après 3 fonctionnement revert de la Fig.

Comment récupérer ou de réinitialiser vos choix?

Pourquoi devrait revenir préférence plutôt que l'opération remise à zéro? Si vous avez soumis votre chaîne poussé au dépôt distant (d'autres peuvent avoir tiré votre code et commencer à travailler), est une opération revert pour les amener à changer de façon très amicale. En effet, Git flux de travail peut très bien être ajouté à la fin d'une branche de soumission, mais lorsque le pointeur de la branche de remise à zéro de quelqu'un, un groupe de soumissions ne verra plus, et cela peut être un défi.

Lorsque nous utilisons le travail Git cette façon, l'un de nos règle de base est la suivante: utiliser cette approche dans votre référentiel local pour changer le code n'a pas été poussé est possible. Si vous soumettez a été poussé au dépôt distant, et d'autres peut-être utilisé au travail, vous devriez éviter ces changements de réécriture commettre l'histoire.

En bref, si vous souhaitez revenir, retirer ou réécrire l'histoire à présenter une chaîne d'autres déjà en cours d'utilisation, lorsque vos collègues tentent de fusionner leurs changements à leur chaîne de traction d'origine, ils peuvent avoir besoin de faire plus travail. Si vous devez déjà avoir été poussé et d'autres sont utilisés pour apporter des modifications au code, vous devez communiquer avec eux avant de faire des changements, laissez-les fusionner leurs changements. Puis, après l'invasion du contenu de l'opération fusionnée vous n'avez pas besoin, puis ils tirent une copie.

Vous avez peut-être remarqué, nous avons fait une opération remise à zéro après la présentation de la chaîne d'origine est toujours dans cette position. Déplacer le pointeur, puis soumettre une pré-remise à zéro le dos de code, mais il n'a pas supprimer toute soumission. En d'autres termes, tant que nous savons que nous l'avons fait à la demande initiale, nous sommes en mesure de « restaurer » un pointeur vers un emplacement en face de la tête par un simple retour à la chaîne d'origine des branches:

reset git < SHA1 de commettre >

Après la soumission à remplacer, nous faisons beaucoup d'autres opérations dans Git Des choses semblables peuvent se produire. La nouvelle présentation est créée, le pointeur correspondant est déplacé vers une nouvelle chaîne, mais a fait valoir l'ancienne chaîne existe toujours.

rebasage

Maintenant, nous regardons un rebasage de branche. Supposons que nous ayons deux branches: maître et caractéristique, chaîne déposée comme le montre la figure 4. Soumis par la chaîne principale est C4- > C2- > C1- > Soumettre C0 et disposent de la chaîne est C5- > C3- > C2- > C1- > C0.

Figure 4: dispositif maître et à chaîne ramifiée Soumettre

Si nous nous engageons record dans sa branche vue, ils devraient ressembler à ceci ci-dessous. (Pour faciliter la compréhension, C représente les renseignements fournis)

$ Git journal maître --oneline

6a92e7a C4

259bf36 C2

f33ae68 C1

5043e79 C0

$ Git log fonction --oneline

79768b8 C5

000f9ae C3

259bf36 C2

f33ae68 C1

5043e79 C0

Je dis aux gens de Git, rebasage peuvent être considérés comme « consolidation historique ». Essentiellement, branche Git chacun à une autre branche dans une autre tentative de soumission « relecture ».

On utilise donc les commandes Git de base, une fonction peut rebasage branche dans le maître, et ensemble en C4 (par exemple, il est inséré dans la chaîne de fonctionnalité). Utilisez la commande suivante:

fonction de commande $ Git

$ Git maître rebasage

Tout d'abord, la tête rembobiner pour réécouter votre travail sur le dessus de celui-ci ...

L'application: C3

L'application: C5

Après la fin, nous soumettons la chaîne suivante deviendra comme la figure 5.

Figure 5: commande rebasage soumis après l'achèvement de la chaîne

Ensuite, nous regardons votre histoire, il devrait devenir de la manière suivante.

$ Git journal maître --oneline

6a92e7a C4

259bf36 C2

f33ae68 C1

5043e79 C0

$ Git log fonction --oneline

c4533a5 C5

64f2047 C3

6a92e7a C4

259bf36 C2

f33ae68 C1

5043e79 C0

Notez que C3 « et C5'- sur la branche principale a été présenté dans une chaîne de « haut », en raison de la génération du changement et de créer une nouvelle présentation. Mais aussi noté qu'après la rebasage « primitive » C3 et C5 est toujours là - juste pas de point à eux seuls une branche.

Si nous le faisons rebasage, puis déterminons que ce n'est pas le résultat que nous voulons, veulent le retirer, nous pouvons faire ce que vous avez fait dans l'exemple suivant:

$ Git reset 79768b8

En raison de ce simple changement, et maintenant nos succursales seront redirigés vers la même position avant de faire l'opération de rebasage - totalement équivalent à annuler (Figure 6).

Figure 6: Après rebasage d'opération d'annulation

Si vous utilisez un point de branchement sur un déjà soumis vous ne pouvez pas se rappeler comment faire quoi? Heureusement, les commandes Git peuvent encore vous aider. Vous pouvez modifier la plupart des opérations de mains de cette façon, Git se souviendront de votre demande initiale. En fait, il est dans le répertoire de dépôt .git, enregistrez-le sous forme de fichier spécifique nommé dans ORIG_HEAD. Avant qu'il ne soit modifié, le chemin est un fichier qui contient la majorité des références. Si nous chat ce fichier, on peut voir son contenu.

$ Cat .git / ORIG_HEAD

79768b891f47ce06f13456a7e222536ee47ad2fe

Nous pouvons utiliser la commande de réinitialisation, comme décrit précédemment, il renvoie un pointeur sur la chaîne d'origine. Ensuite, son histoire sera suivant ceci:

$ Git log fonction --oneline

79768b8 C5

000f9ae C3

259bf36 C2

f33ae68 C1

5043e79 C0

Il est d'obtenir ces informations dans un autre endroit dans reflog. reflog est une description détaillée de votre inventaire de commutation de entrepôt local ou changé. Vous pouvez utiliser la commande reflog git pour afficher son contenu:

$ Git reflog

79768b8 HEAD @ {0}: remise à zéro: le déplacement à 79768b

c4533a5 HEAD @ {1}: rebasage terminé: retour à refs / heads / fonction

HEAD c4533a5 @ {2}: rebasage: C5

64f2047 HEAD @ {3}: rebasage: C3

6a92e7a HEAD @ {4}: rebasage: maître de la caisse

79768b8 HEAD @ {5}: votre commande: passer d'une fonction à

79768b8 HEAD @ {6}: commit: C5

000f9ae HEAD @ {7}: votre commande: passer de maître à fonction

6a92e7a HEAD @ {8}: commettras: C4

259bf36 HEAD @ {9}: votre commande: passer de la fonction à maîtriser

000f9ae HEAD @ {10}: commettras: C3

259bf36 HEAD @ {11}: votre commande: passer de maître à fonction

259bf36 HEAD @ {12}: commettras: C2

TETE f33ae68 @ {13}: commit: C1

5043e79 HEAD @ {14}: commettras (initiale): C0

Vous pouvez la liste utilisée dans le journal, vous voyez le format de nom pertinent pour réinitialiser quelque chose:

HEAD reset $ Git @ {1}

Une fois que vous comprenez l'opération lorsque le lien « Modifier » se produit, Git est comment suivre les principes de base de la demande initiale de la chaîne, puis faire quelques changements ne seront plus si des choses terribles dans Git. Ceci est l'une des capacités de base des puissants Git: peut très rapidement et facilement tout essayer, et en cas d'échec serait de les retirer.

Les images en direct de la « zone de vie » sont là! « Lop Nur grand par la » exposition de photos ouvre aujourd'hui
Précédent
Les prix, le développement de la voiture, les ventes de la marque chinoise en Russie a augmenté de nouveau en Juillet
Prochain
Q7 moins de 400000, légèrement plus grand que le X5, le plus beau 7280000, Highlander panique aussi
Expédition a marqué le début deux grandes ligne principale positif prêt à voler
Async et Attendent expliqué avec des dessins et des exemples
LOL dernière course sur les singles costume fraîche recommande Paode sauvages tels atours pour être sûr!
150000 yuans recommandation personnalisée SUV ne sont pas les mêmes que les modèles de la jeunesse
L'élection de Merkel se rapproche cassé sa bien-aimée voiture allemande
gamme complète de Toyota prendre la technologie de sécurité active, Yan Zhi valeur Bin beau grand cercle frit, 130000 zayang domestiques
Replay limite quotidienne - l'armée tant attendue
La concurrence sur le marché pour mettre à niveau, Honda a présenté deux 650cc « Titans » pour faire face au changement
couronne de ventes mensuelles ne répond pas et faire les choses, par 1,3T, 7 Wanduo laisser GS4 comment faire
contre tout assassin de mêlée! LOL jouer la nouvelle version de Kali enseignement de routine
Présentez une semaine | pour voir le plus beau timbre, le goût de peindre jusqu'à une histoire d'amour demi-siècle