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?
git
version-control
git-commit
git-stage
paxos1977
la source
la source
HEAD
ouhead
peuvent désormais être utilisées@
à la placeHEAD
. Voir cette réponse (dernière section) pour savoir pourquoi vous pouvez le faire.git checkout
ne 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.Réponses:
Vous pouvez annuler
git add
avant de valider avecce qui le supprimera de l'index en cours (la liste "sur le point d'être validé") sans rien changer d'autre.
Vous pouvez utiliser
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>
etgit reset HEAD
respectivement, et échoueront siHEAD
elles 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éeHEAD
, 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:la source
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.git reset HEAD *.ext
oùext
se trouvent les fichiers de l'extension donnée que vous souhaitez supprimer. Pour moi, c'était*.bmp
&*.zip
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.git reset -p
commegit add -p
. C'est génial!git add
vous souhaitez les récupérer (61/3AF3...
- > objet id613AF3...
), alorsgit 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 ...)Tu veux:
Raisonnement:
Quand j'étais nouveau dans ce domaine, j'ai d'abord essayé
(pour annuler l'intégralité de mon ajout initial), uniquement pour obtenir ce message (pas si) utile:
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:
git init
git add .
git status
... beaucoup de parchemins de merde par ...
=> Merde, je ne voulais pas ajouter tout ça.
google "annuler git ajouter"
=> trouver Stack Overflow - yay
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)
Et la solution est en effet d'utiliser
git rm --cached FILE
.Notez les avertissements ailleurs ici -
git rm
supprime votre copie de travail locale du fichier, mais pas si vous utilisez --cached . Voici le résultat degit help rm
:Je passe à utiliser
pour tout supprimer et recommencer. Cela n'a pas fonctionné cependant, car bien que
add .
récursif, il s'avèrerm
nécessaire-r
de rechuter. Soupir.Bon, maintenant je suis de retour à l'endroit où j'ai commencé. La prochaine fois, je vais utiliser
-n
pour faire un essai à sec et voir ce qui sera ajouté:J'ai tout zippé dans un endroit sûr avant de faire confiance
git help rm
à--cached
ne rien détruire (et si je l'ai mal orthographié).la source
rm -rf .git
,git init
parce que je n'avais pas confiancegit rm --cached
pour garder ma copie de travail. Cela en dit un peu plus sur la complexité de git à certains endroits.git unstage
devrait juste être une commande standard de stock, je ne me soucie pas si je peux l'ajouter comme alias.git reset HEAD <File>...
git add
commande a ajouté de nouveaux fichiers, mais pas de modifications aux fichiers existants.Si vous tapez:
Git vous dira ce qui est mis en scène, etc., y compris des instructions sur la façon de mettre en scène:
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:
la source
add
fichier ed était déjà suivi (leadd
seul 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
git reset HEAD <file>
ci est le seul qui fonctionnera au cas où vous voudriez supprimer une suppression de fichiergit reset HEAD
mettre en scène.Pour clarifier:
git add
dé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 add
est juste un alias plus facile à taper pourgit stage
Dommage qu'il n'y ait
git unstage
pas degit unadd
commandes ni . La question pertinente est plus difficile à deviner ou à retenir, mais elle est assez évidente:Nous pouvons facilement créer un alias pour cela:
Et enfin, nous avons de nouvelles commandes:
Personnellement, j'utilise des alias encore plus courts:
la source
git stage
c'est l'alias degit 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.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.git
ré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:
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:S'il
<file>
n'a pas été suivi auparavant , l'git add
ajoute au cache , avec son contenu actuel.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ë:
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 HEAD
cela ne fonctionne pas, maisgit rm --cached
fonctionne: 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 agit add
remplacé 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:
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 -a
commande 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)
la source
git cat-file
pourrait être utilisé pour récupérer son contenu.git add
est viagit fsck --unreachable
qui listera tous les obj inaccessibles, que vous pouvez ensuite inspecter pargit show SHA-1_ID
ougit fsck --lost-found
qui> Ecrit les objets pendant dans.git/lost-found/commit/
ou.git/lost-found/other/
, selon le type. Voir aussigit fsck --help
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:Explication:
Après avoir organisé les fichiers indésirables, vous pouvez annuler
git reset
.Head
est 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:
la source
"supprimera" tout ce que vous avez ajouté de votre répertoire actuel de manière récursive
la source
git reset HEAD <file>
diraitfatal: Failed to resolve 'HEAD' as a valid ref.
Courir
et supprimez tous les fichiers manuellement ou en les sélectionnant tous et en cliquant sur le bouton « Unstage from commit» .
la source
git-gui
...." :)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:
git add .
, ougit 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:
Réinitialisez le fichier dans le dernier état de HEAD, annulant les modifications et les supprimant de l'index:
Ceci est nécessaire car
git reset --hard HEAD
ne 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:Supprimer
<file>
complètement de la copie de travail et du versioning:la source
reset head
annule vos modifications actuelles, mais le fichier est toujours surveillé par git.rm --cached
supprime 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édentadd
), mais le fichier modifié sera conservé dans votre copie de travail, c'est-à-dire dans votre dossier de fichiers sur le disque dur.git reset HEAD <file>
temporaire - la commande sera appliquée à la prochaine validation uniquement, maisgit rm --cached <file>
sera supprimée jusqu'à ce qu'elle soit à nouveau ajoutée avecgit add <file>
. En outre, desgit 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.La question n'est pas clairement posée. La raison en est que cela
git add
a deux significations:git rm --cached file
.git reset HEAD file
.En cas de doute, utilisez
Parce qu'il fait la chose attendue dans les deux cas.
Attention: si vous faites
git rm --cached file
sur 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 status
vous dira si le fichier était un nouveau fichier ou modifié :la source
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.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.git
dossier et recommencezla source
git add -A && git rm --cached EXCLUDEFILE && git commit -m 'awesome commit'
(Cela fonctionne également quand il n'y a pas deFailed to resolve 'HEAD'
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,
Maintenant vous pouvez
la source
Utilisez
git add -i
pour supprimer les fichiers que vous venez d'ajouter de votre prochain commit. Exemple:Ajout du fichier que vous ne vouliez pas:
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):
C'est ça! Voici votre preuve, montrant que "foo" est de retour sur la liste non suivie:
la source
git remove
ougit rm
peut être utilisé pour cela, avec le--cached
drapeau. Essayer:la source
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.Voici un moyen d'éviter ce problème vexant lorsque vous démarrez un nouveau projet:
git init
.Git le rend vraiment difficile à faire
git reset
si 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 pouvezgit add -A
etgit 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 de fin de ligne plus tard et devez actualiser tous vos fichiers, c'est facile:
la source
autocrlf
valeur ... Cela ne fonctionnera pas dans tous les projets, selon les paramètres.git reset somefile
et lesgit reset
deux fonctionnent avant de faire le premier commit, maintenant. Cela a été le cas depuis plusieurs versions de Git.Peut-être que Git a évolué depuis que vous avez posé votre question.
Maintenant, vous pouvez essayer:
Cela devrait être ce que vous recherchez.
la source
Notez que si vous ne spécifiez pas de révision, vous devez inclure un séparateur. Exemple de ma console:
(Git version 1.7.5.4)
la source
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?Pour supprimer de nouveaux fichiers de la zone de transit (et uniquement en cas de nouveau fichier), comme suggéré ci-dessus:
Utilisez rm --cached uniquement pour les nouveaux fichiers ajoutés accidentellement.
la source
--cached
c'est une partie vraiment importante ici.Pour réinitialiser chaque fichier dans un dossier particulier (et ses sous-dossiers), vous pouvez utiliser la commande suivante:
la source
git status
pour voir tout ce qui reste et le réinitialiser manuellement, par exemplegit reset file
.Utilisez la
*
commande pour gérer plusieurs fichiers à la fois:etc.
la source
.*
ou.*.prj
Il suffit de taper
git reset
pour 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é.la source
Supposons que je crée un nouveau fichier
newFile.txt
:Supposons que j'ajoute le fichier accidentellement
git add newFile.txt
:Maintenant , je veux défaire ce module, avant de commettre,
git reset newFile.txt
:la source
Pour un fichier spécifique:
Pour tous les fichiers ajoutés:
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.
la source
git reset <file>
etgit checkout <file>
.Cette commande décompose vos modifications:
Vous pouvez aussi utiliser
pour ajouter des parties de fichiers.
la source
Il existe également un mode interactif:
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
la source
Pour annuler
git add
, utilisez:la source
Supprime un fichier nommé filename.txt de l'index en cours, la zone "sur le point d'être validé", sans rien changer d'autre.
la source
git add myfile.txt
# Cela ajoutera votre fichier à la liste à validerTout à fait à l'opposé de cette commande,
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.
la source
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:
Sourcetree utilise
reset
pour décompresser de nouveaux fichiers.la source
la source