Comment puis-je rejeter les changements non stabilisés de la Tig?

Comment puis-je rejeter les changements dans ma copie de travail qui ne figurent pas dans l'index?

3954
git
demandé sur Mateusz Piotrowski 2008-09-09 23:33:59

30 réponses

une autre façon plus rapide est:

git stash save --keep-index --include-untracked

Vous n'avez pas besoin d'inclure --include-untracked si vous ne voulez pas être approfondie à ce sujet.

après ça, vous pouvez laisser tomber cette cachette avec une commande git stash drop si vous voulez.

2225
répondu Greg Hewgill 2018-09-11 00:14:38

pour tous les fichiers non marqués utiliser:

git checkout -- .

pour une utilisation spécifique du fichier:

git checkout path/to/file/to/revert

assurez-vous d'inclure la période à la fin.

4301
répondu Tobi 2018-05-09 21:29:52

il semble que la solution complète est:

git clean -df
git checkout -- .

git clean supprime tous les fichiers non tracés ( warning : alors qu'il ne supprimera pas les fichiers ignorés mentionnés directement dans .gitignore, il peut supprimer les fichiers ignorés se trouvant dans les dossiers ) et git checkout efface tous les changements non marqués.

1642
répondu Mariusz Nowak 2017-03-29 02:32:17

ceci vérifie l'index courant pour le répertoire courant, en rejetant toutes les modifications dans les fichiers du répertoire courant vers le bas.

git checkout .

ou ceci qui vérifie tous les fichiers de l'index, en écrasant les fichiers de l'arbre de travail.

git checkout-index -a -f
283
répondu CB Bailey 2009-06-20 10:28:04
git clean -df

nettoie l'arbre de travail en supprimant récursivement les fichiers qui ne sont pas sous le contrôle de la version, à partir du répertoire courant.

-d : supprimer les répertoires Non tracés en plus des fichiers non tracés

-f : Force (peut ne pas être nécessaire en fonction de clean.requireForce réglage)

Exécuter git help clean pour voir le manuel

218
répondu Elvis Ciotti 2015-05-15 13:42:58

mon préféré est

git checkout -p

qui permet de retourner sélectivement des morceaux.

voir aussi:

git add -p
85
répondu Ben 2015-02-23 19:46:03

Puisqu'aucune réponse ne suggère la combinaison exacte d'option que j'utilise, voici:

git clean -dfx
git checkout .

Ceci est le texte d'aide en ligne pour le git clean utilisé options:

-d

supprime les répertoires Non tracés en plus des fichiers non tracés. Si un répertoire Non suivi est géré par un autre dépôt Git, il n'est pas supprimé par défaut. Utilisez l'option -f deux fois si vous voulez vraiment supprimer un tel annuaire.

-f

si la variable de configuration de Git clean.requireForce n'est pas définie à false , Git clean refusera de supprimer les fichiers ou répertoires à moins qu'ils ne soient donnés -f , -n , ou -i . Git refusera de supprimer les répertoires du sous-répertoire ou du fichier .git , à moins qu'un second -f ne soit donné.

-x

N'utilisez pas l'ignorer règles de .gitignore (par répertoire) et $GIT_DIR/info/exclude , mais utilisez toujours les règles d'ignorer données avec -e options. Cela permet de supprimer tous les fichiers non tracés, y compris les produits de construction. Ceci peut être utilisé (éventuellement en conjonction avec git reset ) pour créer un répertoire de travail vierge pour tester une construction propre.

Aussi, git checkout . doit être fait dans la racine de l'opération.

68
répondu Martin G 2018-03-17 23:50:38

j'ai vraiment trouvé cet article utile pour expliquer quand utiliser quelle commande: http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git /

Il ya un couple de différents cas:

  1. si vous n'avez pas mis en scène le fichier, alors vous utilisez git checkout . La commande "mise à jour des fichiers dans l'arbre de travail pour correspondre à la version de l'index". Si les fichiers n'ont pas été mis en scène (aka ajouté à la index.).. cette commande va essentiellement retourner les fichiers à ce qu'était votre dernière propagation.

    git checkout -- foo.txt

  2. si vous avez mis en scène le fichier, utilisez git reset. Reset change l'index pour correspondre à une propagation.

    git reset -- foo.txt

je soupçonne que l'utilisation de git stash est un choix populaire, car il est un peu moins dangereux. Tu peux toujours y retourner si vous souffler accidentellement trop loin lors de l'utilisation de réinitialisation git. Reset est récursif par défaut.

consultez l'article ci-dessus pour de plus amples informations.

53
répondu blak3r 2013-05-13 05:41:57

la façon la plus facile de faire ceci est en utilisant cette commande:

cette commande est utilisée pour rejeter les changements dans le répertoire de travail -

git checkout -- .

https://git-scm.com/docs/git-checkout

dans la commande git, le rangement des fichiers non tracés est obtenu en utilisant:

git stash -u

http://git-scm.com/docs/git-stash

45
répondu A H M Forhadul Islam 2017-10-23 09:30:10

si vous n'êtes pas intéressé à garder les changements non marqués (surtout si les changements mis en scène sont de nouveaux fichiers), j'ai trouvé cela pratique:

git diff | git apply --reverse
41
répondu Joshua Kunzmann 2011-07-28 05:27:18

tapez git status, (utilisez " git checkout -- ..."pour annuler les modifications dans le répertoire de travail) est indiqué.

p.ex. git checkout -- .

39
répondu Erdem ÖZDEMİR 2017-01-07 01:28:18

git checkout -f


man git-checkout :

-f, --force

lors du changement de branches, procéder même si l'indice ou l'arbre de travail diffère de la tête. Ce est utilisé pour jeter les modifications locales.

lors de la vérification des chemins à partir de l'index, ne pas échouer sur les entrées non fusionnées; au lieu de cela, les entrées non fusionnées sont ignorées.

38
répondu Bijan 2014-05-17 02:28:01

vous pouvez utiliser git stash - si quelque chose tourne mal, vous pouvez toujours revenir de la cachette. Semblable à une autre réponse ici, mais celle-ci supprime aussi tous les fichiers non marqués et aussi toutes les suppressions non marquées:

git add .
git stash

si vous vérifiez que tout va bien, Jetez la cachette:

git stash drop

la réponse de Bilal Maqsood avec git clean a également fonctionné pour moi, mais avec la cachette j'ai plus de contrôle - si je fais sth accidentellement, je peux toujours récupérer mes modifications

mise à JOUR

je pense qu'il est de 1 à plus de changements (je ne sais pas pourquoi cela a fonctionné pour moi avant):

git add . -A au lieu de git add .

sans le -A les fichiers supprimés ne seront pas mis en scène

33
répondu Asped 2015-10-21 08:37:52

au lieu de rejeter les changements, j'ai réinitialisé ma télécommande à l'origine. Remarque - cette méthode est de restaurer complètement votre dossier à celui de la pension".

donc je fais ceci pour m'assurer qu'ils ne s'assoient pas là quand je réinitialise git (plus tard - exclut gitignores sur L'Origine / nom de branche)

NOTE: Si vous voulez garder des fichiers non encore suivis, mais pas dans GITIGNORE, vous pouvez sauter cette étape, car il effacera ces fichiers non tracés qui ne se trouvent pas sur votre télécommande dépôt (merci @XtrmJosh).

git add --all

Puis I

git fetch --all

puis je réinitialise à l'origine

git reset --hard origin/branchname

qui le ramènera à la case départ. Tout comme Re-cloner la branche, tout en gardant tous mes fichiers gitignorés localement et en place.

mise à jour par commentaire de l'utilisateur ci-dessous: Variation pour réinitialiser la à quelle que soit la branche courante sur laquelle l'utilisateur est.

git reset --hard @{u}
31
répondu Nick 2016-01-21 18:04:56

a essayé toutes les solutions ci-dessus, mais n'a pas pu se débarrasser de nouveaux fichiers non-marqués.

utilisez git clean -f pour supprimer ces nouveaux fichiers - avec prudence! noter l'option force.

25
répondu artur 2011-10-14 21:07:27

si vous souhaitez simplement pour supprimer les modifications aux fichiers existants , utilisez checkout ( documenté ici ).

git checkout -- .
  • aucune branche n'est spécifiée, donc elle vérifie la branche courante.
  • le double trait d'Union ( -- ) indique à Git que ce qui suit doit être considéré comme son second argument (chemin), que vous avez sauté la spécification d'une branche.
  • le période ( . ) indique tous les chemins.

si vous voulez pour supprimer les fichiers ajoutés depuis votre dernière propagation, utilisez clean ( documenté ici ):

git clean -i 
  • l'option -i initie un clean interactif , pour éviter des suppressions erronées.
  • une poignée d'autres options sont disponibles pour une exécution plus rapide; Voir la documentation.

si vous souhaitez pour déplacer des changements à un espace d'attente pour un accès ultérieur , utilisez stash ( documenté ici ):

git stash
  • tous les changements seront déplacés dans la cachette de Git, pour un accès ultérieur possible.
  • une poignée d'options sont disponibles pour le rangement plus nuancé; voir la documentation.
24
répondu jtheletter 2018-03-18 00:19:02

simplement dire

git stash

il supprimera tous vos changements locaux. Vous pouvez également utiliser plus tard en disant

git stash apply 

ou git stash pop

20
répondu piyushmandovra 2015-06-30 22:12:32

il suffit d'utiliser:

git stash -u

fait. Facile.

Si vous vraiment soins au sujet de votre cachette de la pile, alors vous pouvez suivre avec git stash drop . Mais à ce moment-là, il vaut mieux utiliser (de Mariusz Nowak):

git checkout -- .
git clean -df

néanmoins, j'aime git stash -u le meilleur parce qu'il" écarte "tous les changements tracés et non tracés dans juste une commande . Pourtant git checkout -- . seulement rejets suivi des changements, et git clean -df ne rejette que les changements non tracés... et taper les deux commandes est far trop de travail :)

20
répondu Ben Wilde 2016-09-08 06:19:32

cela fonctionne même dans les répertoires qui sont; en dehors des permissions git normales.

sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx

M'est arrivé récemment

16
répondu GlassGhost 2015-09-28 13:29:45
cd path_to_project_folder  # take you to your project folder/working directory 
git checkout .             # removes all unstaged changes in working directory
14
répondu vivekporwal04 2014-05-31 10:04:10

une autre façon de se débarrasser des nouveaux fichiers qui est plus spécifique que git clean-df (il vous permettra de se débarrasser de certains fichiers pas nécessairement tous), est d'ajouter les nouveaux fichiers à l'index d'abord, puis stash, puis drop la stash.

cette technique est utile lorsque, pour une raison quelconque, vous ne pouvez pas facilement supprimer tous les fichiers non tracés par un mécanisme ordinaire (comme rm).

10
répondu tjb 2012-06-15 08:55:35

ce qui suit n'est en réalité qu'une solution si vous travaillez avec une bifurcation d'un dépôt où vous synchronisez régulièrement (par exemple une requête pull) avec un autre dépôt. Réponse courte: supprimer fourche et refork, mais lire les avertissements sur github .

j'ai eu un problème similaire, peut-être pas identique, et je suis triste de dire que ma solution n'est pas idéale, mais elle est finalement efficace.

j'aurais souvent des messages de statut git comme celui-ci (impliquant au moins 2/4 fichiers):

$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2var.dats
#
# 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:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2Var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2Var.dats

un oeil attentif remarquera que ces fichiers ont des doubles qui sont une seule lettre dans le cas off. D'une façon ou d'une autre, et je n'ai aucune idée de ce qui m'a mené dans cette voie pour commencer (comme je ne travaillais pas avec ces fichiers moi-même à partir du repo amont), j'avais commuté ces fichiers. Essayez les nombreuses solutions énumérées sur cette page (et d'autres pages) ne semble pas aider.

j'ai pu corriger le problème en suppression de mon dépôt fourchu et de tous les dépôts locaux, et reforking. Cela ne suffisait pas; upstream a dû renommer les fichiers en question en nouveaux noms de fichiers. aussi longtemps que vous n'avez pas de travail non engagé, pas de wikis, et aucun problème qui diffère du dépôt amont, vous devriez être très bien. En amont peut ne pas être très heureux avec vous, pour dire le moins. Comme pour mon problème, c'est sans doute une erreur de l'utilisateur, comme je ne suis pas compétent avec git, mais le fait qu'il est loin d'être facile pour fixer les points à un problème avec git.

9
répondu bbarker 2014-01-13 16:42:46

à mon avis,

git clean -df

devrait faire l'affaire. Selon git documentation sur git clean

git de nettoyage à Retirer sans traces de fichiers à partir de l'arbre de travail

Description

nettoie l'arbre de travail en enlevant récursivement les fichiers qui ne sont pas sous contrôle de version, à partir de la répertoire en cours.

normalement, seuls les fichiers inconnus de Git sont supprimés, mais si l'option-x est spécifié, les fichiers ignorés sont également supprimés. Cela peut, par exemple, être utile pour supprimer tous les produits de construction.

s'il y a lieu, facultatif ... les arguments sont donnés, seulement ces chemins sont affecter.

Options

- d supprimer les répertoires introuvables ajout aux fichiers non tracés. Si un répertoire Non suivi est géré par un autre dépôt Git, il est n'est pas éliminé par défaut. L'option-f deux fois si vous voulez vraiment supprimer un répertoire.

- f -- force si la variable de configuration git clean.requireForce n'est pas défini à false, git clean refusera de s'exécuter à moins d'être-f, -n ou-I.

9
répondu Lahiru 2016-07-14 07:03:45

peu importe l'état de votre pension vous pouvez toujours réinitialiser à n'importe quelle commit précédente:

git reset --hard <commit hash>

ceci rejettera tous les changements qui ont été faits après cette commit.

9
répondu msangel 2018-01-29 16:29:26

quand vous voulez transférer une réserve à quelqu'un d'autre:

# add files
git add .  
# diff all the changes to a file
git diff --staged > ~/mijn-fix.diff
# remove local changes 
git reset && git checkout .
# (later you can re-apply the diff:)
git apply ~/mijn-fix.diff

[edit] comme le faisait remarquer, il le possible nom de caches. Eh bien, utilisez ceci si vous voulez partager votre cachette;)

7
répondu twicejr 2015-04-20 10:39:40

si tous les fichiers de mise en scène ont été réellement engagés, alors la branche peut tout simplement être réinitialisée par exemple à partir de votre GUI avec environ trois clics de souris: branche , réinitialisation , Oui !

donc ce que je fais souvent dans la pratique pour revenir en arrière des changements locaux indésirables est de commettre toutes les bonnes choses, puis réinitialiser la branche.

si la bonne chose est commise dans un seul commit, alors vous pouvez utiliser "modifier le dernier engagement" pour le ramener à l'étape de la mise en scène ou de la non-mise en scène si vous souhaitez finalement l'engager un peu différemment.

Ce n'est pas la solution technique que vous recherchez pour votre problème, mais je trouve une solution très pratique. Il vous permet de rejeter les changements non marqués de façon sélective, en réinitialisant les changements que vous n'aimez pas et en gardant ceux que vous faites.

donc en résumé, je fais simplement commit , réinitialiser la branche , et modifier la dernière propagation .

6
répondu user3070485 2015-09-04 09:56:53

aucune des solutions ne fonctionne si vous venez de changer les permissions d'un fichier (C'est sous DOS/Windoze)

Mon 23/11/2015-15:16:34.80 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   .gitignore
        modified:   LICENSE.txt
        modified:   TODO.txt
        modified:   codeStyle.xml
        modified:   pom.xml
        modified:   version.pl

no changes added to commit (use "git add" and/or "git commit -a")

Mon 23/11/2015-15:16:37.87 C:\...\work\checkout\slf4j+> git diff
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/LICENSE.txt b/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/TODO.txt b/TODO.txt
old mode 100644
new mode 100755
diff --git a/codeStyle.xml b/codeStyle.xml
old mode 100644
new mode 100755
diff --git a/pom.xml b/pom.xml
old mode 100644
new mode 100755
diff --git a/version.pl b/version.pl
old mode 100644
new mode 100755

Mon 23/11/2015-15:16:45.22 C:\...\work\checkout\slf4j+> git reset --hard HEAD
HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore

Mon 23/11/2015-15:16:47.42 C:\...\work\checkout\slf4j+> git clean -f

Mon 23/11/2015-15:16:53.49 C:\...\work\checkout\slf4j+> git stash save -u
Saved working directory and index state WIP on SLF4J_1.5.3: 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore
HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore

Mon 23/11/2015-15:17:00.40 C:\...\work\checkout\slf4j+> git stash drop
Dropped refs/stash@{0} (cb4966e9b1e9c9d8daa79ab94edc0c1442a294dd)

Mon 23/11/2015-15:17:06.75 C:\...\work\checkout\slf4j+> git stash drop
Dropped refs/stash@{0} (e6c49c470f433ce344e305c5b778e810625d0529)

Mon 23/11/2015-15:17:08.90 C:\...\work\checkout\slf4j+> git stash drop
No stash found.

Mon 23/11/2015-15:17:15.21 C:\...\work\checkout\slf4j+> git checkout -- .

Mon 23/11/2015-15:22:00.68 C:\...\work\checkout\slf4j+> git checkout -f -- .

Mon 23/11/2015-15:22:04.53 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   .gitignore
        modified:   LICENSE.txt
        modified:   TODO.txt
        modified:   codeStyle.xml
        modified:   pom.xml
        modified:   version.pl

no changes added to commit (use "git add" and/or "git commit -a")

Mon 23/11/2015-15:22:13.06 C:\...\work\checkout\slf4j+> git diff
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/LICENSE.txt b/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/TODO.txt b/TODO.txt
old mode 100644
new mode 100755
diff --git a/codeStyle.xml b/codeStyle.xml
old mode 100644
new mode 100755
diff --git a/pom.xml b/pom.xml
old mode 100644
new mode 100755
diff --git a/version.pl b/version.pl
old mode 100644
new mode 100755

la seule façon de corriger ceci est de réinitialiser manuellement les permissions sur les fichiers modifiés:

Mon 23/11/2015-15:25:43.79 C:\...\work\checkout\slf4j+> git status -s | egrep "^ M" | cut -c4- | for /f "usebackq tokens=* delims=" %A in (`more`) do chmod 644 %~A

Mon 23/11/2015-15:25:55.37 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
nothing to commit, working directory clean

Mon 23/11/2015-15:25:59.28 C:\...\work\checkout\slf4j+>

Mon 23/11/2015-15:26:31.12 C:\...\work\checkout\slf4j+> git diff

5
répondu Malcolm Boekhoff 2015-11-23 04:30:57

vous pouvez créer votre propre alias qui décrit comment le faire de manière descriptive.

j'utilise l'alias suivant pour rejeter les modifications.


supprimer les changements dans un (des) fichier(s) dans l'arbre de travail

discard = checkout --

alors vous pouvez l'utiliser comme prochain à jeter toutes les modifications:

discard .

ou juste un fichier:

discard filename

Sinon, si vous voulez rejeter toutes les modifications et aussi les fichiers non tracés, j'utilise un mélange de caisse et de nettoyer:

nettoyer et rejeter les changements et les fichiers non tracés dans l'arbre de travail

cleanout = !git clean -df && git checkout -- .

ainsi l'utilisation est simple comme suivante:

cleanout

est maintenant disponible dans le prochain GitHub repo qui contient beaucoup d'alias:

5
répondu Pau 2017-06-05 04:51:09

si vous êtes dans le cas de submodule et pas d'autres solutions travailler essayer:

  • pour vérifier quel est le problème (peut-être un cas" sale") utiliser:

    git diff

  • pour enlever la cachette

    git submodule update

5
répondu onalbi 2017-07-18 12:22:21

j'ai eu une situation étrange où un dossier est toujours non classé, cela m'aide à résoudre.

git rm .gitattributes

git add -Un

git reset --hard

5
répondu SDV 2017-07-18 12:23:33