Comment supprimer les modifications de ma copie de travail qui ne figurent pas dans l'index?
git
version-control
Lecture seulement
la source
la source
git-clean
supprime uniquement les fichiers non suivis de l'arborescence de travail git-scm.com/docs/git-cleangit-clean -df
peut être dangereux. Il supprimera les fichiers locaux non suivis (par exemple, couverts par un .gitignore). Lisez tous ci-dessous attentivement et envisagez de passer à Git. à la placegit status
donne une suggestion sur la façon de le faire!git checkout -- .
git status
donne la suggestion:git restore
.git restore
est une nouvelle commande exactement à cet effet. Voir ma mise à jour 2019 .Réponses:
Un autre moyen plus rapide est:
Vous n'avez pas besoin d'inclure
--include-untracked
si vous ne voulez pas être approfondi à ce sujet.Après cela, vous pouvez supprimer cette cachette avec une
git stash drop
commande si vous le souhaitez.la source
--include-untracked
aussi.git reset
commande supprimera également les modifications de l'index.git stash
, ni aucune variété degit checkout
ne supprimera les suppressions non mises en scène. Selon la sortie degit status
, la vraie réponse correcte ici est un peu de saveurgit reset HEAD
git checkout -- .
fait le travail avec une seule commande.Pour tous les fichiers non classés dans le répertoire de travail actuel, utilisez:
Pour un fichier spécifique, utilisez:
--
ici pour supprimer l' ambiguïté des arguments .la source
git status
error: The following untracked working tree files would be overwritten by checkout: ...
.git checkout -- .
signifie la même chose quegit checkout .
, sauf que vous êtes explicite sur le fait que vous ne spécifiez pas le nom de la branche. Ils disent tous les deux que je vérifie la version HEAD sur la branche sur laquelle je suis actuellement. ou './'. Si vous le faitesgit checkout branch-name directory-or-file-name
en général, vous obtenez la version HEAD dedirectory-or-file-name
on branchbranch-name
.Il semble que la solution complète soit:
git clean
supprime tous les fichiers non suivis ( avertissement : bien qu'il ne supprime pas les fichiers ignorés mentionnés directement dans .gitignore, il peut supprimer les fichiers ignorés résidant dans les dossiers ) etgit checkout
efface toutes les modifications non mises en scène.la source
git reset --hard
Cela extrait l'index en cours du répertoire en cours, supprimant toutes les modifications des fichiers du répertoire en cours vers le bas.
ou celui qui extrait tous les fichiers de l'index, écrasant les fichiers de l'arborescence de travail.
la source
git checkout .
etgit checkout -- .
?git stash save --keep-index
.Nettoie l'arborescence de travail en supprimant récursivement les fichiers qui ne sont pas sous contrôle de version, à partir du répertoire actuel.
-d
: Supprimer les répertoires non suivis en plus des fichiers non suivis-f
: Force (peut ne pas être nécessaire selon leclean.requireForce
réglage)Courez
git help clean
pour voir le manuella source
Mon favori est
Cela vous permet de rétablir sélectivement des morceaux.
Voir également:
la source
-p
ajoute une belle couche supplémentaire de sécurité. Combinez-le avecgit clean -d
pour répondre réellement à OP.Puisqu'aucune réponse ne suggère la combinaison d'options exacte que j'utilise, la voici:
Voici le texte d'aide en ligne pour les
git clean
options utilisées :-d
Supprimez les répertoires non suivis en plus des fichiers non suivis. Si un répertoire non suivi est géré par un autre référentiel Git, il n'est pas supprimé par défaut. Utilisez l'
-f
option deux fois si vous voulez vraiment supprimer un tel répertoire.-f
Si la variable de configuration Git
clean.requireForce
n'est pas définifalse
, propre Git refusera de supprimer des fichiers ou des répertoires à moins donné-f
,-n
ou-i
. Git refusera de supprimer les.git
répertoires du sous - répertoire ou du fichier, sauf si un second-f
est donné.-x
N'utilisez pas les règles Ignorer de
.gitignore
(par répertoire) et$GIT_DIR/info/exclude
, mais utilisez toujours les règles Ignorer fournies avec les-e
options. Cela permet de supprimer tous les fichiers non suivis, y compris les produits de construction. Cela peut être utilisé (éventuellement en conjonction avecgit reset
) pour créer un répertoire de travail vierge pour tester une construction propre.En outre,
git checkout .
doit être fait à la racine du dépôt.la source
git reset --hard
place? (qui est en fait équivalent àgit reset --hard HEAD
et devrait fonctionner quel que soit le répertoire actuel ...)git clean -dfx
, voici une astuce que j'utilise pour être prudent avant de l'exécuter: exécutez-legit clean -d -x -n
avant, pour afficher la liste des fichiers à supprimer, puis confirmez l'opération en exécutantgit clean -d -x -f
(je mets l'argument-n
, resp.-f
à la fin pour pouvoir le changer rapidement dans un terminal).gitignore
vous les perdrez. Pensez donc à sauvegarder votre projet avant cela.Si vous souhaitez simplement supprimer les modifications apportées aux fichiers existants , utilisez
checkout
( documenté ici ).--
) indique à Git que ce qui suit doit être pris comme deuxième argument (chemin), que vous avez ignoré la spécification d'une branche..
) indique tous les chemins.Si vous souhaitez supprimer les fichiers ajoutés depuis votre dernier commit, utilisez
clean
( documenté ici ):-i
option lance une interactionclean
pour éviter les suppressions erronées.Si vous souhaitez déplacer les modifications vers un espace d'attente pour un accès ultérieur , utilisez
stash
( documenté ici ):la source
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 existe quelques cas différents:
Si vous n'avez pas mis en scène le fichier, vous utilisez
git checkout
. Checkout "met à jour les fichiers dans l'arborescence de travail pour correspondre à la version dans l'index". Si les fichiers n'ont pas été transférés (alias ajoutés à l'index) ... cette commande ramènera essentiellement les fichiers à ce qu'était votre dernier commit.git checkout -- foo.txt
Si vous avez organisé le fichier, utilisez git reset. Réinitialiser modifie l'index pour correspondre à une validation.
git reset -- foo.txt
Je soupçonne que l'utilisation
git stash
est un choix populaire car c'est un peu moins dangereux. Vous pouvez toujours y revenir si vous soufflez trop accidentellement lors de l'utilisation de git reset. La réinitialisation est récursive par défaut.Jetez un œil à l'article ci-dessus pour plus de conseils.
la source
La façon la plus simple de le faire est d'utiliser cette commande:
Cette commande est utilisée pour annuler les modifications dans le répertoire de travail -
https://git-scm.com/docs/git-checkout
Dans la commande git, le stockage des fichiers non suivis est réalisé en utilisant:
http://git-scm.com/docs/git-stash
la source
.
la fin. Pour moi à l'avenir: la période est indispensable !git clean -fd
pour nettoyer les fichiers qui ne sont pas dans l'index.Si vous n'êtes pas intéressé à conserver les modifications non mises en scène (surtout si les modifications mises en scène sont de nouveaux fichiers), j'ai trouvé ceci pratique:
la source
git checkout -f
man git-checkout
:-f, --force
Lorsque vous changez de branche, procédez même si l'index ou l'arborescence de travail diffère de HEAD. Ceci est utilisé pour supprimer les modifications locales.
Lors de la vérification des chemins à partir de l'index, n'échouez pas lors des entrées non fusionnées; au lieu de cela, les entrées non fusionnées sont ignorées.
la source
Lorsque vous tapez git status, (utilisez "git checkout - ..." pour ignorer les modifications dans le répertoire de travail) s'affiche.
par exemple
git checkout -- .
la source
Vous pouvez utiliser git stash - si quelque chose ne va pas, vous pouvez toujours revenir de la stash. Semblable à une autre réponse ici, mais celle-ci supprime également tous les fichiers non mis en scène et également toutes les suppressions non mises en scène:
si vous vérifiez que tout va bien, jetez la cachette:
La réponse de Bilal Maqsood a
git clean
également fonctionné pour moi, mais avec la cachette, j'ai plus de contrôle - si je le fais accidentellement, je peux toujours récupérer mes modificationsMISE À JOUR
Je pense qu'il y a 1 changement de plus (je ne sais pas pourquoi cela a fonctionné pour moi auparavant):
git add . -A
au lieu degit add .
sans les
-A
fichiers supprimés ne seront pas mis en scènela source
Mise à jour 2019:
Depuis Juillet 2019 , il y a eu une nouvelle commande qui fait exactement ceci:
git restore
.Dans
git status
, maintenant, Git recommande d'utiliser cette commande au lieu degit checkout
ce qu'il était auparavant.Bien que cette commande puisse également être utilisée pour restaurer l'arborescence de travail dans une validation spécifique ou pour restaurer le contenu de l'index, par défaut, l'arborescence de travail est restaurée à l'état dans l'index (ce qui est demandé ici).
Donc, afin de restaurer les fichiers correspondant à une pathspec (en se débarrassant de leurs modifications non mises en scène), vous feriez:
Par exemple, pour restaurer toutes les modifications non mises en scène dans le répertoire en cours, vous pouvez exécuter:
Si vous l'exécutez à partir de la racine du projet, il restaurera toutes les modifications non mises en scène dans l'ensemble du référentiel.
Notez que, comme avec
git checkout -- .
(comme l'a souligné Mariusz Nowak), cela ne supprimera que les modifications apportées aux fichiers suivis par Git et ne supprimera aucun nouveau fichier non suivi. Si vous souhaitez supprimer toutes les modifications non mises en scène, y compris les nouveaux fichiers non suivis, vous pouvez exécuter un autre:Soyez très prudent avec cette commande ultérieure, car vous pourriez supprimer les fichiers dont vous n'aviez pas l'intention de vous débarrasser.
Remarque
git restore
: comme il s'agit d'une nouvelle commande, sa page de manuel donne un avertissement:Il est donc possible que cette réponse devienne obsolète si le comportement change à l'avenir. Il pourrait donc être judicieux d'exécuter un rapide
man git-restore
avant de l'utiliser.la source
git restore .
fonctionnait parfaitement. Merci.git restore <filename>
et cela a parfaitement fonctionné.git restore .
restaure tous les fichiers dans le répertoire actuel, pas dans tout le référentiel.Au lieu d'annuler les modifications, je remets ma télécommande à l'origine. Remarque - cette méthode consiste à restaurer complètement votre dossier dans celui du dépôt.
Donc, je fais cela pour m'assurer qu'ils ne restent pas là quand je réinitialise git (plus tard - exclut les gitignores sur l'origine / le nom de la branche)
REMARQUE: Si vous souhaitez conserver les fichiers non encore suivis, mais pas dans GITIGNORE, vous pouvez ignorer cette étape, car cela effacera ces fichiers non suivis introuvables sur votre référentiel distant (merci @XtrmJosh).
Alors je
Ensuite, je réinitialise à l'origine
Cela le ramènera à la case départ. Tout comme RE-Clonage de la branche, TOUT EN gardant tous mes fichiers gitignored localement et en place.
Mise à jour par commentaire utilisateur ci-dessous: Variation pour réinitialiser la branche actuelle de l'utilisateur.
la source
git reset --hard @{u}
réinitialiser la branche là où se trouve la branche actuelle de suivi à distanceJ'ai essayé toutes les solutions ci-dessus mais je n'ai toujours pas pu me débarrasser des nouveaux fichiers non organisés.
Utilisez
git clean -f
pour supprimer ces nouveaux fichiers - avec prudence cependant! Notez l'option de force.la source
dis simplement
Il supprimera toutes vos modifications locales. Vous pouvez également utiliser plus tard en disant
ou git stash pop
la source
Utilisez simplement:
Terminé. Facile.
Si vous vous souciez vraiment de votre pile de réserves, vous pouvez suivre
git stash drop
. Mais à ce stade, il vaut mieux utiliser (de Mariusz Nowak):Néanmoins, j'aime
git stash -u
le meilleur car il "rejette" toutes les modifications suivies et non suivies en une seule commande . Pourtant,git checkout -- .
seuls les changements suivis sontgit clean -df
ignorés , et seuls les changements non suivis sont ignorés ... et taper les deux commandes est beaucoup trop de travail :)la source
git stash -u
va bientôt (Git 2.14.x / 2.15, Q3 2017) évoluer un peu: stackoverflow.com/a/46027357/6309git stash -k
à mon avis.Pour effectuer un rejet permanent:
git reset --hard
Pour enregistrer les modifications pour plus tard:
git stash
la source
Cela fonctionne même dans les répertoires qui sont; en dehors des autorisations git normales.
M'est arrivé récemment
la source
git help clean
"-d Supprimer les répertoires non suivis en plus des fichiers non suivis."vous avez une commande git très simple
git checkout .
la source
la source
À mon avis,
devrait faire l'affaire. Selon la documentation Git sur git clean
La description
Les options
la source
Quel que soit l'état dans lequel se trouve votre dépôt, vous pouvez toujours réinitialiser n'importe quel commit précédent:
Cela annulera toutes les modifications apportées après cette validation.
la source
Une autre façon de se débarrasser des nouveaux fichiers qui est plus spécifique que git clean -df (cela vous permettra de vous débarrasser de certains fichiers pas nécessairement tous), est d'ajouter d'abord les nouveaux fichiers à l'index, puis de les cacher, puis de les supprimer. planque.
Cette technique est utile lorsque, pour une raison quelconque, vous ne pouvez pas facilement supprimer tous les fichiers non suivis par un mécanisme ordinaire (comme rm).
la source
Ce qui suit n'est vraiment qu'une solution si vous travaillez avec un fork d'un référentiel où vous vous synchronisez régulièrement (par exemple, pull request) avec un autre référentiel. Réponse courte: supprimez fork et refork, mais lisez 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'avais souvent des messages d'état git comme celui-ci (impliquant au moins 2/4 fichiers):
Un œil attentif notera que ces fichiers ont des dopplegangers qui sont une seule lettre au cas où. D'une manière ou d'une autre, et je n'ai aucune idée de ce qui m'a amené sur cette voie pour commencer (comme je ne travaillais pas moi-même avec ces fichiers depuis le dépôt en amont), j'avais changé ces fichiers. Essayez les nombreuses solutions répertoriées sur cette page (et d'autres pages) ne semblent pas aider.
J'ai pu résoudre le problème en supprimant mon référentiel forké et tous les référentiels locaux et en reforgeant. Cela seul ne suffisait pas; en amont a dû renommer les fichiers en question en nouveaux noms de fichiers. Tant que vous n'avez pas de travail non engagé, pas de wikis et pas de problèmes qui divergent du référentiel en amont, tout devrait bien se passer. L'amont peut ne pas être très content de vous, c'est le moins qu'on puisse dire. Quant à mon problème, c'est sans aucun doute une erreur utilisateur car je ne suis pas très compétent avec git, mais le fait qu'il soit loin d'être facile à résoudre pointe également vers un problème avec git.
la source
Lorsque vous souhaitez transférer une réserve à quelqu'un d'autre:
[modifier] comme commenté, il est possible de nommer les cachettes. Eh bien, utilisez-le si vous voulez partager votre cachette;)
la source
git stash save "Feature X work in progress"
.Vous pouvez créer votre propre alias qui décrit comment le faire de manière descriptive.
J'utilise l'alias suivant pour ignorer les modifications.
Ignorer les modifications dans une (liste de) fichier (s) dans l'arborescence de travail
Ensuite, vous pouvez l'utiliser comme suivant pour ignorer toutes les modifications:
Ou juste un fichier:
Sinon, si vous souhaitez supprimer toutes les modifications et également les fichiers non suivis, j'utilise un mélange de vérification et de nettoyage:
Nettoyer et ignorer les modifications et les fichiers non suivis dans l'arborescence de travail
Donc l'utilisation est simple comme prochaine:
Maintenant est disponible dans le prochain dépôt Github qui contient beaucoup d'alias:
la source
J'ai eu une situation étrange où un fichier est toujours non organisé, cela m'aide à résoudre.
la source