Comment récupérer des commits inversés dans un référentiel Git

0
171

Si vous venez d'annuler un commit Git et que vous avez accidentellement supprimé un fichier ou un morceau de code parce que de celui-ci, ne vous inquiétez pas. Git garde une trace de tout, et la récupération du fichier récupéré est facile à faire à la fois à partir de la ligne de commande et de la plupart des clients Git de l'interface graphique.

Don’t Panic

Heureusement, Git garde une trace de tout, même des commits inversés. Vous n'avez encore rien supprimé.

Vous avez peut-être rencontré ce problème en essayant de “supprimer” un commit Git. Cependant, vous ne pouvez pas vraiment supprimer les commits une fois que vous les avez créés. Vous pouvez uniquement réinitialiser à un commit précédent et ignorer les modifications locales, ou annuler les modifications.

Par exemple, dans mon cas avec ce problème, je venais d'initialiser mon référentiel Git et j'ai accidentellement tout organisé sans écrire mon fichier .gitignore, qui a commis des dossiers ./bin/et d'autres fichiers indésirables dont je ne voulais pas. Alors, sans y penser, j'ai cliqué sur “revenir” dans mon client Git, et j'ai vu avec horreur tout mon répertoire être supprimé. Oups.

Le problème est que “revenir” une validation n'est pas la même chose que l'annulation des modifications et peut avoir des effets inattendus sur vos fichiers locaux qui ne peuvent être corrigés que via Git. Cela ressemble à un problème sérieux jusqu'à ce que vous réalisiez que toutes les données sont toujours stockées dans le dossier .git/ de votre référentiel, afin qu'elles puissent être récupérées.

Publicité

Cela n'aide pas qu'il porte un nom étrange, et le moyen réel de supprimer un commit indésirable est de faire une “réinitialisation logicielle” retour au dernier commit derrière le HEAD. Donc, la prochaine fois, si vous souhaitez annuler une validation (pour modifier vos modifications et revalider), utilisez la commande suivante :

git reset HEAD~1

Pour plus de précisions—c'est pas un “dur” reset, qui supprime également toutes vos modifications locales.

Correction des commits annulés

Le correctif est assez simple. Chaque fois que vous effectuez un “git revert,” Git effectue un nouveau commit avec des modifications opposées au commit annulé. Si vous avez créé un fichier, ce fichier est supprimé et le commit le reflète.

Le correctif consiste à appliquer ce commit d'annulation, puis à le rétablir, ce qui annulera les modifications. Cela fonctionnera même si le revert commit n'est pas à la tête de votre référentiel ; sinon, effectuer une réinitialisation matérielle fonctionnerait également et libérerait votre dépôt d'un “revenir” et “unrevert” commits dont vos collègues se moqueront.

Pour trouver le hachage du commit, vous pouvez exécuter git log :

Copiez ce hachage, puis exécutez git revert :

git revert 62ff517cc7c358eaf0bffdebbbe1b38dea92ba0f

Cela devrait corriger le référentiel, même si vous pouvez devez valider le retour manuellement si la validation automatique a échoué.

Publicité

Dans la plupart des clients GUI Git, le processus est extrêmement simple. Cliquez simplement sur “revenir” sur le commit.

Retour sans a Trace

Si vous êtes à la TÊTE de votre arbre de commit, et que vous souhaitez le faire sans faire de nouveaux commits, et que vous n'avez pas encore poussé le changement, vous pouvez réinitialiser votre branche locale à l'ancien commit.

git reset –hard HEAD^

La raison pour laquelle cela doit être une réinitialisation matérielle est qu'une réinitialisation logicielle inclurait toujours les modifications non planifiées du retour. Vous souhaitez réinitialiser sans les modifications locales.

Vous pouvez également effectuer une réinitialisation logicielle et supprimer les modifications locales manuellement.