105 votes

Comment revenir à un dossier à un commit particulier en créant un patch

Voici mon historique pour le dossier 'somefolder'

$ git log somefolder

commit 89cd
Plus de modifications pour somefolder

commit ef47a
Mise à jour de somefolder et autres choses

commit e095
Bugs corrigés dans somefolder

Je veux revenir en arrière pour somefolder jusqu'au commit "Bugs corrigés dans somefolder".

Étant donné que le deuxième commit impliquait des changements en dehors de somefolder, je ne veux pas revenir sur ce commit.

Je suppose que la manière la plus sûre serait de créer une différence/un patch entre le commit e095 et 89cd qui s'applique uniquement au dossier, puis appliquer ce patch. Comment puis-je faire cela?

174voto

jamessan Points 16420

Vous pouvez utiliser git checkout pour mettre à jour votre dépôt vers un état spécifique.

git checkout e095 -- somefolder

Quant à votre question sur la génération de la différence, cela fonctionnerait aussi. Générez simplement la différence pour revenir de votre état actuel à e095:

git diff 89cd..e095 -- somefolder

65voto

Matthew Buckett Points 706

Vous pouvez utiliser git reset pour réinitialiser l'index, ce qui inclura également la suppression des fichiers ajoutés dans des commits plus récents (git checkout seul ne le fait pas) :

git reset e095 -- somefolder

Cependant, git reset ne met pas à jour la copie de travail et l'option --hard ne fonctionne pas avec les dossiers. Vous pouvez alors utiliser git checkout pour rendre la copie de travail identique à l'index :

git checkout -- somefolder

et ensuite si vous voulez également supprimer les fichiers ajoutés, vous devez également faire :

git clean -fd somefolder

0voto

Jesse Points 2103

La commande git restore est conçue pour restaurer des fichiers et des répertoires à l'état dans lequel ils se trouvaient dans un commit différent. Si vous spécifiez un répertoire à restaurer, cela supprimera également les fichiers qui n'étaient pas présents dans le commit à partir duquel vous restaurez.

Pour restaurer le contenu du répertoire somefolder à l'état dans lequel il se trouvait au commit e095, vous pouvez exécuter :

git restore -s e095 somefolder

Par défaut, git restore restaure le contenu à l'état dans lequel il se trouvait dans HEAD, mais en utilisant l'interrupteur -s (abrégé de --source), nous pouvons restaurer le contenu à l'état dans lequel il se trouvait à n'importe quel commit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X