web-dev-qa-db-fra.com

Divers moyens de supprimer les modifications locales de Git

Je viens de cloner un référentiel git et d'extraire une branche. J'y ai travaillé, puis j'ai décidé de supprimer tous mes changements locaux, car je voulais la copie originale.

En bref, je devais faire les deux commandes suivantes pour supprimer mes modifications locales

git checkout .

git clean -f

Ma question est,

(1) Est-ce la bonne approche 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 peux le réinitialiser même sans cette commande

Merci

* Solution: Édition (s) 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 apportons des modifications locales:

Type 1. Fichiers suivis suivis

Type 2. Fichiers suivis non mis en place

Type 3. Fichiers non suivis non mis en scène a.k.a Fichiers non suivis

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

Ce que chaque commande fait:

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

  2. git clean -f - Supprime UNIQUEMENT les fichiers non suivis non suivis [Type 3]

  3. git reset --hard - Supprime UNIQUEMENT les fichiers suivis stagedés et non suivis suivis [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` 

OR

(2) `git stash -u`

pour obtenir le résultat souhaité.

Remarque: 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 un appel du développeur.

Merci Christoph et Frederik Schøning.

Edit: 03/27

Je pensais que cela valait la peine de mettre la note ' méfiez-vous ' de git clean -f

git clean -f

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

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

Si vous voulez juste supprimer les fichiers ignorés, lancez git clean -f -X

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

référence: plus sur git clean: Comment supprimer des fichiers locaux (non suivis) de l’arbre de travail Git actuel?

Edit: 20/05/15

Suppression de tous les validations locales sur cette branche [Suppression des validations locales]

Pour ignorer tous les commits locaux 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 bien faire git reset --hard Origin/master [si la branche locale est master]

Note: 06/12/2015 Ceci est pas une copie de la autre SO question marquée comme étant en double. Cette question porte sur la façon de supprimer les modifications GIT locales [supprimer un fichier ajouté, supprimer les modifications ajoutées à un fichier existant, etc. et les différentes approches; Où, dans l'autre SO thread, uniquement comment supprimer le commit local. Si vous avez ajouté un fichier et que vous souhaitez le supprimer seul, alors l'autre thread SO n'en discute pas. Donc ce n’est pas un duplicata de l’autre]

Edit: 23/06/15

Comment annuler un commit déjà poussé dans un référentiel distant?

$ git revert ab12cd15

Edit: 09/01/2015

Supprimer une validation précédente de la branche locale et de la branche distante

Cas: vous venez d’engager un changement dans votre agence locale et immédiatement poussé vers l’agence distante, réalisa soudainement, Oh non! Je n'ai pas besoin de ce changement. Maintenant faire quoi?

git reset --hard HEAD~1 [pour supprimer cette validation de la branche locale]

git Push Origin HEAD --force [les deux commandes doivent être exécutées. Pour supprimer d'une branche distante]

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

Éditer 09/08/2015 - Supprimer le git local fusionner :

Je suis sur master branche et fusionné master branche avec une branche qui fonctionne récemment 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 ne fonctionnaient pas.

La seule chose qui a fonctionné est l'une des suivantes:

$ git reset --hard Origin/master

ou

$ git reset --hard HEAD~8

ou

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

604
spiderman

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

Réinitialisation matérielle

git reset --hard [HEAD]

supprime complètement toutes les modifications mises en place et non mises en place dans les fichiers suivis.

Je me trouve souvent en train d’utiliser une réinitialisation difficile, quand je me dis "annule tout comme si j’avais refait un clone complet depuis la télécommande". Dans votre cas, où vous voulez juste que votre pension soit vierge, cela fonctionnerait.

Nettoyer

git clean [-f]

Supprime les fichiers qui ne sont pas suivis.

Pour supprimer des fichiers temporaires, mais conservez les modifications stockées et non stockées dans les fichiers déjà suivis. La plupart du temps, je finirais probablement par créer une règle ignore au lieu de nettoyer plusieurs fois - par exemple. pour les dossiers bin/obj d'un projet C #, que vous voudriez généralement exclure de votre référentiel pour économiser de l'espace, ou quelque chose du genre.

L'option -f (force) supprimera également les fichiers qui ne sont pas suivis et sont également ignorés par git, bien que ignore-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, l'utilisation de l'option force forcera leur suppression de votre système de fichiers. J'ai vu sporadiquement une utilisation pour cela, par exemple. lors du déploiement de scripts et que vous souhaitez nettoyer votre code avant le déploiement, la compression ou autre.

Git Clean ne touchera pas les fichiers qui font déjà l'objet d'un suivi.

Checkout "dot"

git checkout .

En fait, je n'avais jamais vu cette notation avant de lire votre post. J'ai de la difficulté à trouver de la documentation à ce sujet (peut-être que quelqu'un pourra vous aider), mais en jouant un peu, on dirait que cela signifie:

"annule toutes les modifications de mon arbre de travail".

C'est à dire. annuler les modifications non mises en scène dans les fichiers suivis. Apparemment, il ne touche pas aux modifications mises en scène et laisse les fichiers non suivis seuls.

Stashing

Certaines réponses mentionnent stashing. Comme le libellé l’implique, vous utiliserez probablement stashing lorsque vous êtes au milieu de quelque chose (qui n’est pas prêt pour un commit), et vous devez changer temporairement de branche ou travailler sur un autre état de votre code, pour revenir plus tard à votre "désordre". bureau". Je ne vois pas que cela s'applique à votre question, mais c'est certainement pratique.

En résumé

En règle générale, si vous êtes sûr que vous avez validé et peut-être poussé vers une modification à distance importante, si vous vous contentez de jouer ou d'un jeu similaire, utiliser git reset --hard HEAD suivi de git clean -f nettoiera définitivement votre code à l'état, il y en aurait eu s'il venait juste d'être cloné et extrait d'une succursale. Il est vraiment important de souligner que la réinitialisation supprimera également les modifications échelonnées mais non validées. Il effacera tout ce qui n'a pas été validé (sauf les fichiers non suivis, auquel cas, utilisez clean ).

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

Je pense que votre question n ° 1 est couverte, mais enfin, 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 organisé un changement, ni git checkout . ni git clean -f ne l'aurait annulée.

J'espère que ça couvre.

487

Raison pour laquelle une réponse a été ajoutée à ce moment:

Jusqu’à présent, j’étais en train d’ajouter la conclusion et les "réponses" à ma question initiale elle-même, ce qui la rendait très longue et je passais donc à une réponse séparée.

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

Essentiellement pour nettoyer tous les commits locaux $ git reset --hard_ ET _$ git clean -d -f


First Avant de commettre, vous devez configurer votre nom d'utilisateur et votre courrier électronique, ainsi que votre commit.

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

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

# Définit l’email que vous voulez attacher à vos transactions de commit

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

# Liste la configuration globale

_$ git config --list
_

# Lister l'URL distante

_$ git remote show Origin
_

# vérifier le statut

_git status
_

# Liste toutes les branches locales et distantes

_git branch -a
_

# créer une nouvelle branche locale et commencer à 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_

# validation des modifications locales [Processus en deux étapes: - Ajoutez le fichier à l'index, ce qui signifie qu'il faut ajouter à la zone de stockage intermédiaire. Puis validez les fichiers présents dans cette zone intermédiaire.]

_git add <path to file>

git commit -m "commit message"
_

# checkout une autre branche locale

_git checkout "local branch name"
_

# supprime toutes les modifications de la branche locale [Supposons que vous apportiez certaines modifications à la branche locale, telles que l'ajout d'un nouveau fichier, la modification d'un fichier existant ou la réalisation d'un commit local, mais que vous n'en avez plus besoin] _git clean -d -f_ et _git reset --hard_ [nettoie toutes les modifications locales apportées à la branche locale, sauf en cas de validation locale]

_git stash -u_ supprime également toutes les modifications

Note: Il est clair que nous pouvons utiliser soit (1) la combinaison de _git clean –d –f_ et _git reset --hard_ OR (2) _git stash -u_ pour atteindre le résultat souhaité.

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

Remarque 2: _git reset --hard_ supprimera les modifications du répertoire de travail. Assurez-vous de cacher toutes les modifications locales que vous souhaitez conserver avant d'exécuter cette commande.

# Basculez vers la branche principale et assurez-vous d'être à jour.

_git checkout master
_

_git fetch_ [cela peut être nécessaire (selon votre configuration git) pour recevoir les mises à jour sur Origin/master]

_git pull
_

# Fusionner la branche de fonctionnalité dans la branche principale.

_git merge feature_branch
_

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

_git reset Origin/master
_

# Suppression accidentelle d'un fichier d'un fichier local, comment le récupérer? Faites une _git status_ pour obtenir le chemin d'accès complet à la ressource supprimée

_git checkout branchname <file path name>
_

c'est ça!

# Fusion de la branche principale avec une autre branche

_git checkout master
git merge someotherbranchname
_

# renommer la branche locale

_git branch -m old-branch-name new-branch-name
_

# supprimer une branche locale

_git branch -D branch-name
_

# supprimer une branche distante

_git Push Origin --delete branchname
_

ou

_git Push Origin :branch-name
_

# rétablit un commit déjà poussé dans un référentiel distant

_git revert hgytyz4567
_

# branche d'une validation précédente utilisant GIT

_git branch branchname <sha1-of-commit>
_

# Change le message de validation de la dernière validation qui a déjà été poussée à distance

_git commit --amend -m "new commit message"
git Push --force Origin <branch-name>
_

# Suppression de tous les validations locales sur cette branche [Suppression des validations locales]

Pour ignorer tous les commits locaux sur cette branche, pour que la branche locale soit identique à "l'amont" de cette branche, exécutez simplement

_git reset --hard @{u}
_

Référence: http://sethrobertson.github.io/GitFixUm/fixup.html ou do _git reset --hard Origin/master_ [si la branche locale est maître]

# Rétablir un commit déjà poussé vers un référentiel distant?

_$ git revert ab12cd15
_

# Supprimer une validation précédente de la branche locale et de la branche distante

Use-Case: Vous venez de valider une modification dans votre branche locale et immédiatement poussé vers la branche distante, réalisa soudainement, Oh non! Je n'ai pas besoin de ce changement. Maintenant faire quoi?

_git reset --hard HEAD~1_ [pour supprimer cette validation de la branche locale. 1 dénote le SEUL engagement que vous avez fait]

_git Push Origin HEAD --force_ [les deux commandes doivent être exécutées. Pour supprimer d'une branche distante]. La branche actuellement extraite sera appelée la branche où vous effectuez cette opération.

# Supprimez quelques commits récents des pensions locales et distantes et conservez-les au commit que vous souhaitez. (Sorte de rétablir les commits depuis local et distant)

Supposons que vous avez 3 commits que vous avez poussés vers une 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 toutes les modifications locales

_git reset --hard commitid-1_ // localement revenir à ce commitid

_git Push -u Origin +develop_ // Pousser cet état à distance. + faire la force Push

# Supprimer la fusion git locale: Cas: je suis sur la branche principale et sur la branche principale fusionnée avec une nouvelle phase de branche en fonctionnement2.

_$ git status
_

sur le maître de branche

_$ git merge phase2_ _$ git status_

sur le maître de branche

Votre branche est en avance sur 'Origine/maître' de 8 = * validée.

Q: Comment se débarrasser de cette fusion git locale? Essayé _git reset --hard_ et _git clean -d -f_ Les deux n'ont pas fonctionné. La seule chose qui a travaillé est l’un des choix ci-dessous:

$ git reset - Hard Origin/master

ou

$ git reset --hard HEAD ~ 8

ou

_$ git reset --hard 9a88396f51e2a068bb7_ [code de commande - c'est celui qui était présent avant tous vos commits de fusion]

# créer un fichier gitignore

_touch .gitignore_ // créer le fichier dans des utilisateurs mac ou unix

exemple de contenu .gitignore:

_.project
*.py
.settings
_

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

20
spiderman

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

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

  1. c'est probablement la commande simple la plus simple (seule?) pour atteindre votre objectif
  2. si vous changez d'avis par la suite, vous obtenez tous votre travail avec git stash pop (c'est comme supprimer un email dans gmail où vous pouvez simplement annuler si vous changez d'avis par la suite)

En ce qui concerne votre autre question, git reset --hard ne supprimera pas les fichiers non suivis, vous aurez donc toujours besoin de git clean -f. Mais un git stash -u pourrait être le plus pratique.

20
Christoph

1. Lorsque vous ne souhaitez pas conserver vos modifications locales.

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 d'extraction, uniquement si vous ne souhaitez pas conserver vos modifications locales.

2. Lorsque vous souhaitez conserver vos modifications locales

Si vous voulez extraire les nouvelles modifications de la télécommande et que vous voulez ignorer les modifications locales pendant cette extraction,

git stash

Il va cacher toutes les modifications locales, maintenant vous pouvez extraire les modifications à distance,

git pull

Maintenant, vous pouvez ramener vos changements locaux par,

git stash pop
7
Actung

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 as sauvé ma journée. J'ai toujours des choses que je veux essayer d'utiliser le code modifié. Mais les choses finissent parfois par gâcher le code modifié, ajouter de nouveaux fichiers non suivis, etc. Donc, ce que je veux faire, c'est présenter ce que je veux, mettre en place le fouillis, puis nettoyer rapidement et engager si je suis content.

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

Ensuite, git reset supprime simplement la mise en scène, mais git checkout est un peu trop encombrant. Spécifier un fichier à la fois 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. Je souhaitais cette commande qui supprime simplement les modifications non mises en scène et vous voici. Merci.

Mais je pense qu'ils devraient juste avoir git checkout sans aucune option, supprimer tous les changements non mis en scène et ne pas toucher le mis en scène. C'est un peu modulaire et intuitif. Plus comme ce que git reset fait. git clean devrait également faire de même.

4
Emmanuel Mahuni

Utilisation:

git checkout -- <file>

Annuler les modifications dans le répertoire de travail.

4
Tadas Stasiulionis

Le meilleur moyen consiste à vérifier les modifications.

Changer 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
bpedroso

Pour tout jeter j'aime bien cacher et déposer cette cachette, c'est le moyen le plus rapide de tout jeter, surtout si vous travaillez entre plusieurs pensions.

Tous les changements de la clé {0} seront alors cachés et supprimés instantanément de {0}

git stash && git stash drop

2
Tatarin

Tout d’abord, vérifiez si votre modification importante est sauvegardée ou non par:

$ git status

que d'essayer

$ git reset --hard

il va réinitialiser votre branche par défaut

mais si vous avez besoin de simplement annuler:

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


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

1
Rizo