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?
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.
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.
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.
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
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
mon préféré est
git checkout -p
qui permet de retourner sélectivement des morceaux.
voir aussi:
git add -p
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.
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:
-
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
-
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.
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
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
tapez git status, (utilisez " git checkout -- ..."pour annuler les modifications dans le répertoire de travail) est indiqué.
p.ex. git checkout -- .
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.
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
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}
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.
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 unclean
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.
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
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 :)
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
cd path_to_project_folder # take you to your project folder/working directory
git checkout . # removes all unstaged changes in working directory
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).
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.
à 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.
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.
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;)
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 .
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
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:
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
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