Différentes façons d'éliminer les modifications locales Git

j'ai 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 sinon s'il vous plaît faites-moi savoir la bonne approche.

(2) Quand est-ce que nous utilisons git reset --hard car je suis capable de réinitialiser même sans cette commande

Merci

*Solution: modification(s) majeure (s): 03/26: * Remplacé beaucoup de termes vagues avec git terminologie spécifique [tracked/untracked/staged/unsaged]

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

Type 1. Mise en scène dossiers

Type 2. Non-staged Tracked files

Type 3. Dossiers Non retracés A. K. a untracked files

  • échelonnés - ceux qui sont déplacés à la zone de transit / ajoutés à l'index
  • fichiers modifiés
  • sans traces - de nouveaux fichiers. Toujours unstaged. S'ils sont mis en scène, ça veut dire qu'ils sont traqués.

Ce que chaque commandes faire:

  1. git checkout . - supprime les fichiers suivis non marqués seulement [Type 2]

  2. git clean -f - supprime les fichiers non tracés non marqués uniquement [Type 3]

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

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

Conclusion:

il est clair que nous pouvons utiliser l'un ou l'autre

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

ou

(2) `git stash -u`

pour obtenir le résultat souhaité.

Remarque: Accrocher, que signifie le mot 'Store (quelque chose) en toute sécurité et en secret dans un lieu déterminé."Cela peut toujours être récupéré en utilisant git stash pop . Ainsi, choisir entre les deux options ci-dessus est l'appel du développeur.

Merci Christoph et Frederik Schøning.

Edit: 03/27

j'ai pensé qu'il valait la peine de mettre le ' attention "note à git clean -f

git clean -f

Il n'y a pas de retour en arrière. Utilisez -n ou --dry-run pour aperçu les dégâts que vous allez faire.

si vous voulez aussi supprimer des répertoires, Lancez git clean -f -d

si vous voulez simplement supprimer des fichiers ignorés, Lancez git clean -f -X

si vous voulez supprimer les fichiers ignorés et non-ignorés, Lancez git clean -f -x

référence : pour en savoir plus sur git clean : comment supprimer les fichiers locaux (non tracés) de l'arbre de travail Git actuel?

Edit: 05/20/15

en Écartant tous les locaux s'engage sur cette branche [Suppression locale s'engage]

afin d'écarter toutes les charges locales sur cette branche, pour rendre la branche locale identique pour "l'amont" de cette branche, il suffit d'exécuter git reset --hard @{u}

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

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

Remarque: 06/12/2015 C'est et non un duplicata de L'autre question SO qui est marqué comme duplicata. Cette question porte sur la façon de supprimer les changements GIT locaux [supprimer un fichier ajouté, supprimer les changements ajoutés au fichier existant, etc et les différentes approches; où dans l'autre fil de discussion ne concerne que la façon de supprimer la propagation locale. Si vous avez ajouté un fichier, et que vous souhaitez supprimer que seul, puis l'autre AFIN de thread n'a pas de discuter de ce sujet. Par conséquent, il ne s'agit pas d'un double de l'autre]

Edit: 06/23/15

comment inverser une propagation déjà poussée vers un dépôt distant?

$ git revert ab12cd15

Edit: 09/01/2015

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

Cas

: vous venez de commit er un changement à votre branche 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 cette propagation de la branche locale]

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

Quelle est la branche ? Son extrait de la branche.

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

je suis sur master branche et fusionné master de la direction, avec une nouvelle branche 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? Essayé git reset --hard et git clean -d -f Les deux n'ont pas de travail.

la seule chose que 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 toute votre fusion ne se produise]

578
demandé sur spiderman 2014-03-25 00:54:39

9 réponses

tout dépend exactement ce que vous essayez d'annuler/rétablir. Commencez par lire le post dans le lien de Ube . Mais pour tenter une réponse:

Hard reset

git reset --hard [HEAD]

supprimez complètement tous les changements échelonnés ou non aux fichiers suivis.

je me retrouve souvent à utiliser la réinitialisation dure, quand je suis comme " défaire tout comme si je avait fait un re-clone complet à partir de la télécommande". Dans votre cas, où vous voulez juste votre dossier vierge, ça marcherait.

Propre

git clean [-f]

supprimer les fichiers qui ne sont pas suivis.

pour supprimer les fichiers temporaires, mais garder les changements échelonnés et non étalés sur les fichiers déjà suivis. La plupart du temps, je finirais probablement par faire une règle d'ignorer au lieu de nettoyer à répétition - 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 ignore though-rule. Dans le cas ci-dessus, avec une règle ignore-pour ne jamais suivre les dossiers bin/obj, même si ces dossiers sont ignorés par git, en utilisant l'option force les supprimera de votre fichier système. J'ai vu sporadiquement une utilisation pour cela, par exemple lors du déploiement de scripts, et vous voulez nettoyer votre code avant de déployer, fermeture éclair ou autre.

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

check-out "point "

git checkout .

Je n'avais en fait jamais vu cette notation avant de lire votre post. J'ai du mal à trouver de la documentation pour ça (peut-être que quelqu'un peut help), mais en jouant un peu, il semble que cela signifie:

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

i. e. changements non identifiés dans les fichiers suivis. Apparemment, il ne touche pas aux changements mis en scène et ne laisse que les fichiers non tracés.

Accrocher

certaines réponses mentionnent des cachettes. Comme le libellé l'indique, vous devriez probablement utiliser accrocher lorsque vous sont au milieu de quelque chose (pas prêt pour un commit), et vous devez temporairement changer les branches ou travailler d'une façon ou d'une autre sur un autre État de votre code, plus tard pour revenir à votre "bureau désordonné". Je ne vois pas que cela s'applique à votre question, mais c'est certainement pratique.

pour résumer

généralement, si vous êtes sûr que vous avez engagé et peut-être poussé à un changement important à distance, si vous êtes juste jouer autour ou le genre, en utilisant git reset --hard HEAD , suivi par git clean -f définitivement nettoyer votre code à l'état, il serait, s'il avait juste été cloné et vérifié à partir d'une branche. Il est très important de souligner que la réinitialisation supprimera également les changements échelonnés, mais non engagés. il effacera tout ce qui n'a pas été commis (sauf les fichiers non tracés, dans ce cas, utiliser nettoyer ).

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

je pense que votre question n ° 1 est couverte, mais finalement, pour conclure sur le N ° 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. Si vous aviez mis en scène un changement, ni git checkout . ni git clean -f n'aurait inversé cela.

Espère que cela couvre.

475
répondu Frederik Struck-Schøning 2016-02-04 16:49:56

comme pour tout en git, il y a plusieurs façons de le faire. Les deux commandes utilisées sont un moyen de le faire. Une autre chose que vous auriez pu faire est simplement les cacher avec git stash -u . Le -u s'assure que les fichiers nouvellement ajoutés (Non tracés) sont également inclus.

ce qui est pratique à propos de git stash -u c'est que

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

à partir de votre autre question git reset --hard ne supprimera pas les fichiers non tracés de sorte que vous auriez encore besoin du git clean -f . Mais un git stash -u pourrait être le plus pratique.

20
répondu Christoph 2014-03-24 22:51:18

raison pour ajouter une réponse à ce moment:

jusqu'à présent, j'ai ajouté la conclusion et les "réponses" à ma question initiale elle-même, ce qui rend la question très longue, donc passer à une réponse séparée.

j'ai aussi ajouté plus de fréquemment utilisés commandes git qui m'aide sur git, pour aider quelqu'un d'autre aussi.

premier pas avant vous faites n'importe quel commits est de configurer votre nom d'utilisateur et email qui apparaît avec votre commit.

#Définit le nom que vous voulez attaché à vos transactions de validation

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

# définit l'email que vous voulez atacher à vos transactions de propagation

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

#Liste le mondial config

$ git config --list

#vérification de l'état de

git status

#Liste tous les locaux et distants branches

git branch -a

#créer une nouvelle branche locale et commencer à travailler sur cette branche

git checkout -b "branchname" 

ou, il peut être fait comme un processus en deux étapes

création d'une branche: git branch branchname travaux sur cette branche: git checkout branchname

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

git add <path to file>

git commit -m "commit message"

# caisse d'une autre succursale locale

git checkout "local branch name"

#supprimer tous les changements dans la branche locale [supposez que vous avez fait quelques changements dans la branche locale comme Ajouter un nouveau fichier ou modifier fichier existant, ou de faire une validation, mais n'ont plus besoin que] git clean -d -f et git reset --hard [nettoyer toutes les modifications locales apportées à la branche locale sauf si Local commit]

git stash -u supprime également tous les changements

Note: Il est clair que nous pouvons utiliser (1) combinaison de git clean –d –f et git reset --hard OU (2) git stash -u pour obtenir le résultat souhaité.

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

Note 2: git reset --hard supprimera les modifications apportées au répertoire de travail. Assurez-vous de cacher tous les changements locaux que vous voulez garder avant d'exécuter cette commande.

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

git checkout master

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

git pull

# fusionner la branche des fonctionnalités dans la branche principale.

git merge feature_branch

# Réinitialisation de la branche master à l'origine de l'état.

git reset origin/master

#accidentellement supprimé un fichier de local, comment récupérer il de retour? Faites un git status pour obtenir le chemin de fichier complet de la ressource supprimée

git checkout branchname <file path name>

c'est ça!

#Merge master branch with somethotherbranch

git checkout master
git merge someotherbranchname

#renommer branche locale

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

#supprimer la branche locale

git branch -D branch-name

#supprimer à distance de la branche

git push origin --delete branchname

ou

git push origin :branch-name

#revenir un commit déjà poussé à un dépôt distant

git revert hgytyz4567

#succursale d'une livraison antérieure à l'aide de GIT

git branch branchname <sha1-of-commit>

#Changer le message de validation de la plus récente commettre déjà été poussé à distance

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

# Écartant tous les locaux s'engage sur cette branche [Suppression locale s'engage]

pour rejeter toutes les commits locales sur cette branche, pour rendre la branche locale identique à la "amont" de cette branche, il suffit d'exécuter

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 maître]

# Revenir un commit déjà poussé à un dépôt distant?

$ git revert ab12cd15

#Supprimer une précédente livraison de la section locale et à distance de la branche

case à cocher: vous venez d'effectuer un changement à votre succursale locale et immédiatement poussé à la succursale éloignée, soudain réalisé , Oh non! Je n'ai pas besoin de ce changement. Maintenant faire quoi?

git reset --hard HEAD~1 [pour supprimer cette propagation de la branche locale. 1 indique celui que vous avez commis]

git push origin HEAD --force [les deux commandes doivent être exécutées. Pour supprimer de la branche distante]. Extrait de la branche sera désignée comme la branche où vous effectuez cette opération.

#Supprimer certains de ces dernières commits locaux et distants pensions et de préserver à la livraison que vous souhaitez. ( une sorte de revenir s'engage de local et à distance)

supposons que vous avez 3 commits que vous avez poussé à 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 modifier l'état de la branche)

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

git clean -d -f / / nettoyer tout changement local

git reset --hard commitid-1 / / reverting Local a cette commission 1519540920"

git push -u origin +develop // bouton-poussoir de cet état à distance. + à faire de la force de poussée

# Remove local git merge: Cas: Je suis sur la branche master et de fusion de la branche principale, avec une nouvelle branche phase2

$ git status

Sur la branche master

$ git merge phase2 $ git status

Sur la branche master

Votre branche est en avance de 'origin/master' par 8 s'engage.

Q: comment se débarrasser de cette fusion git locale? essayé git reset --hard et git clean -d -f tous les deux n'ont pas fonctionné. La seule chose que 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 toute votre fusion ne se produise]

#créer gitignore fichier

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

de l'échantillon .gitignore sommaire:

.project
*.py
.settings

référence lien vers la fiche technique de GIT: https://services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf

17
répondu spiderman 2018-02-17 17:57:30

1. Lorsque vous ne souhaitez pas conserver vos changements locaux.

git reset --hard

cette commande supprimera complètement toutes les modifications locales de votre dépôt local. C'est la meilleure façon d'éviter les conflits lors de la commande pull, seulement si vous ne souhaitez pas conserver vos changements locaux.

2. Quand vous voulez garder vos changements locaux

Si vous voulez tirez les nouveaux changements de distance et souhaitez ignorer les local changements au cours de ce pull, puis,

git stash

Il va ranger tous les changements locaux, maintenant vous pouvez tirer les modifications distantes,

git pull

Maintenant, vous pouvez ramener vos changements locaux par,

git stash pop
7
répondu Actung 2016-11-04 10:46:50

utiliser:

git checkout -- <file>

pour rejeter les modifications dans le répertoire de travail.

4
répondu Tadas Stasiulionis 2017-06-26 13:57:22

je pense que git a une chose qui n'est pas clairement documentée. Je pense que c'était en fait négligé.

git checkout .

Mec, tu m'as sauvé la mise. J'ai toujours des choses à essayer avec le code modifié. Mais les choses finissent parfois par gâcher le code modifié, ajouter de nouveaux fichiers non tracés, etc. Donc ce que je veux faire, c'est mettre en scène ce que je veux, faire les trucs désordonnés, puis nettoyer rapidement et m'engager si je suis heureux.

il y a git clean -fd fonctionne bien pour les fichiers non tracés.

puis git reset supprime simplement la mise en scène, mais git checkout est un peu trop lourd. Spécifier un fichier par un ou utiliser des répertoires n'est pas toujours idéal. Parfois, les fichiers modifiés je veux me débarrasser de sont dans des répertoires que je veux garder. J'ai souhaité cette commande qui supprime les changements non programmés et te voilà. Grâce.

Mais je pense qu'ils devraient juste git checkout sans options, supprimer tous les changements non marqués et de ne pas toucher l'étape. C'est plutôt modulaire et intuitif. Plutôt ce que git reset fait. git clean devrait faire de même.

4
répondu Emmanuel Mahuni 2018-03-08 21:14:42

le meilleur moyen est de vérifier les changements.

modifier le fichier pom.xml dans un projet nommé project-name 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
répondu bpedroso 2015-01-15 17:01:22

Pour ignorer tout je tiens à les ranger et de les ranger, c'est le moyen le plus rapide pour se défausser de toutes, surtout si vous travaillez entre plusieurs titres.

cela cachera tous les changements dans la touche {0} et la laissera immédiatement tomber de {0}

git stash && git stash drop

2
répondu Tatarin 2017-06-27 16:26:25

tout d'abord, vérifiez si votre changement important est enregistré ou non par:

$ git status

que essayez

$ git reset --hard

il réinitialisera votre branche par défaut

mais si vous avez besoin juste annuler:

$ modifier (1) $ git add frotz.C filfre.c $ mailx (2) $ git reset

( 3) $ git pull git://info.exemple.com / nitfol 151910920"


lire la suite > > https://git-scm.com/docs/git-reset

1
répondu Rizo 2017-09-21 22:56:30