Après la dernière validation, j’ai modifié un groupe de fichiers dans ma copie de travail, mais je souhaite annuler les modifications apscopes à l’un de ces fichiers, en le réinitialisant au même état que le dernier commit.
Cependant, je veux seulement annuler les modifications de la copie de travail de ce seul fichier, rien d’autre.
Comment je fais ça?
Vous pouvez utiliser
git checkout -- file
Vous pouvez le faire sans le --
(comme suggéré par nimrodm), mais si le nom du fichier ressemble à une twig ou à une balise (ou à un autre identifiant de révision), il peut être confus.
Vous pouvez également consulter une version particulière d’un fichier:
git checkout v1.2.3 -- file # tag v1.2.3 git checkout stable -- file # stable branch git checkout origin/master -- file # upstream master git checkout HEAD -- file # the version from the most recent commit git checkout HEAD^ -- file # the version before the most recent commit
git checkout
Je l’ai utilisé aujourd’hui parce que je me suis rendu compte que mon favicon avait été écrasé il y a quelques commits quand je suis passé à la drupal 6.10, alors j’ai dû le récupérer. Voici ce que j’ai fait:
git checkout 088ecd favicon.ico
Juste utiliser
git checkout filename
Cela remplacera le nom de fichier par la dernière version de la twig actuelle.
ATTENTION: vos modifications seront supprimées – aucune sauvegarde n’est conservée.
Si votre fichier est déjà mis en scène (ce qui se produit lorsque vous ajoutez un fichier git, etc. après avoir édité le fichier) afin de supprimer vos modifications.
Utilisation
git reset HEAD
alors
git checkout
Si ce n’est déjà fait, utilisez simplement
git checkout
Si vous souhaitez simplement annuler les modifications du commit précédent dans ce fichier, vous pouvez essayer ceci:
git checkout branchname^ filename
Cela va extraire le fichier tel qu’il était avant le dernier commit. Si vous souhaitez reprendre quelques commits, utilisez la notation branchname~n
.
Je suis toujours confus avec ceci, alors voici un cas de test de rappel; disons que nous avons ce script bash
pour tester git
:
set -x rm -rf test mkdir test cd test git init git config user.name test git config user.email [email protected] echo 1 > a.txt echo 1 > b.txt git add * git commit -m "initial commit" echo 2 >> b.txt git add b.txt git commit -m "second commit" echo 3 >> b.txt
À ce stade, la modification n’est pas effectuée dans le cache, le git status
est donc:
$ git status On branch master Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: b.txt no changes added to commit (use "git add" and/or "git commit -a")
Si, à partir de ce moment, nous effectuons une git checkout
, le résultat est le suivant:
$ git checkout HEAD -- b.txt $ git status On branch master nothing to commit, working directory clean
Si au lieu de cela nous git reset
, le résultat est le suivant:
$ git reset HEAD -- b.txt Unstaged changes after reset: M b.txt $ git status On branch master Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: b.txt no changes added to commit (use "git add" and/or "git commit -a")
Donc, dans ce cas – si les changements ne sont pas effectués par étapes, git reset
ne fait aucune différence, alors que git checkout
remplace les modifications.
Maintenant, supposons que la dernière modification du script ci-dessus soit mise en scène / mise en cache, c’est-à-dire que nous avons également git add b.txt
à la fin.
Dans ce cas, le git status
à ce stade est le suivant:
$ git status On branch master Changes to be committed: (use "git reset HEAD ..." to unstage) modified: b.txt
Si, à partir de ce moment, nous effectuons une git checkout
, le résultat est le suivant:
$ git checkout HEAD -- b.txt $ git status On branch master nothing to commit, working directory clean
Si au lieu de cela nous git reset
, le résultat est le suivant:
$ git reset HEAD -- b.txt Unstaged changes after reset: M b.txt $ git status On branch master Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: b.txt no changes added to commit (use "git add" and/or "git commit -a")
Donc, dans ce cas – si les modifications sont échelonnées, git reset
va fondamentalement apporter des modifications par étapes dans des modifications non planifiées – tandis que git checkout
va complètement remplacer les modifications.
Je restaure mes fichiers à l’aide de l’identifiant SHA. Ce que je fais, c’est git checkout
J’ai fait par git bash:
(use "git checkout --
Si vous n’avez pas encore poussé ou partagé votre commit:
git diff --stat HEAD^...HEAD | \ fgrep filename_snippet_to_revert | cut -d' ' -f2 | xargs git checkout HEAD^ -- git commit -a --amend
Cette réponse est pour la commande nécessaire pour annuler les modifications locales qui se trouvent dans plusieurs fichiers spécifiques dans le même ou plusieurs dossiers (ou répertoires). Cette réponse répond spécifiquement à la question où un utilisateur a plus d’un fichier, mais l’utilisateur ne veut pas annuler toutes les modifications locales:
Si vous avez un ou plusieurs fichiers, vous pouvez appliquer la commande samne (
git checkout -- file
) à chacun de ces fichiers en répertoriant chacun de leurs emplacements séparés par un espace, comme dans:
git checkout -- name1/name2/fileOne.ext nameA/subFolder/fileTwo.ext
attention à l’espace entre name1 / name2 / fileOne.ext nameA / subFolder / fileTwo.ext
Pour plusieurs fichiers dans le même dossier:
Si vous devez supprimer des modifications pour tous les fichiers d’un répertoire donné, utilisez la commande git comme suit:
git checkout -- name1/name2/*
L’astérisque ci-dessus permet de défaire tous les fichiers à cet emplacement sous name1 / name2.
De même, les opérations suivantes peuvent annuler les modifications apscopes à tous les fichiers de plusieurs dossiers:
git checkout -- name1/name2/* nameA/subFolder/*
attention à l’espace entre nom1 / nom2 / * nomA / sous-dossier / * dans ce qui précède.
Remarque: nom1, nom2, nomA, sous-dossier – tous ces noms de dossier d’exemple indiquent le dossier ou le package dans lequel le ou les fichiers en question peuvent résider.
Pour moi seul celui-ci a fonctionné
git checkout -p filename
S’il est déjà validé, vous pouvez annuler la modification pour le fichier et valider à nouveau, puis écraser le nouveau commit avec le dernier commit.