Question Diverses façons d'éliminer les changements locaux de Git


J'ai juste cloné un dépôt git et vérifié une branche. J'ai travaillé dessus, puis j'ai décidé de supprimer tous mes changements locaux, car je voulais la copie originale.

En bref, j'ai dû faire les deux commandes suivantes pour supprimer mes modifications locales

git checkout .

git clean -f

Ma question est,

(1) Est-ce l'approche correcte pour se débarrasser des changements locaux, ou alors s'il vous plaît laissez-moi savoir la bonne approche.

(2) quand utilisons-nous git reset --hard comme je suis capable de réinitialiser même sans cette commande

Merci

* Solution: Édition majeure (s): 03/26: *  Remplacement de nombreux termes vagues par une terminologie spécifique à git  [suivi / non suivi / mis en scène / non mis en scène]

Il ne peut y avoir que trois catégories de fichiers lorsque nous effectuons des modifications locales:

Tapez 1. Fichiers suivis par étapes

Type 2. Fichiers suivis non mis à jour

Tapez 3. Fichiers UnTracked non enregistrés a.k.a Fichiers UnTracked

  • Staged - Ceux qui sont déplacés vers la zone de transit / Ajouté à l'index
  • Suivi - fichiers modifiés
  • UnTracked - nouveaux fichiers. Toujours pas en état. Si mis en scène, cela signifie qu'ils sont suivis.

Qu'est-ce que chaque commande fait:

  1. git checkout . - Supprime UNIQUEMENT les fichiers suivis non stockés [Type 2]

  2. git clean -f - Supprime UNIQUEMENT les fichiers UnStack non stockés [Type 3]

  3. git reset --hard - Supprime SEULEMENT les fichiers suivis par étapes et non-stocke [Type 1, Type 2]

  4. git stash -u - Supprime toutes les modifications [Type 1, Type 2, Type 3]

Conclusion:

Il est clair que nous pouvons utiliser soit

(1) combination of `git clean -f` and `git reset --hard` 

OU

(2) `git stash -u`

pour atteindre le résultat souhaité.

Note: Stashing, comme le mot signifie «Stocker (quelque chose) en toute sécurité et secrètement dans un endroit spécifié. Cela peut toujours être récupéré en utilisant git stash pop. Donc, choisir entre les deux options ci-dessus est l'appel du développeur.

Merci Christoph et Frederik Schøning.

Edit: 03/27

Je pensais que ça valait la peine de mettre le 'il faut se méfier' Note à git clean -f

git clean -f

il n'y a pas de retour en arrière. Utilisation -n ou --dry-run pour prévisualiser les dégâts que vous ferez.

Si vous souhaitez également supprimer des répertoires, exécutez git clean -f -d

Si vous voulez simplement supprimer les fichiers ignorés, exécutez git clean -f -X

Si vous souhaitez supprimer les fichiers ignorés et non ignorés, exécutez git clean -f -x

référence: plus sur git clean : Comment supprimer les fichiers locaux (non-compressés) de l'arbre de travail Git actuel?

Edit: 20/05/15

Rejeter tous les commits locaux sur cette branche [Suppression des validations locales]

Pour supprimer toutes les validations locales sur cette branche, pour rendre la branche locale identique à "l'amont" de cette branche, il suffit de courir git reset --hard @{u}

Référence: http://sethrobertson.github.io/GitFixUm/fixup.html

ou faire git reset --hard origin/master [si la succursale locale est master]

Note: 06/12/2015 C'est ne pas un doublon de l'autre question SO marquée comme doublon. Cette question explique comment supprimer les modifications locales du GIT [supprimer un fichier ajouté, supprimer les modifications ajoutées au fichier existant, etc. et les différentes approches; Où dans l'autre thread SO seulement adresse comment supprimer la validation locale. Si vous avez ajouté un fichier et que vous voulez le supprimer seul, l'autre thread SO n'en parle pas. Donc ce n'est pas un doublon de l'autre]

Edit: 23/06/15

Comment annuler un commit déjà envoyé dans un dépôt distant?

$ git revert ab12cd15

Edit: 09/01/2015

Supprimer un commit précédent de la branche locale et de la branche distante

Cas: Vous venez de valider un changement dans votre branche locale et vous êtes immédiatement redirigé vers la branche distante, Soudain réalisé, Oh non! Je n'ai pas besoin de ce changement. Maintenant faire quoi?

git reset --hard HEAD~1     [pour supprimer ce commit de la branche locale]

git push origin HEAD --force [les deux commandes doivent être exécutées. Pour la suppression de la branche distante

Quelle est la branche? C'est la branche actuellement vérifiée.

Modifier 09/08/2015 - Supprimer git local fusionner:

Je suis sur master branche et fusionné master branche avec une nouvelle branche de travail phase2

$ git status
# On branch master

$ git merge phase2

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 8 commits.

Q: Comment se débarrasser de cette fusion? A essayé git reset --hard   et git clean -d -f Les deux ne fonctionnaient pas.

La seule chose qui travaillé sont l'un des suivants:

$ git reset --hard origin/master

ou

$ git reset --hard HEAD~8

ou

$ git reset --hard 9a88396f51e2a068bb7  [sha commit code - c'est celui qui était présent avant que tous vos commits de fusion se produisent]


568
2018-03-24 20:54


origine


Réponses:


Tout dépend exactement de ce que vous essayez de défaire / inverser. Commencez par lire le message dans le lien de Ube. Mais pour tenter une réponse:

Réinitialisation matérielle

git reset --hard [HEAD]

Supprimez complètement toutes les modifications par étapes et non mises à jour des fichiers suivis.

Je me retrouve souvent en train de réinitialiser dur, quand je suis comme "défait tout comme si j'avais fait un re-clone complet de la télécommande". Dans votre cas, où vous voulez juste votre repo vierge, cela fonctionnerait.

Nettoyer

git clean [-f]

Supprimer les fichiers qui ne sont pas suivis.

Pour supprimer les fichiers temporaires, mais conserver les modifications par étapes et non mises en place dans les fichiers déjà suivis. La plupart du temps, je finirais probablement par faire une règle d'ignorer au lieu de nettoyer plusieurs fois - par exemple. pour les dossiers bin / obj dans un projet C #, que vous voudriez généralement exclure de votre repo pour économiser de l'espace, ou quelque chose comme ça.

L'option -f (force) supprimera également les fichiers qui ne sont pas suivis et sont également ignorés par git mais ignore-rule. Dans le cas ci-dessus, avec une règle ignorer pour ne jamais suivre les dossiers bin / obj, même si ces dossiers sont ignorés par git, l'utilisation de l'option force les supprimera de votre système de fichiers. J'ai sporadiquement vu une utilisation pour cela, par ex. lors du déploiement de scripts, et vous voulez nettoyer votre code avant de le déployer, de le compresser ou quoi que ce soit.

Git clean ne touchera pas les fichiers, qui sont déjà suivis.

Commander "dot"

git checkout .

En fait, je n'avais jamais vu cette notation avant de lire votre message. J'ai du mal à trouver de la documentation pour cela (peut-être que quelqu'un peut vous aider), mais en jouant un peu, on dirait que ça veut dire:

"annuler tous les changements dans mon arbre de travail".

C'est à dire. annuler les modifications non enregistrées dans les fichiers suivis. Apparemment, il ne touche pas aux changements mis en scène et laisse seuls les fichiers non traités.

Cacher

Certaines réponses mentionnent le stockage. Comme l'indique le libellé, vous utiliseriez probablement le cache lorsque vous êtes au milieu de quelque chose (pas prêt pour un commit), et vous devez temporairement changer de branche ou travailler d'une façon ou d'une autre sur votre code, pour retourner à votre "désordre" bureau". Je ne vois pas cela s'applique à votre question, mais c'est certainement utile.

Pour résumer

Généralement, si vous êtes convaincu que vous vous êtes engagé et peut-être poussé à des changements importants à distance, si vous jouez juste autour de vous, utilisez git reset --hard HEAD suivi par git clean -f va définitivement nettoyer votre code à l'état, il serait, si elle venait d'être cloné et vérifié à partir d'une succursale. Il est vraiment important de souligner que la réinitialisation supprimera également les changements par étapes, mais non validés. Il va effacer tout ce qui n'a pas été commis (sauf les fichiers non suivis, dans ce cas, utilisez nettoyer).

Toutes les autres commandes sont là pour faciliter des scénarios plus complexes, où une granularité de "défaire des trucs" est nécessaire :)

Je pense que votre question # 1 est couverte, mais enfin, pour conclure sur # 2: la raison pour laquelle vous n'avez jamais trouvé le besoin d'utiliser git reset --hard était que vous n'aviez jamais rien mis en scène. Aviez-vous mis en scène un changement, ni git checkout . ni git clean -f aurait renversé cela.

J'espère que ça couvre.


469
2018-03-24 21:57



Comme pour tout ce qui est en git, il y a plusieurs façons de le faire. Les deux commandes que vous avez utilisées sont une façon de le faire. Une autre chose que vous auriez pu faire est de simplement les cacher avec git stash -u. le -u s'assure que les fichiers nouvellement ajoutés (non suivis) sont également inclus.

La chose pratique à propos de git stash -u est-ce

  1. c'est probablement la commande la plus simple (seulement?) pour accomplir votre objectif
  2. si vous changez d'avis après, vous obtenez tout votre travail de retour avec git stash pop (C'est comme supprimer un email dans gmail où vous pouvez annuler si vous changez d'avis par la suite)

À partir de votre autre question git reset --hard ne supprimera pas les fichiers non suivis de sorte que vous auriez toujours besoin de la git clean -f. Mais un git stash -u pourrait être le plus pratique.


20
2018-03-24 21:10



Raison pour ajouter une réponse en ce moment: 

Jusqu'à présent, j'ajoutais la conclusion et les «réponses» à ma question initiale elle-même, ce qui rendait la question très longue, d'où le passage à une réponse séparée.

J'ai également ajouté plus commandes git fréquemment utilisées ça m'aide sur git, pour aider quelqu'un d'autre aussi.

Premier étape avant de faire des commits est de configurer votre nom d'utilisateur et email qui apparaît avec votre commit.

#Définit le nom que vous souhaitez associer à vos transactions de validation

$ git config --global user.name "[name]"

#Définit l'e-mail que vous souhaitez associer à vos transactions de validation

$ git config --global user.email "[email address]"

#Liste la configuration globale

$ git config --list

#check status

git status

# Liste toutes les branches locales et distantes

git branch -a

#créez une nouvelle branche locale et commencez à travailler sur cette branche

git checkout -b "branchname" 

ou, cela peut être fait en deux étapes

créer une branche: git branch branchname travailler sur cette branche: git checkout branchname

#commit changements locaux [processus en deux étapes: - Ajouter le fichier à l'index, ce qui signifie ajouter à la zone de transit. Puis validez les fichiers qui sont présents dans cette zone de transfert]

git add <path to file>

git commit -m "commit message"

#checkout une autre succursale locale

git checkout "local branch name"

#remove tous les changements dans la branche locale [Supposons que vous ayez apporté des modifications à la branche locale, par exemple en ajoutant un nouveau fichier ou en modifiant un fichier existant, ou en faisant un commit local, mais vous n'en avez plus besoin] git clean -d -fet git reset --hard  [Nettoyer toutes les modifications locales apportées à la branche locale, sauf si la validation locale]

git stash -u  supprime également tous les changements

Remarque: Il est clair que nous pouvons utiliser soit (1) combinaison de git clean –d –fet git reset --hard  OU (2) git stash -u pour atteindre le résultat souhaité.

Note 1: Stashing, comme le mot signifie «Stocker (quelque chose) en toute sécurité et secrètement dans un endroit spécifié. Cela peut toujours être récupéré en utilisant git stash pop. Donc, choisir entre les deux options ci-dessus est l'appel du développeur.

Note 2: git reset --hard va supprimer les modifications du répertoire de travail. Veillez à stocker les modifications locales que vous souhaitez conserver avant d'exécuter cette commande.

# Passer à la branche principale et assurez-vous que vous êtes à jour.

git checkout master

git fetch    [cela peut être nécessaire (selon votre config git) pour recevoir des mises à jour sur l'origine / master]

git pull

# Fusionne la branche d'entité dans la branche principale.

git merge feature_branch

# Réinitialise la branche principale à l'état d'origine.

git reset origin/master

#Accidentellement supprimé un fichier de local, comment le récupérer? Fait une git status pour obtenir le chemin complet de la ressource supprimée

git checkout branchname <file path name>

c'est tout!

#Merge master branche avec une autre branche

git checkout master
git merge someotherbranchname

#rename branche locale

git branch -m old-branch-name new-branch-name

#delete branche locale 

git branch -D branch-name

#delete branche distante 

git push origin --delete branchname

ou

git push origin :branch-name

#révertit un commit déjà envoyé à un dépôt distant

git revert hgytyz4567

#branch d'un commit précédent utilisant GIT

git branch branchname <sha1-of-commit>

#Modifier le message de validation du commit le plus récent qui a déjà été envoyé à distance

git commit --amend -m "new commit message"
git push --force origin <branch-name>

# Rejeter tous les commits locaux sur cette branche  [Suppression des validations locales]

Afin de supprimer toutes les validations locales sur cette branche, pour rendre la branche locale identique à l'amont de cette branche, exécutez simplement

git reset --hard @{u}

Référence: http://sethrobertson.github.io/GitFixUm/fixup.html ou faire git reset --hard origin/master [si la branche locale est maître]

# Annuler un commit déjà envoyé à un dépôt distant?

$ git revert ab12cd15

# Supprimer un commit précédent de la branche locale et de la branche distante

Cas d'utilisation: Vous venez de commettre un changement à votre succursale locale et immédiatement poussé à la branche distante, Soudain réalisé, Oh non! Je n'ai pas besoin de ce changement. Maintenant faire quoi?

git reset --hard HEAD~1 [pour supprimer ce commit de la branche locale. 1 indique l'engagement que vous avez pris]

git push origin HEAD --force [les deux commandes doivent être exécutées. Pour supprimer à partir de la branche distante]. La branche actuellement retirée sera référencée comme la branche dans laquelle vous effectuez cette opération.

# Supprime certaines des validations récentes des repo locales et distantes et conserve le commit que vous voulez. (une sorte de retour à partir de locaux et à distance)

Supposons que vous avez 3 commits que vous avez poussés vers la branche distante nommée 'develop'

commitid-1 done at 9am
commitid-2 done at 10am
commitid-3 done at 11am. // latest commit. HEAD is current here.

Pour revenir à l'ancien commit (pour changer l'état de la branche)

git log --oneline --decorate --graph // pour voir tous vos commitids

git clean -d -f // nettoie tous les changements locaux

git reset --hard commitid-1  // revient localement à ce commitid

git push -u origin +develop // Pousse cet état à distance. + pour faire pousser la force

# Supprimer la fusion git locale: Cas: Je suis sur la branche principale et la branche maîtresse fusionnée avec une nouvelle branche de travail phase2

$ git status

Sur le maître de la succursale

$ git merge phase2 $ git status

Sur le maître de la succursale

Votre branche est en avance sur 'origin / master' par 8 commet

Q: Comment se débarrasser de cette fusion git locale? A essayé git reset --hardet git clean -d -f Les deux ne fonctionnaient pas. La seule chose qui travaillé sont l'un des suivants:

$ git reset --hard origine / maître

ou

$ git reset --hard HEAD ~ 8

ou

$ git reset --hard 9a88396f51e2a068bb7 [sha commit code - c'est celui qui était présent avant que tous vos commits de fusion se produisent]

#créer le fichier gitignore

touch .gitignore // crée le fichier dans les utilisateurs mac ou unix

exemple de contenu .gitignore:

.project
*.py
.settings

Lien de référence à la feuille de triche du GIT: https://services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf


17
2017-09-18 21:18



1. Lorsque vous ne voulez pas garder vos changements locaux du tout.

git reset --hard

Cette commande supprimera complètement toutes les modifications locales de votre référentiel local. C'est le meilleur moyen d'éviter les conflits lors de la commande pull, uniquement si vous ne souhaitez pas conserver vos modifications locales.

2. Quand vous voulez garder vos changements locaux

Si vous voulez tirer les nouveaux changements de la télécommande et que vous voulez ignorer le changements locaux pendant cette traction alors,

git stash

Il va stocker tous les changements locaux, maintenant vous pouvez tirer les changements à distance,

git pull

Maintenant, vous pouvez ramener vos changements locaux par,

git stash pop

7
2017-11-04 10:46



Utilisation:

git checkout -- <file>

Pour annuler les modifications dans le répertoire de travail.


4
2018-06-26 13:57



Je pense que Git a une chose qui n'est pas clairement documentée. Je pense que c'était vraiment négligé.

git checkout .

Homme, tu as sauvé ma journée. J'ai toujours des choses que je veux essayer en utilisant le code modifié. Mais les choses finissent parfois par désordonner le code modifié, ajouter de nouveaux fichiers non suivis, etc. Donc ce que je veux faire est, mettre en scène ce que je veux, faire les choses désordonnées, puis nettoyer rapidement et commettre si je suis heureux.

Il y a git clean -fd fonctionne bien pour les fichiers non suivis.

alors git reset supprime simplement mis en scène, mais git checkout est un peu trop lourd. Spécifier le fichier un par un ou utiliser des répertoires n'est pas toujours idéal. Parfois, les fichiers modifiés dont je veux me débarrasser se trouvent dans des répertoires que je veux conserver. J'ai souhaité cette commande unique qui supprime juste les changements non-statiques et vous voilà. Merci.

Mais je pense qu'ils devraient juste avoir git checkout sans aucune option, supprimez toutes les modifications non mises en scène et ne touchez pas la mise en scène. C'est un peu modulaire et intuitif. Plus comme quoi git reset Est-ce que. git clean devrait également faire la même chose.


3
2018-03-08 21:14



Le meilleur moyen est de vérifier les changements.

En changeant le fichier pom.xml dans un projet nommé nom-projet, vous pouvez le faire:

git status

# modified:   project-name/pom.xml

git checkout project-name/pom.xml
git checkout master

# Checking out files: 100% (491/491), done.
# Branch master set up to track remote branch master from origin.
# Switched to a new branch 'master'

2
2018-01-15 17:01



Pour jeter tous J'aime stocker et laisser tomber cette cachette, c'est le moyen le plus rapide de tout jeter, surtout si vous travaillez entre plusieurs repos.

Cela va cacher tous les changements dans {0} clé et instantanément le laisser tomber {0}

git stash && git stash drop


2
2018-06-27 16:26



Tout d'abord, vérifiez que votre changement important est sauvegardé ou non par:

$ git status

que essayer

$ git reset --hard

il va réinitialiser votre branche à défaut

mais si vous avez besoin d'annuler:

$ edit (1)   $ git ajouter frotz.c   filfre.c $ mailx (2)   $ git reset
  (3) $ git pull git: //info.example.com/nitfol


Lisez plus >> https://git-scm.com/docs/git-reset


1
2017-09-21 11:02