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
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
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.
_GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
_
.gitignore
_ (comme les fichiers de construction).gitignore
_Voici d'autres commandes que j'oublie quotidiennement.
_git clean --force -d -x
git reset --hard
_
.gitignore
_ (comme les fichiers de construction).gitignore
__git clean --force -d -x
_
.gitignore
_ (comme les fichiers de construction).gitignore
__git reset --hard
_
.gitignore
_ (comme les fichiers de construction).gitignore
_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érieursgit 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'annulerSi 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.
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
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.
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
dis simplement
git stash
il va supprimer tous vos chages 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 commande distante. (Par exemple, la version est 3c74a11530697214cbcc4b7b98bf7a65952a34ec
).
Ensuite, utilisez git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ec
pour annuler la modification.
J'ai cherché un problème similaire,
Voulait jeter les commits locaux:
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.
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
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`