Comment restaurer un dossier vers un commit particulier en créant un patch

97

Voici mon historique pour le dossier 'somefolder'

$ git log somefolder

commit 89cd
More changes to somefolder

commit ef47a
Updating somefolder and other stuff

commit e095
Bugs fixed in somefolder

Je veux ramener un dossier au commit «Bogues corrigés dans un dossier».

Puisque le deuxième commit impliquait des changements en dehors d'un dossier, je ne veux pas revenir sur ce commit.

Je suppose que le moyen le plus sûr serait de créer un diff / patch entre le commit e095 et 89cd qui s'applique uniquement à un dossier, puis d'appliquer ce patch. Comment puis je faire ça?

hitfactory
la source

Réponses:

156

Vous pouvez utiliser git checkout pour mettre à jour votre référentiel vers un état spécifique.

git checkout e095 -- somefolder

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

git diff 89cd..e095 -- somefolder
Jamessan
la source
30
cela ne supprime pas les fichiers qui ont été ajoutés dans ce commit, utilisez à la git reset e095 -- some/folderplace
shime
3
Depuis git 2.22, vous pouvez utiliser --no-overlayfor git checkoutpour que les fichiers suivis qui ne sont pas dans le commit que vous extrayez soient supprimés.
Mariusz Pawelski
54

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

git reset e095 -- somefolder

Cependant, git resetne met pas à jour la copie de travail et l' --hardoption ne fonctionne pas avec les dossiers. Alors utilisez git checkoutpour rendre la copie de travail identique à l'index:

git checkout -- somefolder

puis si vous souhaitez également supprimer les fichiers ajoutés, vous devez également faire:

git clean -fd somefolder
Matthew Buckett
la source
cette réponse fonctionne pour moi lorsque le répertoire inclut de nouveaux fichiers.
Yahoho
2
Cette réponse est bien meilleure si vous voulez vraiment un instantané propre du référentiel à ce moment-là.
data princess
Bien mieux en effet!
Alexis Pautrot