git annuler toutes les modifications non validées ou non enregistrées

834

J'essaie d'annuler toutes les modifications depuis mon dernier commit. J'ai essayé git reset --hardet git reset --hard HEADaprès avoir vu ce post . Je réponds que la tête est maintenant au 18c3773 ... mais quand je regarde ma source locale, tous les fichiers sont toujours là. Qu'est-ce que je rate?

Antarr Byrd
la source
1
Ceci est une excellente ressource directement de Github: Comment annuler (presque) n'importe quoi avec Git
jasonleonhard
Facile à comprendre et simple à lire: git-scm.com/book/en/v2/Git-Basics-Undoing-Things
MyTitle

Réponses:

1620
  • Cela mettra en scène tous les fichiers que vous pourriez avoir mis en scène avec git add:

    git reset
    
  • Cela annulera toutes les modifications locales non validées (doit être exécutée à la racine du référentiel):

    git checkout .
    

    Vous pouvez également annuler les modifications non validées uniquement dans un fichier ou un répertoire particulier:

    git checkout [some_dir|file.txt]
    

    Encore une autre façon d'annuler toutes les modifications non validées (plus longues à taper, mais fonctionne à partir de n'importe quel sous-répertoire):

    git reset --hard HEAD
    
  • Cela supprimera tous les fichiers locaux non suivis, donc seuls les fichiers suivis par git restent:

    git clean -fdx
    

    AVERTISSEMENT: -x supprimera également tous les fichiers ignorés, y compris ceux spécifiés par .gitignore! Vous pouvez utiliser -npour l'aperçu des fichiers à supprimer.


Pour résumer: l'exécution des commandes ci-dessous est fondamentalement équivalente à Fresh git clonedepuis la source d'origine (mais elle ne télécharge rien de nouveau, elle est donc beaucoup plus rapide):

git reset
git checkout .
git clean -fdx

Une utilisation typique pour cela serait dans les scripts de construction, lorsque vous devez vous assurer que votre arborescence est absolument propre - n'a pas de modifications ou de fichiers d'objets créés localement ou de créer des artefacts, et vous voulez le faire fonctionner très rapidement et ne pas cloner tout le référentiel à chaque fois.

mvp
la source
@turibe c'est vrai. J'ai dû démarrer mon projet plusieurs fois car il supprimait toutes les dépendances téléchargées et mon dossier .idea. Besoin d'une meilleure solution.
EresDev
2
@EresDev, vous n'avez pas à exécuter git clean, il annulera les modifications non validées mais conservera tous les fichiers non suivis ou ajoutés. Mais, cela peut affecter le résultat de la construction car certains fichiers non suivis peuvent interférer. Par exemple, si votre répertoire .idea était corrompu?
mvp
git resetme dit que j'ai des changements à sauvegarder
Daniel Springer
1
courir git clean -fdxsupprimé mon node_moduleset .env, super
fires3as0n
1
@ fires3as0n À quoi d'autre vous attendiez-vous? Cela devait arriver. Il y a aussi un avertissement dans la réponse.
Rishav
148

Si vous souhaitez " annuler " toutes les modifications non validées, exécutez simplement:

git stash
git stash drop

Si vous avez des fichiers non suivis (vérifiez en exécutant git status), ceux-ci peuvent être supprimés en exécutant:

git clean -fdx

git stashcrée une nouvelle cachette qui deviendra cachée @ {0} . Si vous souhaitez d'abord vérifier, vous pouvez exécuter git stash listpour voir une liste de vos réserves. Cela ressemblera à quelque chose comme:

stash@{0}: WIP on rails-4: 66c8407 remove forem residuals
stash@{1}: WIP on master: 2b8f269 Map qualifications
stash@{2}: WIP on master: 27a7e54 Use non-dynamic finders
stash@{3}: WIP on blogit: c9bd270 some changes

Chaque stash est nommé d'après le message de validation précédent.

Abram
la source
2
Une bonne solution en effet mais vous devez mettre en place des changements en utilisant git add .avant git stashcar cela me montrait des changements non engagés même aprèsgit stash
EresDev
22

il y a aussi git stash - qui "cache" vos modifications locales et peut être réappliqué ultérieurement ou supprimé s'il n'est plus nécessaire

plus d' informations sur le stockage

keshav
la source
12

J'utilise l'arborescence source .... Vous pouvez annuler toutes les modifications non validées en 2 étapes simples:

1) suffit de réinitialiser l'état du fichier de l'espace de travail

entrez la description de l'image ici 2) sélectionnez tous les fichiers non mis en scène (commande + a), faites un clic droit et sélectionnez supprimer

entrez la description de l'image ici

C'est aussi simple que ça: D

user1872384
la source
Si vous réinitialisez, puis changez de branche et rebasez sur la branche réinitialisée, cela nuira. La réinitialisation est utile, mais ne doit pas être utilisée pour supprimer les modifications non validées. Dans le cas de la suppression de modifications non validées, il suffit de cacher et de supprimer la réserve.
Dinu Nicolae
11

Ce que je fais c'est

git add . (adding everything)
git stash 
git stash drop

Bon mot: git add . && git stash && git stash drop

Ralph
la source
c'est le meilleur
Madrugada
7

Pour ceux qui sont arrivés ici en cherchant s'ils pouvaient annuler git clean -f -d, par lequel un fichier créé dans eclipse été supprimé,

Vous pouvez faire la même chose depuis l'interface utilisateur en utilisant "restaurer à partir de l'historique local" pour ref: Restaurer à partir de l'historique local

Abdul Rahman K
la source
3
Je n'ai pas rejeté le vote, mais votre réponse est loin d'être claire quant à votre intention; il serait utile que vous reformuliez la première phrase de la réponse.
Mark Schultheiss
5

États passant d'un engagement à un nouvel engagement

0. last commit,i.e. HEAD commit
1. Working tree changes, file/directory deletion,adding,modification.
2. The changes are staged in index
3. Staged changes are committed

Action pour la transition de l'État

0->1: manual file/directory operation
1->2: git add .
2->3: git commit -m "xxx"

Vérifier diff

0->1: git diff
0->2: git diff --cached
0->1, and 0->2: git diff HEAD
last last commit->last commit: git diff HEAD^ HEAD

Revenir au dernier commit

2->1: git reset
1->0: git checkout .     #only for tracked files/directories(actions include modifying/deleting tracked files/directories)
1->0: git clean -fdx     #only for untracked files/directories(action includes adding new files/directories)
2->1, and 1->0: git reset --hard HEAD

Équivalent de git clone, sans re-télécharger quoi que ce soit

git reset && git checkout . && git clean -fdx
Zii
la source
Je ne vois pas en quoi cela se rapporte à la question posée. Ce n'est qu'une série de recettes étranges, sans aucune substance réelle.
mvp