Question Annuler les modifications de copie de travail d'un fichier dans Git?


Après la dernière validation, j'ai modifié un tas de fichiers dans ma copie de travail, mais je veux annuler les modifications apportées à l'un de ces fichiers, par exemple en le réinitialisant au même état que le commit le plus récent.

Cependant, je veux seulement annuler les changements de copie de travail de ce seul fichier seul, rien d'autre avec cela.

Comment je fais ça?


1294
2018-03-28 05:09


origine


Réponses:


Vous pouvez utiliser

git checkout -- file

Vous pouvez le faire sans -- (comme suggéré par nimrodm), mais si le nom de fichier ressemble à une branche ou un tag (ou un autre identificateur de révision), il peut être confus, donc en utilisant -- est le meilleur.

Vous pouvez également extraire 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

1786
2018-03-28 06:12



git checkout <commit> <filename>

Je l'ai utilisé aujourd'hui parce que je me suis rendu compte que mon favicon avait été écrasé il y a quelques mois lorsque j'ai été mis à jour en Drupal 6.10, donc j'ai dû le récupérer. Voici ce que j'ai fait:

git checkout 088ecd favicon.ico

115
2018-03-28 10:25



Juste utiliser

git checkout filename

Cela remplacera le nom de fichier par la dernière version de la branche actuelle.

ATTENTION: vos modifications seront ignorées - aucune sauvegarde n'est conservée.


101
2018-03-28 05:55



Si votre fichier est déjà mis en scène (se produit lorsque vous faites un git add etc après que le fichier a été édité) pour annuler vos modifications.

Utilisation

git reset HEAD <file>

alors

git checkout <file>

Si ce n'est déjà fait, utilisez simplement

git checkout <file>

51
2017-07-03 05:46



Si vous souhaitez annuler les modifications apportées à ce fichier par la validation précédente, vous pouvez essayer ceci:

git checkout branchname^ filename

Cela va vérifier le fichier tel qu'il était avant la dernière validation. Si vous voulez revenir un peu plus, utilisez le branchname~n notation.


15
2018-03-28 05:25



Je suis toujours confus avec ceci, donc voici un cas de test de rappel; Disons que nous avons cela bash script à tester git:

set -x
rm -rf test
mkdir test
cd test
git init
git config user.name test
git config user.email test@test.com
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 mise en scène dans le cache, donc git status est:

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." 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 point, nous faisons 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 contraire nous le faisons git reset, le résultat est:

$ 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 <file>..." to update what will be committed)
  (use "git checkout -- <file>..." 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 mis en scène, git reset ne fait aucune différence, tandis que git checkout écrase les changements.


Maintenant, disons que le dernier changement du script ci-dessus est mis en scène / mis en cache, c'est-à-dire que nous avons aussi fait git add b.txt à la fin.

Dans ce cas, git status à ce stade est:

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   b.txt

Si à partir de ce point, nous faisons 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 contraire nous le faisons git reset, le résultat est:

$ 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 <file>..." to update what will be committed)
  (use "git checkout -- <file>..." 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 sont mis en scène, git reset va essentiellement faire des changements par étapes dans des changements non statiques - tout en git checkout écrasera complètement les modifications.


7
2018-02-09 08:56



Je restaure mes fichiers en utilisant l'identifiant SHA, ce que je fais est git checkout <sha hash id> <file name>


5
2018-05-22 20:39



J'ai fait par git bash:

(use "git checkout -- <file>..." 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. git status [Maintenant, ces changements ont été supprimés]

enter image description here


3
2018-04-10 14:54



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

2
2018-04-30 19:45



Cette réponse est pour la commande nécessaire pour les changements locaux undoign qui sont dans plusieurs fichiers spécifiques dans un même dossier ou plusieurs (ou répertoires). Cette réponse répond spécifiquement aux questions 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 énumérant chacun de leur emplacement séparé par   espace comme dans:

git checkout -- name1/name2/fileOne.ext nameA/subFolder/fileTwo.ext

attention à l'espace qui existe entre name1 / nom2 / fileOne.ext nomA / sous-dossier / fichierTwo.ext

Pour plusieurs fichiers dans le même dossier:

Si vous devez supprimer les modifications pour tous les fichiers dans un   certain répertoire, utilisez le git checkout comme suit:

git checkout -- name1/name2/*

L'astérisque ci-dessus fait l'affaire de défaire tous les fichiers à cet endroit sous name1 / name2.

Et, de la même manière, les éléments suivants peuvent annuler les modifications dans tous les fichiers pour   plusieurs dossiers:

git checkout -- name1/name2/* nameA/subFolder/*

encore une fois l'espace entre name1 / name2 / * nameA / subFolder / * dans le   au dessus.

Remarque: nom1, nom2, nomA, sous-dossier: tous ces exemples de dossiers indiquent le dossier ou le package dans lequel le (s) fichier (s) en question peut résider.


2
2018-01-23 21:26