Question Comment puis-je rétablir tous les changements locaux dans le projet géré par Git à l'état précédent?


J'ai un projet dans lequel j'ai couru git init. Après plusieurs commits, j'ai fait git status ce 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 d'origine. Est-ce que cette commande le fera pour moi?

git reset --hard HEAD

1544
2017-07-18 07:52


origine


Réponses:


Si vous souhaitez annuler les modifications apportées à votre copie de travail, procédez comme suit:

git checkout .

Si vous souhaitez annuler les modifications apportées à l'index (c'est-à-dire que vous avez ajouté), procédez comme suit. Attention, cela réinitialisera tous vos commits non maitrisés au master!:

git reset

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

git revert <commit 1> <commit 2>

Si vous souhaitez supprimer les fichiers non suivis (par exemple, les nouveaux fichiers, les 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

2808
2017-07-18 07:57



Remarque: Vous pouvez également exécuter

git clean -fd

comme

git reset --hard

volonté ne pas supprime les fichiers non suivis, où git-clean supprimera tous les fichiers du répertoire racine suivi qui ne sont pas sous git tracking. AVERTISSEMENT - SOYEZ PRUDENT AVEC CECI! Il est utile d'exécuter d'abord un essai à sec avec git-clean, pour voir ce qu'il va supprimer.

Ceci est également particulièrement utile lorsque vous obtenez le message d'erreur

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

Ce qui peut arriver lorsque vous faites plusieurs choses, l'une étant 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 il l'a d'abord placé dans le contrôle source. .

Dans cette situation, effectuer une analyse à sec vous aidera également à afficher une liste de fichiers qui seront écrasés.


334
2017-07-20 05:37



Si vous voulez annuler toutes les modifications ET être à jour avec le maître distant actuel (par exemple vous trouvez que le maître HEAD a avancé car vous l'avez dérivé et que votre poussée est 'rejetée') 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.

58
2018-04-22 20:48



Regardez dans git-reflog. Il énumérera tous les états qu'il se souvient (la valeur par défaut est 30 jours), et vous pouvez simplement vérifier 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 b c d e; 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

47
2017-07-19 12:16



Re-cloner

GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
  •  Supprime les validations locales non-push
  •  Rétablit les modifications apportées aux fichiers suivis
  •  Restaure les fichiers suivis que vous avez supprimés
  •  Supprime les fichiers / répertoires répertoriés dans .gitignore (comme les fichiers de construction)
  •  Supprime les fichiers / répertoires qui ne sont pas suivis et pas dans .gitignore
  •  Vous n'oublierez pas cette approche
  •  Déchets de bande passante

Voici d'autres commandes que j'oublie tous les jours.

Nettoyer et réinitialiser

git clean -f -d -x
git reset --hard
  •  Ne supprime PAS les validations locales non-push
  •  Rétablit les modifications apportées aux fichiers suivis
  •  Restaure les fichiers suivis que vous avez supprimés
  •  Supprime les fichiers / répertoires répertoriés dans .gitignore (comme les fichiers de construction)
  •  Supprime les fichiers / répertoires qui ne sont pas suivis et pas dans .gitignore

Nettoyer

git clean -f -d -x
  •  Ne supprime PAS les validations locales non-push
  •  Ne pas annuler les modifications que vous avez apportées aux fichiers suivis
  •  Ne restaure pas les fichiers suivis que vous avez supprimés
  •  Supprime les fichiers / répertoires répertoriés dans .gitignore (comme les fichiers de construction)
  •  Supprime les fichiers / répertoires qui ne sont pas suivis et pas dans .gitignore

Réinitialiser

git reset --hard
  •  Ne supprime PAS les validations locales non-push
  •  Rétablit les modifications apportées aux fichiers suivis
  •  Restaure les fichiers suivis que vous avez supprimés
  •  Supprime les fichiers / répertoires répertoriés dans .gitignore (comme les fichiers de construction)
  •  Ne supprime PAS les fichiers / répertoires qui ne sont pas suivis et pas dans .gitignore

Remarques

Test case pour confirmer tout ce qui précède (utiliser bash ou sh):

mkdir project
cd project
git init
echo '*.built' > .gitignore
echo 'CODE' > a.sourceCode
mkdir b
echo 'CODE' > b/b.sourceCode
cp -r b c
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 en arrière aux commits précédents (peut nécessiter d'exécuter les commandes ci-dessus en premier)
  • git stash pareil que git reset ci-dessus, mais vous pouvez l'annuler

40
2018-03-20 12:37



DANGER AVANT: (lire les commentaires s'il vous plaît.Exécuter la commande proposée dans ma réponse pourrait supprimer plus que vous voulez)

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

git clean -f -d

34
2017-09-11 07:10



Après avoir lu un tas de réponses et les avoir essayées, j'ai trouvé différents cas de bords 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 copie de travail.


34
2018-06-04 07:25



dites simplement

git stash

il supprimera toutes vos chages locales. et vous pouvez également utiliser plus tard en disant

git stash apply 

29
2018-04-24 12:18



J'ai rencontré un problème similaire. La solution est d'utiliser git log pour rechercher quelle version de la validation locale est différente de la télécommande. (Par exemple, la version est 3c74a11530697214cbcc4b7b98bf7a65952a34ec).

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


26
2017-08-28 07:34