Comment dois-je jeter unstaged changements dans Git?
Comment puis-je annuler les modifications dans la copie de travail qui ne sont pas dans l'index?
- Voir aussi stackoverflow.com/questions/22620393/...
git-clean
seulement enlève sans traces de fichiers à partir de l'arbre de travail git-scm.com/docs/git-clean- Afin de clarifier Asenar du commentaire ci-dessus,
git-clean -df
peut être dangereux. Il va supprimer local sans traces de fichiers (par exemple, couverts par une .gitignore) Lire tous les ci-dessous avec soin et d'envisager git checkout . au lieu de cela - git "clean -df' Être averti! J'ai essayé et perdu la clé de dossiers qui ne peuvent pas être restaurés... Aïe!
- frapper
git status
donne une suggestion sur la façon de le faire!git checkout -- .
- git gui a une fonction qui prendra en toute sécurité d'annuler les changements. .gitignore est honoré par ce programme où, comme git-propre ne pas l'utiliser du tout.
- Qu'en est-il des fichiers qui ont été créés? Ces enlevé trop?
- Je pense que la question devrait être: "Comment puis-je jeter unstaged changements dans l'Arbre de Travail" Parce que vous pouvez unstage changements dans la zone de transit par
git reset HEAD file1
qui remplacefile1
de la plus récente s'engager à commettre l'Histoire.pour la zone de transit.
Vous devez vous connecter pour publier un commentaire.
Un autre moyen plus rapide est:
Vous n'avez pas besoin d'inclure
--include-untracked
si vous ne voulez pas être approfondie à ce sujet.Après cela, vous pouvez déposer que stash avec un
git stash drop
commande si vous le souhaitez.--include-untracked
ainsi.git reset
commande annuler les modifications dans l'index de trop.git stash
, ni n'importe quelle variété degit checkout
jetez unstaged supprime. En fonction de la sortie degit status
, la réponse est ici quelque saveurgit reset HEAD
git checkout -- .
fait le travail avec une commande uniquement.stash save --keep-index --include-untracked
et utiliser le coffre comme une corbeille de sorte que vous pouvez toujours restaurer facilement vos modifications si le nettoyage d'eux fut une erreur.git clean
a un sèche-option exécuter,-n
save
option est déconseillée en faveur degit stash push
. Elle diffère de la "cachette" push " en ce qu'elle ne peut pas prendre pathspecs, et toute autre option arguments de la forme du message. git-scm.comstash save --keep-index --include-untracked
: Comment voulez-vous restaurer les changements si vous vous rendez compte que le nettoyage a été une erreur?Pour tous unstaged fichiers dans le répertoire de travail en cours d'utilisation:
Pour un fichier spécifique d'utilisation:
--
ici pour supprimer argument ambiguation.git status
error: The following untracked working tree files would be overwritten by checkout: ...
.git checkout .
, sauf que vous êtes explicite sur le fait que vous n'êtes pas en spécifiant le nom de la branche. Ils disent tous les deux la caisse de la version TÊTE sur la branche, je suis actuellement sur de '.' ou './'. Si vous negit checkout branch-name directory-or-file-name
en général, vous obtenez la version TÊTE dedirectory-or-file-name
sur la branchebranch-name
.git checkout .
est plus courtegit checkout HEAD
ne fait pas annuler les modifications pour moi, doncstash
solution à base reste la préférée.git checkout
sinon il ne sera pas tuer les changements que vous faites! Le truc avec.
est qu'une caisse avec chemin d'accès inclut également tous les sous-répertoires.git clean -- .
devrait faire ce que je voulais faire. La lecture de cette réponse et de tests l'ont confirmé. Mais pour une raison quelconque, IL NE fonctionne PAS DANS les SUBMODULES! Pourquoi pas? <soupir>git stash save --keep-index
solution, car il crée un commit. Même si je fais ungit stash drop
immédiatement après lastash save
la validation peut encore être restauré. Ainsi, legit stash save ...
solution est plus sûr que dans le cas où vous avez jeté trop. E. g. à l'aide de stackoverflow.com/questions/89332/recover-dropped-stash-in-gitgit checkout -- path/to/file/to/revert
?git checkout -- :/
(je cherchais moi-même!)git add <filename>
?Il semble que la solution complète est:
git propre
supprime tous sans traces de fichiers (avertissement: bien qu'il ne supprimez pas les fichiers ignorés mentionné directement dans .gitignore, il peut supprimer les fichiers ignorés résidant dans des dossiers) etgit checkout
efface tous les unstaged changements.git reset --hard
-- .
? Faut-il dire que la caisse actuelle derniers s'engagent à dossier en cours?git checkout -- .
il fonctionne parfaitement..gitignore
d.git -df
fonctionne, je recommande d'ajouter len
option si vous êtes encore nouveau à l'exécution de la commande, c'est à diregit -dfn
. Ce sera l'exécuter dansdry-run
mode de sorte que vous pouvez voir ce qui va être supprimé sans pour autant la supprimer et de faire quoi que ce soit. Si vous êtes d'accord avec le résultat, vous devez exécuter à nouveau sans len
option.Ce qui vérifie l'indice actuel du répertoire courant, de jeter toutes les modifications dans les fichiers à partir du répertoire courant vers le bas.
ou ce qui vérifie tous les fichiers de l'index, de l'écrasement de travail de l'arborescence de fichiers.
git checkout .
etgit checkout -- .
?git stash save --keep-index
.git checkout --
ne fonctionne pas si vous avez une seule branche.git checkout .
fonctionne toujours.Nettoie l'arbre de travail par récursivement de la suppression des fichiers qui ne sont pas sous contrôle de version, en commençant à partir du répertoire courant.
-d
: Retirer sans traces répertoires en plus sans traces de fichiers-f
: Force (qui peut ne pas être nécessaire en fonction de laclean.requireForce
réglage)Exécuter
git help clean
à voir le manuelMon préféré est
Qui vous permet de manière sélective revenir les morceaux.
Voir aussi:
-p
ajoute une belle couche supplémentaire de sécurité. Combiner avecgit clean -d
pour effectivement répondre à l'OP.Depuis pas de réponse suggère l'exacte option de combinaison que j'utilise, elle est ici:
C'est à l'aide en ligne de texte pour le
git clean
options:-d
Retirer sans traces répertoires en plus sans traces de fichiers. Si un sans traces répertoire est géré par un autre dépôt Git, il n'est pas retiré par défaut. Utilisation
-f
option deux fois si vous voulez vraiment supprimer ce répertoire.-f
Si la configuration Git variable
clean.requireForce
n'est pas définie àfalse
, Git propre refusera de supprimer des fichiers ou des répertoires, à moins que-f
,-n
, ou-i
. Git va refuser de supprimer des répertoires à l'intérieur de la.git
sous-répertoire ou un fichier, à moins d'une seconde-f
est donné.-x
N'utilisez pas l'ignorer les règles de
.gitignore
(par répertoire) et$GIT_DIR/info/exclude
, mais ne utilisez encore l'ignorer des règles avec-e
options. Cela permet de supprimer tous les sans traces de fichiers, y compris les produits de construction. Ceci peut être utilisé (éventuellement en collaboration avec desgit reset
) pour créer un magnifique répertoire de travail pour tester une nouvelle version.Aussi,
git checkout .
doit être fait dans la racine de l'opération.git reset --hard
à la place? (qui est en fait équivalent àgit reset --hard HEAD
et doit fonctionner selon ce qui est le répertoire en cours...)git clean -dfx
, voici une astuce que j'utilise pour être sur le côté sûr, avant de l'exécuter: il suffit de lancergit clean -d -x -n
avant, pour afficher la liste des fichiers à être supprimé, puis confirmez l'opération en cours d'exécutiongit clean -d -x -f
(j'ai mis de l'argument-n
, resp.-f
en fin de compte être en mesure de rapidement changer dans un terminal).gitignore
vous allez les perdre. Donc penser à sauvegarder votre projet avant cette.J'ai vraiment trouvé cet article utile pour expliquer quand utiliser quoi de commande: http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/
Il ya un couple de différents cas:
Si vous n'avez pas mis en scène le fichier, puis 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és à l'index)... cette commande vous essentiellement revenir les fichiers à ce que votre dernier commit a été.git checkout -- foo.txt
Si vous avez mis en scène le fichier, puis utiliser git reset. Réinitialiser les modifications de l'index pour correspondre à un commit.
git reset -- foo.txt
Je soupçonne que l'utilisation de
git stash
est un choix populaire, car il est un peu moins dangereux. Vous pouvez toujours revenir en arrière si vous avez accidentellement coup trop loin lors de l'utilisation de git reset. Reset est récursive par défaut.Prendre un coup d'oeil à l'article ci-dessus pour plus de conseils.
La façon la plus simple de le faire est par l'utilisation de 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, cachant sans traces de fichiers est atteint par l'utilisation de:
http://git-scm.com/docs/git-stash
.
à la fin. À l'avenir moi: la période est indispensable!git clean -fd
pour nettoyer les fichiers qui ne sont pas dans l'index.Si vous ne souhaitez pour supprimer des changements à des fichiers existants, utilisez
checkout
(documenté ici).--
) indique à Git que ce qui suit doit être pris comme deuxième argument (chemin), que vous avez sauté la spécification d'une branche..
) indique tous les chemins.Si vous voulez pour supprimer les fichiers ajoutés depuis votre dernière validation, utilisation
clean
(documenté ici):-i
option lance interactifclean
, pour éviter trompe suppressions.Si vous souhaitez pour déplacer des modifications à une exploitation de l'espace pour un accès ultérieur, utilisez
stash
(documenté ici):Si vous n'êtes pas intéressé à garder le unstaged changements (surtout si la mise en scène changements sont de nouveaux fichiers), j'ai trouvé cela très pratique:
Comme vous le type git status,
(utilisez "git checkout -- ..." pour annuler les modifications dans le répertoire de travail)
est indiqué.
par exemple
git checkout -- .
git checkout -f
man git-checkout
:-f, --force
Lors de la commutation de branches, aller de l'avant même si l'indice ou de 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 de l'index, ne manquent pas sur non fusionné entrées; au lieu de cela, non fusionné entrées sont ignorées.
Vous pouvez utiliser git stash - si quelque chose va mal, vous pouvez toujours revenir à la cachette.
Semblable à une autre réponse ici, mais celui-ci supprime également tous les unstaged fichiers et aussi tous les unstaged supprime:
si vous vérifiez que tout est OK, jeter le ranger:
La réponse de Bilal Maqsood avec
git clean
a également travaillé pour moi, mais avec la réserve que j'ai plus de contrôle - si je peux faire qqch accidentellement, je peux encore faire mes modificationsMise à 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 degit add .
sans
-A
les fichiers supprimés ne seront pas mis en scèneAu lieu de jeter les changements, j'ai réinitialisé mon distance à l'origine. Remarque - cette méthode est de restaurer complètement votre dossier à celui de la pension".
Donc ce que je fais pour être sûr de ne pas s'asseoir là quand j'ai git reset (plus tard, à l'exclusion du gitignores sur l'Origine/branchname)
REMARQUE: Si vous souhaitez conserver les fichiers non encore identifiés, mais pas dans GITIGNORE vous pouvez sauter cette étape, car elle va effacer ces sans traces de fichiers ne se trouvent pas sur votre dépôt distant (merci @XtrmJosh).
Puis Je
Puis-je réinitialiser à l'origine
Qui va le remettre à la place une. Tout comme RE-Clonage de la branche, tout en gardant toutes mes gitignored fichiers en local et en place.
Mise à jour par l'utilisateur commentaire ci-dessous:
La Variation de réinitialiser le à quelle que soit la branche courante, l'utilisateur est sur.
--untracked-files[=<mode>]
que sans traces de fichiers sont affichés par défaut dansgit status
, et vous pouvez dire de ne pas les afficher si cela vous dérange! Pour l'enregistrement,git add --all
mettra en scène les fichiers prêts pour s'engager, à quel point git les reconnaît (d'où git reset --hard ensuite le travail).git clean
enlève sans traces de fichiers voir icigit reset --hard @{u}
qui réinitialise la branche à l'endroit où la distance en cours-suivi de la branche estEssayé toutes les solutions ci-dessus, mais ne pouvait toujours pas se débarrasser de nouvelles, unstaged fichiers.
Utilisation
git clean -f
de supprimer ces nouveaux fichiers - avec prudence tout de même! Remarque l'option force.simplement dire
Il va supprimer toutes vos modifications locales. Vous pouvez également utiliser plus tard en disant
ou
git stash pop
Suffit d'utiliser:
Fait. Facile.
Si vous vraiment de soins au sujet de votre cachette de la pile, alors vous pouvez suivre avec
git stash drop
. Mais à ce stade, vous êtes mieux de les utiliser (à partir de Mariusz Nowak):Néanmoins, j'aime
git stash -u
le meilleur parce qu'il "rejette" toutes les marques et sans traces des changements dans la juste une commande. Encoregit checkout -- .
seulement les rejets de suivi des modifications,et
git clean -df
seulement les rejets sans traces de changements... et taper les deux commandes est loin trop de travail 🙂git stash -u
vais bientôt (Git 2.14.x/2.15, T3 2017) évoluer un peu: stackoverflow.com/a/46027357/6309git stash -k
à mon avis.Cela fonctionne même dans des répertoires qui sont, en dehors de la normale git autorisations.
M'est arrivé récemment
git help clean
"-d Retirer sans traces répertoires en plus sans traces de fichiers".N'importe quel état de votre dépôt est, vous pouvez toujours réinitialiser pour toute livraison antérieure:
Cela va annuler toutes les modifications qui ont été faites après que s'engager.
Un autre moyen de se débarrasser de nouveaux fichiers que est plus spécifique que git propre -df (il vous permettra de vous débarrasser de certains fichiers qui ne sont pas nécessairement tous), est d'ajouter les nouveaux fichiers de l'indice d'abord, puis les ranger, puis déposez la cachette.
Cette technique est utile lorsque, pour une raison quelconque, vous ne pouvez pas supprimer facilement tous les sans traces de fichiers par certaines ordinaire mécanisme (comme rm).
À mon avis,
devrait faire l'affaire. Comme par Git documentation sur git propre
Description
Options
Ce qui suit n'est vraiment qu'une solution si vous travaillez avec une fourchette d'un référentiel où vous régulièrement synchroniser (par exemple, tirer la demande) avec un autre repo. Réponse courte: supprimer la fourche et refork, mais lire les avertissements sur github.
J'ai eu un problème similaire, peut-être pas identiques, et je suis triste de dire que ma solution n'est pas idéale, mais c'est finalement efficace.
J'ai serait ont souvent git status message (impliquant au moins 2/4 fichiers):
Un œil attentif remarquera que ces fichiers ont des dopplegangers une seule lettre dans le cas off. En quelque sorte, et je n'ai aucune idée de ce qui m'a amené sur cette voie pour commencer (comme je l'ai été de ne pas travailler avec ces fichiers moi-même de l'amont repo), j'avais mis ces fichiers. Essayez les nombreuses solutions listées sur cette page (et les autres pages) ne semble pas aider.
J'ai été en mesure de résoudre le problème par la suppression de mon fourche dépôt et les dépôts locales, et reforking. Ce n'était pas suffisant; en amont a pour renommer les fichiers en question pour de nouveaux noms de fichiers. Tant que vous n'avez pas de uncommited de travail, pas de wikis, et pas de questions qui divergent à partir de l'amont du référentiel, vous devriez être 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 à fixer des points à un problème avec git en tant que bien.
Si vous voulez transférer d'une cachette à quelqu'un d'autre:
[edit] comme le faisait remarquer, il le possible nom de caches. Eh bien, utilisez-le si vous voulez partager votre cachette 😉
git stash save "Feature X work in progress"
.Vous pouvez créer vos propres alias qui explique comment le faire d'une manière descriptive.
- Je utiliser la prochaine alias pour ignorer les changements.
Annuler les modifications dans un (liste des) fichier(s) dans l'arbre de travail
Alors vous pouvez l'utiliser comme prochaine pour annuler tous les changements:
Ou tout simplement un fichier:
Sinon, si vous souhaitez annuler toutes les modifications et aussi la sans traces de fichiers, j'utilise un mélange de caisse et propre:
Nettoyer et éliminer les modifications et sans traces des fichiers dans l'arbre de travail
Donc l'utilisation est simple comme suivant:
Est maintenant disponible dans le prochain dépôt Github qui contient beaucoup d'alias:
Si toutes les étapes de fichiers ont été commis, alors que la direction générale peut simplement être réinitialisé par exemple, à partir de votre interface graphique avec environ trois clics de souris: Branche, Réinitialiser, Oui!
Donc ce que je fais souvent, dans la pratique, pour revenir indésirables des changements locaux, c'est commettre toutes les bonnes choses, et puis réinitialiser la branche.
Si les bonnes choses est engagé dans un seul commit, vous pouvez utiliser le bouton "modifier le dernier commit" pour le ramener à être mis en scène ou unstaged si vous voulez, à terme, de s'engager un peu différemment.
Cela pourrait ne pas être la solution technique que vous recherchez pour votre problème, mais je trouve une solution très pratique. Il vous permet d'ignorer unstaged les modifications de manière sélective, en réinitialisant les changements que vous n'aimez pas et de garder ceux qui vous plaisent.
Donc en résumé, je n'ai tout simplement commettre, branche de réinitialisation, et modifier le dernier commit.
Si vous êtes dans le cas de sous-module et pas d'autres solutions à essayer:
Pour vérifier quel est le problème (peut-être un "sale" affaire) utilisation:
git diff
Pour supprimer cachette
git submodule update
J'ai eu une drôle de situation où un fichier est toujours unstaged, cela m'aide à résoudre.
Si c'est presque impossible de déterminer les modifications des fichiers, avez-vous envisagé de les ignorer? Si cette déclaration est à droite et vous ne touchez pas à ces fichiers au cours de votre développement, cette commande peut être utile:
git update-index --assume-unchanged file_to_ignore
Aucune des solutions de travail si vous venez de modifier le autorisations d'un fichier (ce qui est au DOS/Windoze)
Le seul moyen de résoudre ce problème est de réinitialiser manuellement les autorisations sur les fichiers modifiés:
Suffit d'utiliser:
Cela permettra de ranger unstaged changements et sans traces de fichiers (nouveaux dossiers) et de garder la mise en scène des fichiers.
C'est mieux que
reset
/checkout
/clean
, car vous risquez de vous voulez revenir plus tard (pargit stash pop
). Les garder dans le coffre est mieux que de les jeter.git reset --hard -> Jeter le tout de façon permanente
git stash -> Jeter tous les changements, mais les enregistrer pour plus tard