2046 votes

Comment puis-je annuler toutes les modifications locales dans un GIT projet géré par l'état précédent?

C'est probablement la plus simple question de newbie.

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

Ensuite, j'ai effectué plusieurs changements consécutifs et réalisé que je voulais à tout jeter et de revenir à mon état d'origine. Sera cette commande le faire pour moi?

git reset --hard HEAD

3621voto

1800 INFORMATION Points 55907

Si vous souhaitez annuler les modifications apportées à votre copie de travail, faites ceci:

git checkout .

Si vous souhaitez annuler les modifications apportées à l'index (c'est à dire, que vous avez ajouté), faites ceci:

git reset

Si vous souhaitez revenir à un changement que vous avez commis, faites ceci:

git revert ...

415voto

Antony Stubbs Points 4236

Remarque: Vous pouvez également exécuter

git clean -f 

comme

git reset --hard

va pas retirer sans traces de fichiers, où que git-clean supprimer tous les fichiers de la zone racine du répertoire qui ne sont pas sous git de suivi. AVERTISSEMENT - ÊTRE PRUDENT AVEC CE! Il est utile pour exécuter un dry-run avec git-propre d'abord, pour voir ce qu'il va le supprimer.

C'est 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 se produire lorsque vous effectuez plusieurs choses, l'une en cours de mise à jour d'une copie de travail lorsque vous et votre ami avez à la fois ajouté un nouveau fichier du même nom, mais il s'est engagé dans le contrôle de source première, et vous n'avez pas de soins sur la suppression de votre sans traces de copie.

Dans cette situation, faire une marche à sec permettra également de vous montrer une liste des fichiers qui seraient remplacées.

50voto

William Pursell Points 56211

Regardez dans le dépôt git-reflog. C'est la liste de tous les états, il se souvient (la valeur par défaut est de 30 jours), et vous pouvez simplement checkout 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

40voto

Scott Davey Points 71

Après la lecture d'un tas de réponses et de les essayer, j'ai trouvé divers cas limites qui signifie parfois, ils ne sont pas entièrement nettoyer la copie de travail.

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

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

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

36voto

Tobias Gassmann Points 308

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

pour supprimer complètement tous les fichiers, y compris les répertoires, j'ai dû courir

git clean -f -d

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X