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

Après le dernier commit, 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, comme dans le réinitialiser à l'état le plus récent de la validation.

cependant, je ne veux annuler les modifications de la copie de travail que d'un seul fichier, rien d'autre.

comment je fais ça?

1333
demandé sur S H 2009-03-28 08:09:02

12 réponses

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 branche ou une étiquette (ou un autre identifiant de révision), il peut devenir confus, donc utiliser -- est mieux.

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
1841
répondu Brian Campbell 2014-05-30 02:30:59
git checkout <commit> <filename>

j'ai utilisé aujourd'hui car j'ai réalisé que mon favicon avait été écrasé quelques engage, j'upgrated drupal 6.10, j'ai donc dû le récupérer. Voici ce que j'ai fait:

git checkout 088ecd favicon.ico
118
répondu neoneye 2009-03-28 10:25:25

il suffit d'utiliser

git checkout filename

remplace le nom de fichier par la dernière version de la branche courante.

attention: vos modifications seront rejetées - aucune sauvegarde n'est conservée.

103
répondu nimrodm 2014-05-30 02:32:10

si votre fichier est déjà mis en scène (se produit lorsque vous faites un ajout git etc Après que le fichier est édité) pour décélérer vos modifications.

Utiliser

git reset HEAD <file>

puis

git checkout <file>

Si ce n'est déjà mis en scène, il suffit d'utiliser

git checkout <file>
52
répondu thanikkal 2015-03-31 07:08:00

si vous voulez simplement annuler les modifications de commit précédentes dans ce fichier, vous pouvez essayer ceci:

git checkout branchname^ filename

ceci va vérifier le fichier tel qu'il était avant la dernière propagation. Si vous voulez faire quelques autres commits en arrière, Utilisez la notation branchname~n .

15
répondu sykora 2014-05-30 02:32:42

je suis toujours confondu avec cela, donc voici un cas de test de rappel; disons que nous avons ce bash script pour 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 point, le changement n'est pas mis 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 à la place nous 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 - ci-si les changements ne sont pas mis en scène, git reset ne fait aucune différence, tandis que git checkout annule les changements.


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

dans ce cas, git status à ce point est:

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

    modified:   b.txt

si de cette point, nous faisons git checkout , le résultat est celui-ci:

$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean

si nous 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 - ci - si les changements sont échelonnés, git reset fera essentiellement des changements échelonnés dans des changements non étalés-tandis que git checkout écrasera les changements complètement.

7
répondu sdaau 2016-02-09 08:56:33

je restaure mes fichiers en utilisant le code, ce que je fais est git checkout <sha hash id> <file name>

5
répondu Beto 2012-05-22 20:39:17

j'ai fait par git bash:

(use "git checkout -- <file>..." to discard changes in working directory)

  1. git status. [nous avons donc vu un fichier wad modifié.]
  2. git checkout -- index.html [j'ai changé dans index.fichier html :
  3. git status ]

enter image description here

5
répondu Shivanandam Sirmarigari 2018-04-12 13:04:25

cette réponse est pour la commande nécessaire pour les modifications locales non alignées 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 tous les changements locaux:

si vous avez un ou plusieurs fichiers, vous pouvez appliquer la samne de commande ( git checkout -- file ) chacun de ces dossiers en énumérant chacun de leur emplacement séparé par espace comme dans:

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

l'esprit de l'espace abve entre nom1/nom2/fileOne.ext nameA/subFolder / fileTwo.poste 151950920"

Pour plusieurs fichiers dans le même dossier:

si vous avez besoin d'écarter des modifications pour tous les fichiers dans un certains répertoires, utilisez la caisse git comme suit:

git checkout -- name1/name2/*

l'astérisque au-dessus fait le truc de défaire tous les fichiers à cet endroit sous name1 / name2.

et, de même, ce qui suit peut annuler les changements dans tous les fichiers pour plusieurs dossiers:

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

rappelez-vous l'espace entre name1 / name2/ * nameA/ sous-dossier / * dans le surtout.

Note: name1, name2, nameA, sous - dossier- tous ces exemples de noms de dossiers indiquent le dossier ou le paquet où le les dossiers en question peuvent être conservés.

3
répondu Nirmal 2017-01-23 21:26:27

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
répondu Jesse Glick 2014-05-30 02:28:41

pour moi seulement celui-ci a fonctionné

git checkout -p filename

enter image description here

1
répondu Ramesh Bhupathi 2017-08-19 14:28:04

S'il est déjà engagé, vous pouvez revenir sur le changement pour le fichier et le propager, puis écraser new commit avec last commit.

0
répondu Gina 2017-04-26 19:17:07