Annuler les modifications de la copie de travail d’un fichier dans Git?

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 -- ..." to discard changes in working directory)

  1. Statut Git. [Nous avons donc vu un fichier modifié.]
  2. git checkout – index.html [J’ai changé dans le fichier index.html:
  3. statut git [maintenant ces modifications ont été supprimées]

entrer la description de l'image ici

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 

entrer la description de l'image ici

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.