Comment annuler 'git add' avant de valider?

J'ai ajouté par erreur des fichiers à git avec la commande:

 git add myfile.txt 

Je n'ai pas encore lancé git commit . Existe-t-il un moyen d'annuler cette opération pour que ces fichiers ne soient pas inclus dans la validation?


Il y a actuellement 48 réponses (certaines supprimées). S'il vous plaît ne pas ajouter un nouveau si vous n'avez pas de nouvelles informations.

7856
08 дек. fixé par paxos1977 08 déc. 2008-12-08 00:57 '08 à 0:57 2008-12-08 00:57
@ 34 réponses
  • 1
  • 2

Vous pouvez annuler git add avant de vous engager avec

 git reset <file> 

ce qui le retirera de l'index actuel (la liste "sur le point d'être engagée") sans rien changer d'autre.

Vous pouvez utiliser

 git reset 

sans nom de fichier pour désactiver toutes les modifications. Cela peut être utile lorsque trop de fichiers sont répertoriés un par un dans un délai raisonnable.

Dans les anciennes versions de Git, les commandes ci-dessus sont équivalentes à git reset HEAD <file> et à git reset HEAD respectivement. HEAD si HEAD n’est pas défini (car vous n’avez commis aucune validation dans votre repo) ou ambigu (car vous avez créé une branche avec nom HEAD , qui est une chose stupide que vous ne devriez pas faire). Cela a été modifié dans Git 1.8.2 , bien que dans les versions modernes de Git, vous pouvez utiliser les commandes ci-dessus avant de créer votre premier commit:

"git reset" (sans paramètre ni paramètre) utilisé pour vous n'a pas d'engagement dans votre historique, mais maintenant il vous donne un index vide (pour correspondre à un commit inexistant, vous n'êtes même pas inclus).

8850
08 дек. la réponse est donnée à genehack le 08 déc. 2008-12-08 01:30 '08 à 1:30 2008-12-08 01:30

Vous voulez:

 git rm --cached <added_file_to_undo> 

Justification:

Quand j'étais nouveau à cela, j'ai d'abord essayé

 git reset . 

(pour annuler tous mes téléchargements initiaux), seulement pour obtenir ce message (pas très utile):

 fatal: Failed to resolve 'HEAD' as a valid ref. 

Il s’avère que c’est parce que le lien HEAD (branche?) N’existe qu’après le premier commit. Autrement dit, vous rencontrerez le même problème de débutant que moi si votre flux de travail, tel que le mien, ressemble à ceci:

  1. Allez dans mon nouveau répertoire de projets pour essayer Git, le nouvel enthousiasme
  2. git init
  3. git add.
  4. git status

    ... beaucoup de rouleaux de merde ...

    > Zut, je ne voulais pas ajouter tout ça.

  5. google "annuler git add"

    => trouver un débordement de pile - ooh

  6. git reset.

    => fatal: impossible de résoudre "HEAD" en tant que lien valide.

De plus, il s'avère qu'un message d'erreur est enregistré sur la liste de distribution.

Et que la bonne décision était juste là dans la sortie du statut Git (que, oui, j’ai appelé "merde")

border=0
 ... # Changes to be committed: # (use "git rm --cached <file>..." to unstage) ... 

Et la solution est vraiment d'utiliser git rm --cached FILE .

Notez les avertissements ailleurs dans le git rm - git rm supprime votre copie de travail locale du fichier, mais pas si vous utilisez --cached . Voici le résultat de git help rm :

--cached Utilisez cette option pour supprimer et supprimer les chemins de l'index uniquement. Les fichiers du bureau, modifiés ou non, resteront.

Je commence à utiliser

 git rm --cached . 

effacez tout et recommencez. Cela n'a pas fonctionné, car, bien que est récursif, il s’avère que rm besoin de -r pour la récursion. Soupir

 git rm -r --cached . 

Ok, maintenant je suis de retour à où j'ai commencé. La prochaine fois que je vais utiliser -n pour l'exécution de -n et voir ce qui sera ajouté:

 git add -n . 

J'ai tout archivé dans un endroit sûr avant de faire confiance à git help rm pour dire que - --cached ne détruit rien (et si je l' --cached mal).

2013
25 марта '09 в 19:20 2009-03-25 19:20 la réponse est donnée par Rhubarb le 25 mars 09 à 19:20 2009-03-25 19:20

Si vous tapez:

 git status 

git vous dira ce qui se passe, etc., y compris les instructions pour déconnecter:

 use "git reset HEAD <file>..." to unstage 

Je trouve que cet idiot fait un très bon travail en me poussant à faire ce qui est bien dans ces situations.

Note Les versions récentes de git (1.8.4.x) ont changé ce message:

 (use "git rm --cached <file>..." to unstage) 
498
08 дек. La réponse est donnée par Paul Beckingham 08 déc. 2008-12-08 02:22 08 à 02h22 2008-12-08 02:22

Pour clarifier: git add déplace les modifications du répertoire de travail actuel vers une zone intermédiaire (index).

Ce processus s'appelle intermédiaire. Ainsi, la commande la plus naturelle pour modifier les modifications (fichiers modifiés) est évidente:

 git stage 

git add est juste un alias pour git stage

Il est dommage qu'il n'y ait pas de commandes git unstage et git unadd . La question correspondante est plus difficile à deviner ou à retenir, mais elle est assez évidente:

 git reset HEAD -- 

Nous pouvons facilement créer un alias pour cela:

 git config --global alias.unadd 'reset HEAD --' git config --global alias.unstage 'reset HEAD --' 

Et enfin, nous avons de nouvelles équipes:

 git add file1 git stage file2 git unadd file2 git unstage file1 

Personnellement, j'utilise des pseudonymes encore plus courts:

 git a #for staging git u #for unstaging 
232
10 сент. La réponse prend 10 septembre 2010-09-10 23:28 '10 à 23:28 2010-09-10 23:28

En plus de la réponse acceptée, si votre fichier ajouté par erreur était énorme, vous remarquerez probablement que même après l'avoir supprimé de l'index à l'aide de " git reset ", il a toujours lieu dans le répertoire .git . Ne vous inquiétez pas, le fichier est vraiment toujours dans le référentiel, mais uniquement en tant qu '«objet libre», il ne sera pas copié dans d'autres référentiels (via un clone, un push) et l'espace sera éventuellement libéré - bien que peut-être pas très bientôt. . Si vous êtes inquiet, vous pouvez exécuter:

 git gc --prune=now 

Mise à jour (ci-après, je vais essayer d’éliminer une certaine confusion qui pourrait résulter des réponses avec le plus grand nombre de voix):

Alors, quelle est la véritable annulation de git add ?

git reset HEAD <file> ?

ou

git rm --cached <file> ?

Strictement parlant, et si je ne me trompe pas: non .

git add ne peut pas être annulé - en toute sécurité, en général.

Commençons par rappeler ce que git add <file> fait réellement:

  1. Si <file> n'a pas encore été suivi , git add ajoute au cache avec son contenu actuel.

  2. Si <file> déjà suivi , git add enregistre le contenu actuel (instantané, version) dans le cache. Dans GIT, cette action s'appelle toujours ajouter (et pas seulement mettre à jour), car deux versions différentes (captures instantanées) d'un fichier sont traitées comme deux éléments différents. Par conséquent, nous ajoutons un nouvel élément au cache, de sorte que cela sera fait ultérieurement.

À la lumière de cela, la question est quelque peu ambiguë:

J'ai ajouté par erreur des fichiers à l'aide de la commande ...

Le script OP semble être le premier (fichier non suivi), nous voulons "annuler" pour supprimer le fichier (et pas uniquement le contenu actuel) des éléments surveillés. Si tel est le cas , vous pouvez exécuter git rm --cached <file> .

Et nous pouvons aussi lancer git reset HEAD <file> . En général, cela est préférable car cela fonctionne dans les deux scénarios: cela annule également les actions lorsque nous avons ajouté par erreur une version d'un élément déjà suivi.

Mais il y a deux mises en garde.

Premièrement: il n'y a (comme indiqué dans la réponse) qu'un seul script dans lequel git reset HEAD ne fonctionne pas, mais git rm --cached fonctionne: un nouveau référentiel (sans commit). Mais en réalité, cela n’est pratiquement pas pertinent.

Deuxièmement, gardez à l'esprit que git reset HEAD ne peut pas restaurer par magie le contenu d'un fichier précédemment mis en cache, il le re-synchronise simplement avec HEAD. Si notre git add incorrect à git add écrasé la version précédente non validée, nous ne pourrons pas la récupérer. Par conséquent, à proprement parler, nous ne pouvons pas annuler [*].

Exemple:

 $ git init $ echo "version 1" > file.txt $ git add file.txt # first add of file.txt $ git commit -m 'first commit' $ echo "version 2" > file.txt $ git add file.txt # stage (don't commit) "version 2" of file.txt $ git diff --cached file.txt -version 1 +version 2 $ echo "version 3" > file.txt $ git diff file.txt -version 2 +version 3 $ git add file.txt # oops we didn't mean this $ git reset HEAD file.txt # undo ? $ git diff --cached file.txt # no dif, of course. stage == HEAD $ git diff file.txt # we have lost irrevocably "version 2" -version 1 +version 3 

Bien sûr, cela n’est pas très important si nous suivons simplement le workflow paresseux d’exécution de 'git add' pour ajouter de nouveaux fichiers (cas 1) et que nous mettons à jour le nouveau contenu avec la commande commit, git commit -a .


* (Edit: ce qui précède est presque correct, mais il peut toujours exister plusieurs méthodes de récupération des modifications apportées, mais non résolues, puis écrasées - voir les commentaires de Johannes Matokich et iolsmit)

153
18 мая '11 в 21:05 2011-05-18 21:05 La réponse est donnée par leonbloy le 18 mai '11 à 21:05 2011-05-18 21:05
 git rm --cached . -r 

va "annuler" tout ce que vous avez ajouté du répertoire en cours de manière récursive

89
10 дек. réponse donnée par braitsch le 10 déc. 2009-12-10 00:19 '09 à 0:19 2009-12-10 00:19

Run

 git gui 

et supprimez tous les fichiers manuellement ou en les sélectionnant tous et en appuyant sur le bouton de validation avec validation.

83
12 окт. Réponse donnée par Khaja Minhajuddin le 12 octobre 2011-10-12 04:12 '11 à 4:12 le 2011-10-12 04:12

Git a des commandes pour chaque action imaginable, mais nécessite de vastes connaissances pour bien faire les choses, et pour cette raison, il est au mieux contre-intuitif ...

Qu'avez-vous fait avant:

  • Changé le fichier et utiliser git add . ou git add <file> .

Que voulez-vous:

  • Supprimez le fichier de l'index, mais enregistrez-le dans les versions et laissez les modifications non résolues dans la copie de travail:

     git reset head <file> 
  • Réinitialisez le fichier avec le dernier statut de HEAD, en ignorant les modifications et en les supprimant de l'index:

29 марта '13 в 14:14 2013-03-29 14:14 la réponse est donnée sjas 29 mars '13 à 14:14 2013-03-29 14:14

Pour annuler un fichier déjà ajouté, myfile.txt plus simple, utilisez git pour réinitialiser le myfile.txt qui a déjà été ajouté, utilisez:

 git reset HEAD myfile.txt 

Expliquez:

Une fois que vous avez annulé les fichiers inutiles, vous pouvez effectuer une git reset . Head git reset votre fichier sur le réseau local. Le dernier paramètre est le nom de votre fichier.

Je crée les étapes illustrées dans la figure ci-dessous, plus en détail pour vous, y compris toutes les étapes pouvant se produire dans les cas suivants:

2019

La question n'est clairement pas posée. La raison en est que git add a deux significations:

  • ajoutez un nouveau fichier à la zone de git rm --cached file , puis annulez avec le git rm --cached file .
  • Ajoutez un fichier qui a été modifié à une zone de transfert, puis annulez-le avec le git reset HEAD file .

en cas de doute, utilisez

 git reset HEAD file 

Parce que dans les deux cas, la chose attendue est attendue.

Attention: si vous faites git rm --cached file en git rm --cached file dans le fichier est modifié (le fichier qui existait auparavant dans le référentiel), le fichier sera supprimé dans git commit ! Il existera toujours dans votre système de fichiers, mais si quelqu'un d'autre extrait votre commit, le fichier sera supprimé de son arbre de travail.

git status vous indique si le fichier était nouveau ou modifié :

 On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: my_new_file.txt modified: my_modified_file.txt 
69
16 янв. La réponse a été donnée par Michael_Scharf le 16 janvier 2014-01-16 22:54 14 à 22h54: 2014-01-16 22:54

Si vous utilisez votre commit original et que vous ne pouvez pas utiliser git reset, déclarez simplement "Git faillite", supprimez le dossier .git et commencez avec celui-ci.

58
19 нояб. Réponse donnée par Paul Betts le 19 nov. 2009-11-19 19:39 '09 à 19:39 2009-11-19 19:39

Comme avec beaucoup d'autres réponses, vous pouvez utiliser git reset

MAIS:

J'ai trouvé ce merveilleux message qui ajoute en fait une commande (bien, alias) de git unadd pour git unadd : voir git unadd pour plus de détails ou ..

Juste

 git config --global alias.unadd "reset HEAD" 

Maintenant vous pouvez

 git unadd foo.txt bar.txt 
54
01 окт. la réponse est donnée par electblake 01 oct. 2010-10-01 17:54 '10 à 17:54 2010-10-01 17:54

git remove ou git rm peut être utilisé pour cela avec le drapeau --cached . Essayez:

 git help rm 
45
08 дек. la réponse est donnée par gnud 08 déc. 2008-12-08 01:00 '08 à 1:00 2008-12-08 01:00

Utilisez git add -i pour supprimer les fichiers que vous venez d'ajouter à votre prochain commit. Exemple:

Ajouter un fichier dont vous n’avez pas besoin:

 $ git add foo $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: foo # # Untracked files: # (use "git add <file>..." to include in what will be committed) # [...]# 

Activez l'ajout interactif pour annuler votre ajout (commandes saisies ici: "r" (retour), "1" (la première entrée de la liste retournera), "retour" pour quitter le mode retour et "q" (quitter):

 $ git add -i staged unstaged path 1: +1/-0 nothing foo *** Commands *** 1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked 5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp What now> r staged unstaged path 1: +1/-0 nothing [f]oo Revert>> 1 staged unstaged path * 1: +1/-0 nothing [f]oo Revert>> note: foo is untracked now. reverted one path *** Commands *** 1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked 5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp What now> q Bye. $ 

Qu'est ce que c'est! Voici votre preuve montrant que "foo" retourne à la liste sans laisser de trace:

 $ git status # On branch master # Untracked files: # (use "git add <file>..." to include in what will be committed) # [...] # foo nothing added to commit but untracked files present (use "git add" to track) $ 
41
18 апр. Réponse donnée par Alex North-Keys le 18 avril 2012-04-18 15:53 '12 à 15h53 2012-04-18 15:53

Ici, vous pouvez éviter ce problème désagréable lors du lancement d'un nouveau projet:

  • Créez un répertoire de base pour votre nouveau projet.
  • Exécutez git init .
  • Créez maintenant un fichier .gitignore (même s'il est vide).
  • Corrigez le fichier .gitignore.

Git rend très difficile la git reset Git si vous n'avez pas de commits. Si vous créez un petit commit initial juste pour le plaisir de le faire, vous pouvez alors git add -A et git reset autant de fois que vous le souhaitez, pour que tout soit correct.

Un autre avantage de cette méthode est que si vous rencontrez des problèmes d’achèvement de la ligne plus tard et que vous devez mettre à jour tous vos fichiers, c’est simple:

  • Notez que le correctif initial. Cela supprimera tous vos fichiers.
  • Puis vérifiez à nouveau votre dernier commit. Cela restaurera les nouvelles copies de vos fichiers en utilisant les paramètres de fin de ligne actuels.
36
25 сент. la réponse est donnée par Ryan Lundy, 25 sep. 2011-09-25 02:34 '11 à 2:34 le 2011-09-25 02:34

Peut-être que Git a évolué depuis que vous avez posté votre question.

 $> git --version git version 1.6.2.1 

Maintenant, vous pouvez essayer:

 git reset HEAD . 

Ce doit être ce que vous recherchez.

32
19 нояб. La réponse est donnée par Kokotte23 le 19 novembre. 2009-11-19 19:38 '09 à 19:38 2009-11-19 19:38

Notez que si vous n'avez pas spécifié de révision, vous devez inclure un séparateur. Un exemple de ma console:

 git reset <path_to_file> fatal: ambiguous argument '<path_to_file>': unknown revision or path not in the working tree. Use '--' to separate paths from revisions git reset -- <path_to_file> Unstaged changes after reset: M <path_to_file> 

(version git 1.7.5.4)

32
23 янв. la réponse est donnée powlo 23 janvier . 2012-01-23 19:57 '12 à 19:57 2012-01-23 19:57

Pour supprimer les nouveaux fichiers de la zone de transfert (et uniquement dans le cas d'un nouveau fichier), comme suggéré ci-dessus:

 git rm --cached FILE 

Utilisez rm --cached uniquement pour les nouveaux fichiers ajoutés par inadvertance.

29
22 июня '09 в 14:58 2009-06-22 14:58 la réponse est donnée à Ran le 22 juin 09 à 14:58 2009-06-22 14:58

Pour réinitialiser chaque fichier d'un dossier spécifique (et de ses sous-dossiers), vous pouvez utiliser la commande suivante:

 git reset * 
23
26 июля '12 в 10:50 2012-07-26 10:50 la réponse est donnée à Zorayr le 26 juillet 2012 à 10:50 2012-07-26 10:50

utilisez la commande * pour traiter plusieurs fichiers à la fois

 git reset HEAD *.prj git reset HEAD *.bmp git reset HEAD *gdb* 

et ainsi de suite

23
28 авг. boulder_ruby est la réponse le 28 août. 2013-08-28 00:15 '13 à 0:15 2013-08-28 00:15

Il suffit de taper git reset , il reviendra, et il semblerait que vous n'ayez jamais entré git add . depuis le dernier commit. Assurez-vous de le faire avant.

21
19 мая '10 в 6:49 2010-05-19 06:49 La réponse est donnée par Donovan le 19 mai '10 à 6:49 2010-05-19 06:49

Supposons que je crée un nouveau fichier newFile.txt .

2019

04 окт. la réponse est donnée par Vidura Mudalige le 04 oct. 2016-10-04 14:02 '16 à 14:02 2016-10-04 14:02

Pour un fichier spécifique:

  • git reset my_file.txt
  • git checkout mon_fichier.txt

Pour tous les fichiers ajoutés:

  • git reset
  • Git checkout.

Remarque: checkout modifie le code dans les fichiers et passe au dernier état mis à jour (confirmé). réinitialiser ne change pas les codes; il laisse simplement tomber le titre.

15
28 окт. la réponse est donnée par Hasib Kamal le 28 octobre. 2017-10-28 09:03 '17 à 9:03 2017-10-28 09:03

Cette commande modifie vos modifications:

 git reset HEAD filename.txt 

Vous pouvez aussi utiliser

 git add -p 

ajouter des parties de fichiers.

12
31 янв. La réponse est donnée à wallerjake le 31 janvier 2013-01-31 18:43 '13 à 18:43 2013-01-31 18:43

Je suis surpris que personne ne mentionne le mode interactif:

 git add -i 

Sélectionnez l'option 3 pour ajouter des fichiers. Dans mon cas, je souhaite souvent ajouter plusieurs fichiers; en ligne, vous pouvez utiliser ces numéros pour ajouter des fichiers. Il ne faut que 4: 1,2,3,5

Pour sélectionner une séquence, entrez simplement 1-5 pour tout prendre de 1 à 5.

Fichiers intermédiaires Git

12
22 окт. Répondre à Jonathan le 22 octobre. 2015-10-22 16:03 '15 à 16:03 2015-10-22 16:03

Pour annuler git add use

git reset filename

12
02 окт. réponse donnée par Anirudh Sood 02 oct. 2016-10-02 18:54 '16 à 18:54 2016-10-02 18:54

git add myfile.txt # cela ajoutera votre fichier à la liste de git add myfile.txt

Contrairement à cette commande,

 git reset HEAD myfile.txt # this will undo it. 

Donc, vous serez dans l'état précédent. le spécifié sera à nouveau dans la liste sans trace (état précédent).

Il réinitialisera la tête avec le fichier spécifié. donc si votre tête n'a pas cela, il suffit de la réinitialiser

8
27 июня '17 в 16:58 2017-06-27 16:58 La réponse est donnée par Mohideen ibn Mohammed le 27 juin 17 à 16:58 2017-06-27 16:58
 git reset filename.txt 

Supprime le fichier nommé filename.txt de l'index actuel, la zone "sur le point d'être validé", sans rien changer.

8
11 июля '16 в 21:40 2016-07-11 21:40 La réponse est donnée par Rahul Sinha le 11 juillet 2016 à 21:40. 2016-07-11 21:40

Dans SourceTree, vous pouvez facilement le faire via une interface graphique. Vous pouvez vérifier quelle commande sourcetree utilise pour désactiver le fichier.

J'ai créé un nouveau fichier et l'a ajouté à git. Puis je l’ai éteint avec guit SourceTree. Voici le résultat:

Décompression des fichiers [08/12/15 10:43]
git -c diff. mnemonicprefix = false -c core. quotepath = false -c informations d'identification. helper = sourcetree reset -q - chemin /to/fichier/nomfichier.java

SourceTree utilise reset pour désactiver les nouveaux fichiers.

7
08 дек. la réponse est donnée par miva2 08 déc. 2015-12-08 12:58 '15 à 12:58 2015-12-08 12:58
 git reset filename.txt 

Supprime le fichier nommé filename.txt de l'index actuel, la zone "sur le point d'être validé", sans rien changer.

6
26 окт. Réponse donnée par Joseph Mathew le 26 octobre 2017-10-26 21:15 '17 à 21:15 2017-10-26 21:15
  • 1
  • 2

Autres questions sur labels ou Poser une question