Comment annuler 'git add' avant de valider?

8968

J'ai par erreur ajouté des fichiers à Git en utilisant la commande:

git add myfile.txt

Je n'ai pas encore couru git commit. Existe-t-il un moyen d'annuler cela, afin que ces fichiers ne soient pas inclus dans la validation?

paxos1977
la source
23
À partir de Git v1.8.4, toutes les réponses ci-dessous utilisent HEADou headpeuvent désormais être utilisées @à la place HEAD. Voir cette réponse (dernière section) pour savoir pourquoi vous pouvez le faire.
3
J'ai fait un petit résumé qui montre toutes les façons de décompresser un fichier: stackoverflow.com/questions/6919121/…
Daniel Alder
5
Pourquoi ne pas git checkout?
Erik Reppen
13
@ErikReppen git checkoutne supprime pas les modifications intermédiaires de l'index de validation. Il annule uniquement les modifications non échelonnées de la dernière révision validée - qui, soit dit en passant, n'est pas non plus ce que je veux, je veux ces modifications, je les veux juste dans un commit ultérieur.
paxos1977
4
Si vous utilisez Eclipse, c'est aussi simple que de décocher les fichiers dans la boîte de dialogue de validation
Hamzahfrq

Réponses:

10375

Vous pouvez annuler git addavant de valider avec

git reset <file>

ce qui le supprimera de l'index en cours (la liste "sur le point d'être validé") sans rien changer d'autre.

Vous pouvez utiliser

git reset

sans aucun nom de fichier pour annuler toutes les modifications dues. Cela peut être utile lorsqu'il y a trop de fichiers pour être 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 HEADrespectivement, et échoueront si HEADelles ne sont pas définies (parce que vous n'avez encore effectué aucune validation dans votre référentiel) ou ambiguë (parce que vous avez créé une branche appelée HEAD, ce qui est stupide) que vous ne devriez pas faire). Cela a été changé dans Git 1.8.2 , cependant, donc dans les versions modernes de Git, vous pouvez utiliser les commandes ci-dessus avant même de faire votre premier commit:

"git reset" (sans options ni paramètres) utilisé pour l'erreur lorsque vous n'avez aucun commit dans votre historique, mais il vous donne maintenant un index vide (pour correspondre à un commit inexistant sur lequel vous n'êtes même pas).

genehack
la source
93
Bien sûr, ce n'est pas une véritable annulation, car si le mauvais git addécrase une version précédente non validée, nous ne pouvons pas la récupérer. J'ai essayé de clarifier cela dans ma réponse ci-dessous.
leonbloy
7
git reset HEAD *.extextse trouvent les fichiers de l'extension donnée que vous souhaitez supprimer. Pour moi, c'était *.bmp&*.zip
boulder_ruby
19
@Jonny, l'index (alias zone de transit) contient tous les fichiers, pas seulement les fichiers modifiés. Il "démarre la vie" (lorsque vous extrayez un commit ou clonez un dépôt) comme une copie de tous les fichiers du commit pointés par HEAD. Donc, si vous supprimez un fichier de l'index ( git rm --cached), cela signifie que vous vous préparez à effectuer une validation qui supprime ce fichier. git reset HEAD <filename>d'autre part, copiera le fichier de HEAD dans l'index, de sorte que la prochaine validation n'affichera aucune modification apportée à ce fichier.
Wildcard
11
Je viens de découvrir qu'il y en a un git reset -pcomme git add -p. C'est génial!
donquixote
10
Vous pouvez réellement récupérer des modifications écrasées précédemment mais non validées, mais pas de manière conviviale et non sécurisée à 100% (du moins, je n'en avais pas trouvé): goto .git / objects, recherchez les fichiers créés au moment où git addvous souhaitez les récupérer ( 61/3AF3...- > objet id 613AF3...), alors git cat-file -p <object-id>(ça vaut peut-être la peine de récupérer plusieurs heures de travail mais aussi une leçon à engager plus souvent ...)
Peter Schneider
2152

Tu veux:

git rm --cached <added_file_to_undo>

Raisonnement:

Quand j'étais nouveau dans ce domaine, j'ai d'abord essayé

git reset .

(pour annuler l'intégralité de mon ajout initial), uniquement pour obtenir ce message (pas si) utile:

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

Il s'avère que c'est parce que la référence 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, comme le mien, était quelque chose comme:

  1. cd dans mon super nouveau répertoire de projet pour essayer Git, la nouvelle hotness
  2. git init
  3. git add .
  4. git status

    ... beaucoup de parchemins de merde par ...

    => Merde, je ne voulais pas ajouter tout ça.

  5. google "annuler git ajouter"

    => trouver Stack Overflow - yay

  6. git reset .

    => fatal: échec de la résolution de 'HEAD' en tant que référence valide.

Il s'avère en outre qu'il y a un bogue enregistré contre l'inefficacité de cela dans la liste de diffusion.

Et que la bonne solution était juste là dans la sortie d'état Git (que, oui, j'ai glissée comme «merde)

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

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

Notez les avertissements ailleurs ici - git rmsupprime 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 annuler la mise en scène et supprimer des chemins uniquement de l'index. Les fichiers d'arborescence de travail, modifiés ou non, seront conservés.

Je passe à utiliser

git rm --cached .

pour tout supprimer et recommencer. Cela n'a pas fonctionné cependant, car bien que add .récursif, il s'avère rmnécessaire -rde rechuter. Soupir.

git rm -r --cached .

Bon, maintenant je suis de retour à l'endroit où j'ai commencé. La prochaine fois, je vais utiliser -npour faire un essai à sec et voir ce qui sera ajouté:

git add -n .

J'ai tout zippé dans un endroit sûr avant de faire confiance git help rmà --cachedne rien détruire (et si je l'ai mal orthographié).

Rhubarbe
la source
15
Hah. J'ai suivi ce même processus. Sauf que j'ai abandonné et dit rm -rf .git, git initparce que je n'avais pas confiance git rm --cachedpour garder ma copie de travail. Cela en dit un peu plus sur la complexité de git à certains endroits. git unstagedevrait juste être une commande standard de stock, je ne me soucie pas si je peux l'ajouter comme alias.
Adrian Macneil
5
Pour moi, git ditgit reset HEAD <File>...
drahnr
16
git rm --cached <file> est en fait la bonne réponse, s'il s'agit de l'importation initiale de <file> dans le référentiel. Si vous essayez de supprimer une modification du fichier, git reset est la bonne réponse. Les gens qui disent que cette réponse est mauvaise pensent à une question différente.
Barry Kelly
14
Cela fonctionnera en fait, mais uniquement lors du premier commit, où le fichier n'existait pas auparavant, ou lorsque la git addcommande a ajouté de nouveaux fichiers, mais pas de modifications aux fichiers existants.
naught101
4
ne fait que montrer à quel point Git n'est pas intuitif et alambiqué. au lieu d'avoir des commandes "d'annulation" parallèles, vous devez trouver comment les annuler. Comme essayer de libérer votre jambe dans du sable rapide, puis de bloquer votre bras, puis de bloquer votre autre bras ... chaque commande doit être effectuée via l'interface graphique, avec des éléments de menus déroulants pour les options ... Pensez à toute l'interface utilisateur, les gains de productivité que nous avons eu, mais nous avons ce gâchis d'une interface de ligne de commande rétro. Ce n'est pas comme si les programmes git GUI rendaient cela plus intuitif.
ahnbizcad
533

Si vous tapez:

git status

Git vous dira ce qui est mis en scène, etc., y compris des instructions sur la façon de mettre en scène:

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

Je trouve que Git fait un très bon travail en me poussant à faire ce qu'il faut dans des situations comme celle-ci.

Remarque: les versions récentes de Git (1.8.4.x) ont changé ce message:

(use "git rm --cached <file>..." to unstage)
Paul Beckingham
la source
20
Le message sera différent selon que le addfichier ed était déjà suivi (le addseul a enregistré une nouvelle version dans le cache - ici, il affichera votre message). Ailleurs, si le fichier n'a pas été précédemment mis en scène, il s'afficherause "git rm --cached <file>..." to unstage
leonbloy
Génial! Celui- git reset HEAD <file>ci est le seul qui fonctionnera au cas où vous voudriez supprimer une suppression de fichier
skerit
2
Ma version git 2.14.3 dit de git reset HEADmettre en scène.
SilverWolf
246

Pour clarifier: git adddéplace les modifications du répertoire de travail actuel vers la zone de transfert (index).

Ce processus est appelé mise en scène . La commande la plus naturelle pour mettre en scène les modifications (fichiers modifiés) est donc la plus évidente:

git stage

git add est juste un alias plus facile à taper pour git stage

Dommage qu'il n'y ait git unstagepas de git unaddcommandes ni . La question pertinente 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 commandes:

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

Personnellement, j'utilise des alias encore plus courts:

git a # For staging
git u # For unstaging
takhin
la source
4
"se déplace"? Cela indiquerait qu'il est parti du répertoire de travail. Ce n'est pas le cas.
Thomas Weller
4
Pourquoi est-ce évident?
Lenar Hoyt
En fait, git stagec'est l'alias de git add, qui est la commande historique, à la fois sur Git et sur d'autres SCM. Il a été ajouté en décembre 2008 avec commit 11920d28da dans le "Git's git repository", si je peux dire.
Obsidian
1
Cela pourrait ne pas être lié, mais j'ai trouvé que valider le fichier avant même d'ajouter était une idée utile, quelque chose comme check-command filename && git add filename, j'ai remplacé git par un g plus court sur ma machine, et jusqu'à présent, cela a fonctionné ok pour moi: github.com/dataf3l/g , je ne sais pas si cela sera utile à quelqu'un, mais je le mettrai ici dans l'espoir que cela économise du temps à certaines personnes.
Felipe Valdes
167

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 avec ' git reset', il semble toujours occuper de l'espace dans le .gitrépertoire.

Ce n'est rien à craindre; le fichier est en effet toujours dans le référentiel, mais uniquement comme un "objet lâche". Il ne sera pas copié dans d'autres référentiels (via clone, push), et l'espace sera finalement récupéré - mais peut-être pas très bientôt. Si vous êtes anxieux, vous pouvez exécuter:

git gc --prune=now

Mise à jour (ce qui suit est ma tentative de dissiper une certaine confusion qui peut résulter des réponses les plus votées):

Alors, qui est le véritable undo de git add?

git reset HEAD <file> ?

ou

git rm --cached <file>?

À proprement parler, et si je ne me trompe pas: aucun .

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

Rappelons d'abord ce que git add <file>fait réellement:

  1. S'il <file>n'a pas été suivi auparavant , l' git add ajoute au cache , avec son contenu actuel.

  2. Si <file>a déjà été suivi , git add enregistre le contenu actuel (instantané, version) dans le cache. Dans Git, cette action est toujours appelée add , (pas simplement la mettre à jour ), car deux versions différentes (instantanés) d'un fichier sont considérées comme deux éléments différents: par conséquent, nous ajoutons effectivement un nouvel élément au cache, pour être finalement commis plus tard.

À la lumière de cela, la question est légèrement ambiguë:

J'ai par erreur ajouté des fichiers en utilisant la commande ...

Le scénario de l'OP semble être le premier (fichier non suivi), nous voulons que le "défaire" supprime le fichier (pas seulement le contenu actuel) des éléments suivis. Si tel est le cas, vous pouvez exécuter git rm --cached <file>.

Et nous pourrions également courir git reset HEAD <file>. C'est généralement préférable, car cela fonctionne dans les deux scénarios: il effectue également l'annulation lorsque nous avons ajouté à tort 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 scénario dans lequel git reset HEADcela ne fonctionne pas, mais git rm --cachedfonctionne: un nouveau référentiel (pas de commit). Mais, vraiment, c'est un cas pratiquement hors de propos.

Deuxièmement: sachez que git reset HEAD vous ne pouvez pas récupérer par magie le contenu du fichier précédemment mis en cache, il le resynchronise simplement à partir de HEAD. Si notre erreur a git addremplacé une version précédente non validée par étapes, nous ne pouvons pas la récupérer. C'est pourquoi, à 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 irrevocably lost "version 2"
-version 1
+version 3

Bien sûr, ce n'est pas très critique si nous suivons simplement le flux de travail paresseux habituel de faire `` git add '' uniquement pour ajouter de nouveaux fichiers (cas 1), et nous mettons à jour le nouveau contenu via la git commit -acommande commit , .


* (Edit: ce qui précède est pratiquement correct, mais il peut toujours y avoir des moyens légèrement hack / alambiqués pour récupérer des modifications qui ont été mises en scène, mais non validées puis écrasées - voir les commentaires de Johannes Matokic et iolsmit)

leonbloy
la source
4
À strictement parler, il existe un moyen de récupérer un fichier déjà mis en scène qui a été remplacé par git add. Comme vous le mentionnez, git add crée un objet git pour ce fichier qui deviendra un objet lâche non seulement lors de la suppression complète du fichier, mais également lors de son remplacement par du nouveau contenu. Mais il n'y a aucune commande pour le récupérer automatiquement. Au lieu de cela, le fichier doit être identifié et extrait manuellement ou avec des outils écrits uniquement pour ce cas (libgit2 le permettra). Mais cela ne paiera que si le fichier est très important et volumineux et ne peut pas être reconstruit en modifiant la version précédente.
Johannes Matokic
2
Pour me corriger: Une fois que le fichier objet lâche est trouvé (utiliser des métadonnées comme la date / heure de création) git cat-filepourrait être utilisé pour récupérer son contenu.
Johannes Matokic
2
Une autre façon de récupérer les modifications qui ont été mises en place mais non validées puis écrasées par exemple par une autre git addest via git fsck --unreachablequi listera tous les obj inaccessibles, que vous pouvez ensuite inspecter par git show SHA-1_IDou git fsck --lost-foundqui> Ecrit les objets pendant dans .git/lost-found/commit/ou .git/lost-found/other/, selon le type. Voir aussigit fsck --help
iolsmit
111

Annuler un fichier qui a déjà été ajouté est assez simple avec Git. Pour réinitialiser myfile.txt, qui ont déjà été ajoutés, utilisez:

git reset HEAD myfile.txt

Explication:

Après avoir organisé les fichiers indésirables, vous pouvez annuler git reset. Headest la tête de votre fichier dans le local et le dernier paramètre est le nom de votre fichier.

J'ai créé les étapes dans l'image ci-dessous pour plus de détails pour vous, y compris toutes les étapes qui peuvent se produire dans ces cas:

git réinitialiser le fichier HEAD

Alireza
la source
Image: "La commande ajoute ...""La commande ajoute ..." ( présent simple, troisième personne )
Peter Mortensen
Image: veuxvouloir (il n'est pas nécessaire d'utiliser l'argot ici)
Peter Mortensen
93
git rm --cached . -r

"supprimera" tout ce que vous avez ajouté de votre répertoire actuel de manière récursive

braitsch
la source
3
Je ne cherchais pas à tout supprimer, juste UN fichier spécifique.
paxos1977
3
Également utile si vous n'avez effectué aucun commit antérieur. En l'absence de validation précédente, git reset HEAD <file>diraitfatal: Failed to resolve 'HEAD' as a valid ref.
Priya Ranjan Singh
6
Non, cela ajoute un suppression de tout dans votre répertoire actuel. Très différent des changements de simple mise en scène.
Mark Amery
89

Courir

git gui

et supprimez tous les fichiers manuellement ou en les sélectionnant tous et en cliquant sur le bouton « Unstage from commit» .

Khaja Minhajuddin
la source
1
Oui je comprends ça. Je voulais seulement suggérer implicitement que vous indiquez que sur votre réponse comme "Vous pouvez utiliser git-gui...." :)
Alexander Suraphel
1
Il dit, "git-gui: commande introuvable". Je ne sais pas si cela fonctionne.
Parinda Rajapaksha
Wow, c'est beaucoup plus simple que de faire des lignes de commande que vous ne comprenez pas. C'est définitivement recommandé pour un débutant comme moi. Merci d'avoir écrit ça!
Irfandy Jip
Merci. Je ne voulais pas le risquer, j'ai donc dû utiliser l'interface graphique.
Sagar Khatri
84

Git a des commandes pour chaque action imaginable, mais il a besoin de connaissances approfondies pour bien faire les choses et à cause de cela, il est contre-intuitif au mieux ...

Ce que vous avez fait auparavant:

  • Changé un fichier et utilisé git add ., ou git add <file>.

Ce que tu veux:

  • Supprimez le fichier de l'index, mais conservez-le versionné et laissez les modifications non validées dans la copie de travail:

    git reset head <file>
    
  • Réinitialisez le fichier dans le dernier état de HEAD, annulant les modifications et les supprimant de l'index:

    # Think `svn revert <file>` IIRC.
    git reset HEAD <file>
    git checkout <file>
    
    # If you have a `<branch>` named like `<file>`, use:
    git checkout -- <file>

    Ceci est nécessaire car git reset --hard HEADne fonctionnera pas avec des fichiers uniques.

  • Supprimer <file>de l'index et du versionnage, en conservant le fichier non versionné avec des modifications dans la copie de travail:

    git rm --cached <file>
    
  • Supprimer <file>complètement de la copie de travail et du versioning:

    git rm <file>
    
sjas
la source
1
Je ne peux pas comprendre la différence entre 'git reset head <file>' et 'git rm --cached <file>. Pourriez-vous l'expliquer?
jeswang
6
Les fichiers @jeswang sont soit «connus» de git (les modifications y sont suivies), soit ils ne sont pas «versionnés». reset headannule vos modifications actuelles, mais le fichier est toujours surveillé par git. rm --cachedsupprime le fichier du versioning, donc git ne le vérifie plus pour les modifications (et supprime également les modifications actuelles éventuellement indexées, dites à git par le précédent add), mais le fichier modifié sera conservé dans votre copie de travail, c'est-à-dire dans votre dossier de fichiers sur le disque dur.
sjas
3
La différence est git reset HEAD <file>temporaire - la commande sera appliquée à la prochaine validation uniquement, mais git rm --cached <file>sera supprimée jusqu'à ce qu'elle soit à nouveau ajoutée avec git add <file>. En outre, des git rm --cached <file>moyens si vous appuyez sur cette branche à la télécommande, tout le monde en tirant la branche va obtenir le fichier EFFECTIVEMENT supprimé de leur dossier.
DrewT
81

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

  1. ajouter un nouveau fichier à la zone de transit, puis annuler avecgit rm --cached file .
  2. en ajoutant un fichier modifié à la zone de transit, puis annulez avec git reset HEAD file.

En cas de doute, utilisez

git reset HEAD file

Parce qu'il fait la chose attendue dans les deux cas.

Attention: si vous faites git rm --cached filesur un fichier qui a été modifié (un fichier qui existait auparavant dans le référentiel), alors le fichier sera supprimé surgit commit ! Il existera toujours dans votre système de fichiers, mais si quelqu'un d'autre tire votre commit, le fichier sera supprimé de leur arborescence de travail.

git statusvous dira si le fichier était un nouveau fichier 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
Michael_Scharf
la source
7
+1. Un nombre extraordinaire de réponses et de commentaires très positifs sur cette page sont tout simplement faux sur le comportement de git rm --cached somefile. J'espère que cette réponse fera son chemin jusqu'à une position de premier plan où elle peut protéger les débutants d'être induits en erreur par toutes les fausses allégations.
Mark Amery
l'une des meilleures réponses ici, malheureusement, elle est assez faible sur la liste
Creos
64

Si vous êtes sur votre commit initial et que vous ne pouvez pas l'utiliser git reset, déclarez simplement "Git faillite" et supprimez le .gitdossier et recommencez

Ana Betts
la source
5
Une astuce consiste à copier votre fichier .git / config si vous avez ajouté l'origine distante, avant de supprimer le dossier.
Tiago
4
Le commentaire de @ChrisJohnsen est parfait. Parfois, vous voulez valider tous les fichiers sauf un: git add -A && git rm --cached EXCLUDEFILE && git commit -m 'awesome commit' (Cela fonctionne également quand il n'y a pas de Failed to resolve 'HEAD'
57

Comme bon nombre des autres réponses, vous pouvez utiliser git reset

MAIS:

J'ai trouvé ce super petit post qui ajoute en fait la commande Git (enfin, un alias) pour git unadd: voir git unadd pour plus de détails ou ..

Simplement,

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

Maintenant vous pouvez

git unadd foo.txt bar.txt
electblake
la source
45

Utilisez git add -ipour supprimer les fichiers que vous venez d'ajouter de votre prochain commit. Exemple:

Ajout du fichier que vous ne vouliez pas:

$ 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)
# [...]#

Entrer dans l'ajout interactif pour annuler votre ajout (les commandes tapées à git ici sont "r" (revert), "1" (la première entrée de la liste affiche revert), 'return' pour abandonner le mode revert 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.
$

C'est ça! Voici votre preuve, montrant que "foo" est de retour sur la liste non suivie:

$ 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)
$
Alex North-Keys
la source
42

git removeou git rmpeut être utilisé pour cela, avec le --cacheddrapeau. Essayer:

git help rm
gnud
la source
9
Cela ne va-t-il pas supprimer complètement le fichier?
Willa
8
git rm --cached ...supprimera les fichiers d'un dépôt git. Ils existeront toujours sur votre ordinateur, mais cela est TRÈS différent de la suppression des modifications d'un fichier. Pour quiconque tombe sur ce point, ce n'est pas une réponse valable à la question.
Addison
38

Voici un moyen d'éviter ce problème vexant lorsque vous démarrez un nouveau projet:

  • Créez le répertoire principal de votre nouveau projet.
  • Courir git init .
  • Créez maintenant un fichier .gitignore (même s'il est vide).
  • Validez votre fichier .gitignore.

Git le rend vraiment difficile à faire git resetsi vous n'avez aucun commit. Si vous créez un minuscule commit initial juste pour le plaisir d'en avoir un, après cela, vous pouvez git add -Aet git resetautant 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 de fin de ligne plus tard et devez actualiser tous vos fichiers, c'est facile:

  • Découvrez ce commit initial. Cela supprimera tous vos fichiers.
  • Vérifiez à nouveau votre dernier commit. Cela récupérera de nouvelles copies de vos fichiers, en utilisant vos paramètres de fin de ligne actuels.
Ryan Lundy
la source
1
Confirmé! J'ai essayé une réinitialisation de git après un ajout de git. et git se plaignait de HEAD corrompu. En suivant vos conseils, je pourrais ajouter et réinitialiser d'avant en arrière sans problème :)
Kounavi
1
La deuxième partie fonctionne, mais elle est un peu maladroite. La façon dont les fins de ligne sont gérées dépend de la autocrlfvaleur ... Cela ne fonctionnera pas dans tous les projets, selon les paramètres.
sjas
1
Cette réponse était raisonnable au moment de sa publication, mais elle est désormais obsolète; git reset somefileet les git resetdeux fonctionnent avant de faire le premier commit, maintenant. Cela a été le cas depuis plusieurs versions de Git.
Mark Amery du
@MarkAmery, vous avez peut-être raison (ce serait cool si vous avez publié une source pour votre assertion), mais il est toujours utile de démarrer votre dépôt avec un ou deux commit (s) propre (s).
Ryan Lundy
34

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

$> git --version
git version 1.6.2.1

Maintenant, vous pouvez essayer:

git reset HEAD .

Cela devrait être ce que vous recherchez.

Kokotte23
la source
2
Bien sûr, mais vous avez ensuite la question de savoir comment ajouter un ou deux fichiers (ou plus) ajoutés. Le manuel "git reset" mentionne cependant que "git reset <paths>" est l'opposé de "git add <paths>", cependant.
Alex North-Keys
34

Notez que si vous ne spécifiez pas de révision, vous devez inclure un séparateur. 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>

(Git version 1.7.5.4)

powlo
la source
2
J'ai essayé git reset <path>et cela fonctionne très bien sans séparateur. J'utilise également git 1.9.0. Peut-être que cela ne fonctionne pas dans les anciennes versions?
31

Pour supprimer de nouveaux fichiers de la zone de transit (et uniquement en cas de nouveau fichier), comme suggéré ci-dessus:

git rm --cached FILE

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

Ran
la source
4
Gardez à l'esprit que --cachedc'est une partie vraiment importante ici.
takehin
1
-1; non, cela ne supprime pas le fichier, il supprime le fichier (sans le supprimer de votre arbre de travail).
Mark Amery du
25

Pour réinitialiser chaque fichier dans un dossier particulier (et ses sous-dossiers), vous pouvez utiliser la commande suivante:

git reset *
Zorayr
la source
4
En fait, cela ne réinitialise pas tous les fichiers car * utilise l'expansion du shell et ignore les fichiers de points (et les répertoires de points).
Luc
Vous pouvez exécuter git statuspour voir tout ce qui reste et le réinitialiser manuellement, par exemple git reset file.
Zorayr
25

Utilisez la *commande pour gérer plusieurs fichiers à la fois:

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

etc.

boulder_ruby
la source
3
Gardez à l'esprit que * n'inclura généralement pas de fichiers dot ou de «répertoires dot» sauf si vous spécifiez explicitement .*ou.*.prj
Luc
23

Il suffit de taper git resetpour revenir en arrière et c'est comme si vous n'aviez jamais tapé git add .depuis votre dernier commit. Assurez-vous que vous vous êtes déjà engagé.

Donovan
la source
En l'occurrence, il y a eu un dernier commit ... mais je demandais spécifiquement de supprimer un seul fichier du commit, pas tous les fichiers du commit.
paxos1977
20

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

Entrez la description de l'image ici

Supposons que j'ajoute le fichier accidentellement git add newFile.txt:

Entrez la description de l'image ici

Maintenant , je veux défaire ce module, avant de commettre, git reset newFile.txt:

Entrez la description de l'image ici

Vidura Mudalige
la source
Supposons que je sois au 1er pic, ce qui signifie que je n'ai même pas fait "git.add". De plus, je ne veux pas du tout tout ce changement. Je veux dire quand je fais le statut git, il ne devrait pas montrer de fichiers rouges. Je veux dire qu'il devrait être synchronisé comme s'il n'y avait pas un seul fichier modifié depuis la dernière poussée de git. comment y parvenir.
Incassable
Supposez donc que vous soyez juste à l'étape première. Et vous voulez vous débarrasser de toutes les modifications que vous avez apportées, ce qui fait que "newFile.txt" apparaît en rouge.
Incassable
Quand je fais le statut git. Je ne devrais voir aucun changement du tout. Tous les fichiers rouges doivent être rétablis.
Incassable
Salut, je pense que votre question est de savoir comment supprimer les fichiers non suivis de l'arborescence actuelle. Pour cela, vous pouvez utiliser "git clean -f -d". Cela supprimera également les répertoires non suivis.
Vidura Mudalige
Si vous ne souhaitez pas supprimer les fichiers non suivis, ignorez simplement l'indicateur "-f".
Vidura Mudalige
19

Pour un fichier spécifique:

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

Pour tous les fichiers ajoutés:

  • git reset.
  • git checkout.

Remarque: l' extraction modifie le code dans les fichiers et passe au dernier état mis à jour (validé). réinitialiser ne change pas les codes; il réinitialise simplement l'en-tête.

Hasib Kamal
la source
3
Veuillez expliquer la différence entre git reset <file>et git checkout <file>.
Trent
1
reset ne change pas le fichier, il suffit de le mettre à l'écart de la scène (= index, où il a été mis par git add)
franc
la caisse change les codes dans le fichier et passe au dernier état mis à jour. reset ne change pas les codes, il réinitialise juste l'en-tête. Par exemple, réinitialisez l'utilisation des fichiers ajoutés ou validés en les réinitialisant avant le push et utilisez-les pour revenir à la dernière étape mise à jour / validée avant l'ajout de git.
Hasib Kamal
1
reset = supprimer le fichier de l'étape mais les changements seront toujours là. checkout = obtient le fichier mis à jour du référentiel et remplacera le fichier actuel
Imam Bux
14

Cette commande décompose vos modifications:

git reset HEAD filename.txt

Vous pouvez aussi utiliser

git add -p 

pour ajouter des parties de fichiers.

wallerjake
la source
14

Il existe également un mode interactif:

git add -i

Choisissez l'option 3 pour annuler l'ajout de fichiers. Dans mon cas, je veux souvent ajouter plus d'un fichier, et avec le mode interactif, vous pouvez utiliser des chiffres comme celui-ci pour ajouter des fichiers. Cela prendra tout sauf 4: 1, 2, 3 et 5

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

Fichiers de transfert Git

Jonathan
la source
"Je suis surpris que personne ne mentionne le mode interactif" - ils l'ont fait: stackoverflow.com/a/10209776/1709587
Mark Amery
14

Pour annuler git add, utilisez:

git reset filename
Anirudh Sood
la source
10
git reset filename.txt

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

Rahul Sinha
la source
10

git add myfile.txt # Cela ajoutera votre fichier à la liste à valider

Tout à fait à l'opposé de cette commande,

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

vous serez donc dans l'état précédent. Spécifié sera à nouveau dans la liste non suivie (état précédent).

Il réinitialisera votre tête avec ce fichier spécifié. donc, si votre tête n'en a pas les moyens, il la réinitialisera simplement.

Mohideen bin Mohammed
la source
9

Dans Sourcetree, vous pouvez le faire facilement via l'interface graphique. Vous pouvez vérifier quelle commande Sourcetree utilise pour supprimer un fichier.

J'ai créé un nouveau fichier et l'ai ajouté à Git. Ensuite, je l'ai mis en scène en utilisant l'interface graphique de Sourcetree. Voici le résultat:

Suppression des fichiers [08/12/15 10:43] git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree reset -q - chemin / vers / fichier / nomfichier.java

Sourcetree utilise resetpour décompresser de nouveaux fichiers.

miva2
la source
Oui, la même technique peut être utilisée avec TortoiseGit , obtenant les commandes Git pour les cas d'utilisation courants.
Peter Mortensen
8
git reset filename.txt  

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

Joseph Mathew
la source
git reset [nom de fichier] ex: git reset src / main / java / com / dao / ImportCsvDataDaoImpl.java
Rohit Chaurasiya