Comment puis-je annuler tous les changements locaux du projet géré Git à l’état précédent?

J’ai un projet dans lequel j’ai lancé git init . Après plusieurs commits, j’ai obtenu le git status qui m’a dit que tout était à jour et qu’il n’y avait pas de changements locaux.

Puis j’ai fait plusieurs changements consécutifs et j’ai réalisé que je voulais tout jeter et revenir à mon état initial. Est-ce que cette commande le fera pour moi?

 git reset --hard HEAD 

Si vous souhaitez rétablir les modifications apscopes à votre copie de travail, procédez comme suit:

 git checkout . 

Si vous souhaitez rétablir les modifications apscopes à l’index (c’est-à-dire que vous avez ajouté), procédez comme suit. Attention, cela réinitialisera tous vos commits non compressés à maîsortingser! :

 git reset 

Si vous souhaitez annuler une modification que vous avez validée, procédez comme suit:

 git revert   

Si vous souhaitez supprimer les fichiers non suivis (par exemple, nouveaux fichiers, fichiers générés):

 git clean -f 

Ou des répertoires non suivis (par exemple, des répertoires nouveaux ou générés automatiquement):

 git clean -fd 

Note: Vous pouvez aussi vouloir courir

 git clean -fd 

comme

 git reset --hard 

ne supprimera pas les fichiers non suivis, où git-clean supprimera tous les fichiers du répertoire racine suivi qui ne sont pas sous suivi git. ATTENTION – ATTENTION AVEC CE! Il est utile de lancer une parsing sèche avec git-clean pour voir ce qu’il va supprimer.

Ceci est également particulièrement utile lorsque vous recevez le message d’erreur

 ~"performing this command will cause an un-tracked file to be overwritten" 

Ce qui peut se produire lorsque vous effectuez plusieurs opérations, dont la mise à jour d’une copie de travail lorsque vous et votre ami avez tous deux ajouté un nouveau fichier du même nom, mais que vous le supprimez d’abord. .

Dans cette situation, faire une parsing à sec vous aidera également à afficher une liste de fichiers qui seraient écrasés.

Si vous voulez annuler tous les changements ET être à jour avec le maître distant actuel (par exemple, vous constatez que le HEAD principal a avancé depuis que vous l’avez dérivé et que votre push est «rejeté»), vous pouvez utiliser

 git fetch # will fetch the latest changes on the remote git reset --hard origin/master # will set your local branch to match the representation of the remote just pulled down. 

Regardez dans git-reflog. Il listera tous les états dont il se souvient (la valeur par défaut est 30 jours) et vous pouvez simplement extraire celui que vous voulez. Par exemple:

 $ git init > /dev/null $ touch a $ git add . $ git commit -m"Add file a" > /dev/null $ echo 'foo' >> a $ git commit -a -m"Append foo to a" > /dev/null $ for i in bcde; do echo $i >>a; git commit -a -m"Append $i to a" ;done > /dev/null $ git reset --hard HEAD^^ > /dev/null $ cat a foo b c $ git reflog 145c322 HEAD@{0}: HEAD^^: updating HEAD ae7c2b3 HEAD@{1}: commit: Append e to a fdf2c5e HEAD@{2}: commit: Append d to a 145c322 HEAD@{3}: commit: Append c to a 363e22a HEAD@{4}: commit: Append b to a fa26c43 HEAD@{5}: commit: Append foo to a 0a392a5 HEAD@{6}: commit (initial): Add file a $ git reset --hard HEAD@{2} HEAD is now at fdf2c5e Append d to a $ cat a foo b c d 

Re-cloner

 GIT=$(git rev-parse --show-toplevel) cd $GIT/.. rm -rf $GIT git clone ... 
  • Etes Supprime les commits locaux non poussés
  • Erts Annule les modifications apscopes aux fichiers suivis
  • Ores Restaure les fichiers suivis que vous avez supprimés
  • Etes Supprime les fichiers / répertoires listés dans .gitignore (comme les fichiers de construction)
  • Etes Supprime les fichiers / dirs qui ne sont pas suivis et pas dans .gitignore
  • Forget Vous n’oublierez pas cette approche
  • Astes gaspille la bande passante

Voici d’autres commandes que j’oublie quotidiennement.

Nettoyer et réinitialiser

 git clean -f -d -x git reset --hard 
  • Etes Supprime les commits locaux non poussés
  • Erts Annule les modifications apscopes aux fichiers suivis
  • Ores Restaure les fichiers suivis que vous avez supprimés
  • Etes Supprime les fichiers / répertoires listés dans .gitignore (comme les fichiers de construction)
  • Etes Supprime les fichiers / dirs qui ne sont pas suivis et pas dans .gitignore

Nettoyer

 git clean -f -d -x 
  • Etes Supprime les commits locaux non poussés
  • Erts Annule les modifications apscopes aux fichiers suivis
  • Ores Restaure les fichiers suivis que vous avez supprimés
  • Etes Supprime les fichiers / répertoires listés dans .gitignore (comme les fichiers de construction)
  • Etes Supprime les fichiers / dirs qui ne sont pas suivis et pas dans .gitignore

Réinitialiser

 git reset --hard 
  • Etes Supprime les commits locaux non poussés
  • Erts Annule les modifications apscopes aux fichiers suivis
  • Ores Restaure les fichiers suivis que vous avez supprimés
  • Etes Supprime les fichiers / répertoires listés dans .gitignore (comme les fichiers de construction)
  • Etes Supprime les fichiers / dirs qui ne sont pas suivis et pas dans .gitignore

Remarques

Cas de test pour confirmer tout ce qui précède (utilisez bash ou sh):

 mkdir project cd project git init echo '*.built' > .gitignore echo 'CODE' > a.sourceCode mkdir b echo 'CODE' > b/b.sourceCode cp -rbc git add . git commit -m 'Initial checkin' echo 'NEW FEATURE' >> a.sourceCode cp a.sourceCode a.built rm -rf c echo 'CODE' > 'd.sourceCode' 

Voir également

  • git revert à faire de nouveaux commits qui annulent les commits antérieurs
  • git checkout pour revenir dans le temps aux commits antérieurs (il peut être nécessaire d’exécuter les commandes ci-dessus en premier)
  • git stash même que git reset ci-dessus, mais vous pouvez le défaire

DANGER AHEAD: (veuillez lire les commentaires. L’exécution de la commande proposée dans ma réponse pourrait supprimer plus que vous ne le souhaitez)

supprimer complètement tous les fichiers, y compris les répertoires que je devais exécuter

 git clean -f -d 

Après avoir lu un tas de réponses et les avoir essayées, j’ai trouvé différents cas extrêmes qui signifient parfois qu’ils ne nettoient pas complètement la copie de travail.

Voici mon script bash actuel pour le faire, qui fonctionne tout le temps.

 #!/bin/sh git reset --hard git clean -f -d git checkout -- HEAD 

Exécuter à partir du répertoire racine de la copie de travail.

dis simplement

 git stash 

cela supprimera toutes vos tâches locales. et vous pouvez également utiliser plus tard en disant

 git stash apply 

J’ai rencontré un problème similaire. La solution consiste à utiliser git log pour rechercher quelle version du commit local est différente de la télécommande. (Par exemple, la version est 3c74a11530697214cbcc4b7b98bf7a65952a34ec ).

Ensuite, utilisez git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec pour git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec le changement.

Vous ne voudrez pas nécessairement / ne pas avoir besoin de ranger votre travail / fichiers dans votre répertoire de travail, mais simplement de vous en débarrasser complètement. La commande git clean fera pour vous.

Certains cas d’utilisation courants pour ce faire seraient de supprimer les erreurs générées par les fusions ou les outils externes ou de supprimer d’autres fichiers afin de pouvoir exécuter une version propre.

Gardez à l’esprit que vous souhaiterez être très prudent avec cette commande, car elle est conçue pour supprimer les fichiers de votre répertoire de travail local qui ne sont PAS SUIVIS. Si vous changez soudainement d’avis après avoir exécuté cette commande, vous ne pourrez plus voir le contenu des fichiers supprimés. Une alternative plus sûre consiste à exécuter

git stash --all

qui enlèvera tout, mais gardera tout dans une réserve. Cette réserve peut ensuite être utilisée.

Cependant, si vous voulez vraiment supprimer tous les fichiers et nettoyer votre répertoire de travail, vous devez exécuter

git clean -f -d

Cela supprimera tous les fichiers et tous les sous-répertoires qui ne contiennent aucun élément suite à la commande. Une chose intelligente à faire avant d’exécuter la commande git clean -f -d est d’exécuter

 git clean -f -d -n 

qui vous montrera un aperçu de ce qui sera supprimé après l’exécution de git clean -f -d

Donc, voici un résumé de vos options du plus agressif au moins agressif


Option 1 : Supprimer tous les fichiers localement (le plus agressif)

 git clean -f -d 

Option 2 : prévisualiser l’impact ci-dessus (aperçu le plus agressif)

 git clean -f -d -n 

Option 3 : Stash tous les fichiers (les moins agressifs)

 `git stash --all` 

J’ai cherché un problème similaire,

Voulu jeter des engagements locaux:

  1. cloné le repository (clone git)
  2. commuté dans la twig dev (git checkout dev)
  3. fait peu de commits (git commit -m “commit 1”)
  4. mais a décidé de jeter ces engagements locaux pour revenir à distance (origine / dev)

Ainsi que ci-dessous:

 git reset --hard origin/dev 

Vérifier:

 git status On branch dev Your branch is up-to-date with 'origin/dev'. nothing to commit, working tree clean 

maintenant les commits locaux sont perdus, reviennent à l’état initial cloné, point 1 ci-dessus.

Essayez ceci pour annuler tous les changements non validés dans la twig locale

 $ git reset --hard HEAD 

Mais si vous voyez une erreur comme celle-ci:

 fatal: Unable to create '/directory/for/your/project/.git/index.lock': File exists. 

Vous pouvez naviguer dans le dossier ‘.git’ puis supprimer le fichier index.lock:

 $ cd /directory/for/your/project/.git/ $ rm index.lock 

Enfin, relancez la commande:

 $ git reset --hard HEAD