web-dev-qa-db-fra.com

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

J'ai un projet dans lequel j'ai exécuté git init. Après plusieurs commits, j’ai fait git status, qui m’a dit que tout était à jour et qu’il n’y avait pas de changement local.

Ensuite, j'ai fait plusieurs changements consécutifs et réalisé que je voulais tout jeter et retrouver mon état d'origine. Est-ce que cette commande le fera pour moi?

git reset --hard HEAD
1780

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ées), procédez comme suit. Attention, cela réinitialisera tous vos commits non compressés sur 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, 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
3172
1800 INFORMATION

Remarque: vous pouvez également vouloir exécuter

git clean -fd

comme

git reset --hard

will not supprimera les fichiers non suivis, alors qu'en tant que git-clean supprimera tous les fichiers du répertoire racine suivi qui ne sont pas sous git tracking. AVERTISSEMENT - SOYEZ PRUDENT AVEC CELA! Il est utile d’exécuter d’abord une analyse à sec avec git-clean pour voir ce qu’elle 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"

Cela peut se produire lorsque vous effectuez plusieurs opérations, par exemple la mise à jour d'une copie de travail lorsque vous et votre ami avez tous deux ajouté un nouveau fichier portant le même nom, mais il l'a d'abord enregistré dans le contrôle de source et vous ne vous souciez pas de supprimer votre copie non suivie. .

Dans cette situation, une analyse à blanc vous aidera également à afficher une liste des fichiers qui seraient écrasés.

371
Antony Stubbs

Re-cloner

_GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
_
  • Supprime les commits locaux non poussés
  • ✅ Annule les modifications apportées aux fichiers suivis
  • Restaure les fichiers suivis que vous avez supprimés
  • Supprime les fichiers/répertoires listé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
  • ???? Gaspille la bande passante

Voici d'autres commandes que j'oublie quotidiennement.

Nettoyer et réinitialiser

_git clean --force -d -x
git reset --hard
_
  • Supprime les commits locaux non poussés
  • ✅ Annule les modifications apportées aux fichiers suivis
  • Restaure les fichiers suivis que vous avez supprimés
  • Supprime les fichiers/répertoires listé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 --force -d -x
_
  • Supprime les commits locaux non poussés
  • ❌ Annule les modifications apportées aux fichiers suivis
  • Restaure les fichiers suivis que vous avez supprimés
  • Supprime les fichiers/répertoires listé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
_
  • Supprime les commits locaux non poussés
  • ✅ Annule les modifications apportées aux fichiers suivis
  • Restaure les fichiers suivis que vous avez supprimés
  • Supprime les fichiers/répertoires listés dans _.gitignore_ (comme les fichiers de construction)
  • Supprime les fichiers/répertoires 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 -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 aussi

  • git revert pour faire de nouveaux commits qui annulent des commits antérieurs
  • git checkout pour revenir en arrière des validations précédentes (il peut être nécessaire d'exécuter les commandes précédentes)
  • git stash identique à _git reset_ ci-dessus, mais vous pouvez l'annuler
107
William Entriken

Si vous souhaitez annuler toutes les modifications ET être à jour avec le maître distant actuel (par exemple, vous constatez que le maître HEAD a progressé depuis sa ramification et que votre Push est en train d'être "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.
74
Michael Durrant

Regardez dans Git-Reflog. Il listera tous les états dont il se souvient (30 jours par défaut), 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 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
48
William Pursell

Après avoir lu une série de réponses et les avoir essayées, j'ai trouvé divers cas Edge qui signifient que parfois, 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.

34
Scott Davey

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)

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

git clean -f -d
34
Tobias Gassmann

dis simplement

git stash

il va supprimer tous vos chages locales. et vous pouvez également utiliser plus tard en disant

git stash apply 
32
piyushmandovra

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 commande distante. (Par exemple, la version est 3c74a11530697214cbcc4b7b98bf7a65952a34ec).

Ensuite, utilisez git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec pour annuler la modification.

26
Patrick

J'ai cherché un problème similaire,

Voulait jeter les commits locaux:

  1. cloné le référentiel (git clone)
  2. commuté sur la branche dev (git checkout dev)
  3. fait quelques commits (git commit -m "commit 1")
  4. mais a décidé de jeter ces locaux s'engage à retourner à distance (Origin/dev)

Ainsi fait le 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, de nouveau à l'état cloné initial, point 1 ci-dessus.

12
Manohar Reddy Poreddy

Essayez ceci pour annuler toutes les modifications non validées dans la branche 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
6
Janderson Silva

Vous ne voudrez peut-être pas/ne voudrez pas nécessairement stocker votre travail/vos fichiers dans votre répertoire de travail, mais simplement vous en débarrasser complètement. La commande git clean le fera pour vous.

Voici quelques cas d'utilisation courants: remove cruft qui a été généré par des fusions ou des outils externes, ou bien supprimez d'autres fichiers pour pouvoir exécuter une nouvelle génération.

Gardez à l'esprit que vous voudrez ê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 d'avis soudainement après avoir exécuté cette commande, il est impossible de revenir en arrière pour voir le contenu des fichiers supprimés. Une alternative plus sûre consiste à exécuter

git stash --all

qui enlèvera tout mais sauvera tout dans une cachette. Cette cachette peut ensuite être utilisée plus tard.

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 ne contenant aucun élément à la suite de la commande. Une bonne chose à 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

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


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

git clean -f -d

Option 2: Aperçu de l'impact ci-dessus (Aperçu le plus agressif)

git clean -f -d -n

Option: Cachez tous les fichiers (le moins agressif)

`git stash --all` 
6
joey