Comment unstage grand nombre de fichiers sans supprimer le contenu
Par accident, j'ai ajouté un grand nombre de fichiers temporaires à l'aide de git add -A
J'ai réussi à unstage les fichiers en utilisant les commandes suivantes et réussi à enlever le sale index.
git ls-files -z | xargs -0 rm -f
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
Les commandes ci-dessus sont répertoriés dans le git help rm
. Mais malheureusement, mes fichiers ont été supprimés lors de l'exécution, même si j'avais donné l'option de cache. Comment puis-je effacer l'index sans en perdre le contenu?
Également qu'il serait utile si quelqu'un peut expliquer la manière dont cette pipe fonctionnement.
rm -f
n'est pas une commande git et ne pas avoir un--cached
option. Vos fichiers locaux ont été supprimés avant que vous n'exécutiezgit rm
donc je ne pense pas que vous pouvez légitimement blâmergit rm
pour quoi que ce soit.- veuillez envisager de modifier la réponse correcte à la très upvoted réponse de Ian Maddox, comme le
git reset --hard
est ce n'est pas la bonne réponse et en fait de supprimer le contenu. Cela va induire les utilisateurs en erreur - comme il l'a fait de moi. - comme Marco dit, aller sur. Cette page reçoit beaucoup de trafic.
- Ross merci les gars. Fait.
Vous devez vous connecter pour publier un commentaire.
git reset
Si vous souhaitez annuler un excès de zèle des "git add" run:
Vos modifications seront unstaged et prêt pour vous de l'ajouter à nouveau comme vous s'il vous plaît.
NE PAS EXÉCUTER
git reset --hard
.Il ne sera pas seulement unstage vos fichiers ajoutés, mais restaurera toutes les modifications que vous faites dans votre répertoire de travail. Si vous avez créé de nouveaux fichiers dans le répertoire de travail, il ne les supprimer si.
git checkout -- *
ainsiSi vous avez une vierge repo (ou la TÊTE n'est pas défini)[1] vous pouvez simplement
Bien sûr, cela va vous obliger à re-ajoutez les fichiers que vous ne souhaitez être ajouté.
[1] Note (comme expliqué dans les commentaires) ce serait généralement se produire uniquement lorsque l'opération est tout nouveau ("vierge") ou si aucune livraison n'ait été faite. Plus techniquement, chaque fois qu'il n'y a pas de contrôle ou de travail de l'arbre.
Vient de rendre cela plus clair 🙂
git add .
a tendance à me surprendre à la quantité de fichiers I ne pas à ajouter 🙂 Dans cette très spécifiques, cas, je voudrais en effet que nuke l'index.Utilisation
git reset HEAD
pour réinitialiser l'index sans la suppression de fichiers. (Si vous ne souhaitez réinitialiser un fichier particulier dans l'index, vous pouvez utilisergit reset HEAD -- /path/to/file
de le faire).La conduite de l'opérateur, dans un shell, prend la
stdout
du processus sur la gauche et passe commestdin
pour le processus sur la droite. C'est essentiellement l'équivalent de:mais c'est plutôt
$ proc1 | proc2
, le deuxième processus peut commencer à obtenir des données avant le premier est fait de la sortie, et il n'y a pas de fichier réel impliqué.git reset HEAD
sans préciser autre chose, et il va réinitialiser la totalité de l'index. Vous pouvez alors tout simplement ré-ajouter uniquement les fichiers que vous souhaitez.$ git reset HEAD fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree. Use '--' to separate paths from revisions
git reset
puis, sans leHEAD
.$ git reset fatal: Failed to resolve 'HEAD' as a valid ref.
Si la TÊTE n'est pas défini, vous pouvez également faire
pour vider complètement le stage. C'est effectivement la même que sehe de la solution, mais évite de coucher avec Git internes.
Avertissement: ne pas utiliser la commande suivante, sauf si vous voulez perdre du travail non validé!
À l'aide de
git reset
a été expliqué, mais vous avez demandé une explication des canalisations de commandes ainsi, voilà:La commande
git ls-files
répertorie tous les fichiers git sait à ce sujet. L'option-z
impose un format spécifique, le format attendu parxargs -0
, qui invoque ensuite lerm -f
sur eux, ce qui signifie pour les supprimer sans vérification de votre approbation.En d'autres termes, "la liste de tous les fichiers git sait à propos de la suppression de votre copie locale".
Puis, nous arrivons à
git diff
, qui montre les changements entre les différentes versions des articles git sait à ce sujet. Ceux-ci peuvent être des changements entre les différents arbres, les différences entre les copies et des copies distantes, et ainsi de suite.Tel qu'utilisé ici, il montre la unstaged changements; les fichiers que vous avez changé, mais n'ont pas encore. L'option
--name-only
signifie que vous souhaitez que la (pleine) les noms de fichiers uniquement et--diff-filter=D
signifie que vous êtes intéressé dans des fichiers supprimés uniquement. (Hey, n'avons-nous pas simplement de supprimer un tas de trucs?)Cela devient alors acheminée dans la
xargs -0
nous l'avons vu avant, qui appellegit rm --cached
sur eux, ce qui signifie qu'ils sont supprimés du cache, tandis que l'arbre de travail doit être laissé seul, sauf que vous avez juste enlevé tous les fichiers à partir de votre arbre de travail. Maintenant, ils sont supprimés à partir de votre index.En d'autres termes, tous les changements, des mises en scène ou unstaged, sont allés, et votre arbre de travail est vide. Ont un cri, commander vos fichiers frais de l'origine ou de la distance, et refaire votre travail. Malédiction le sadique qui a écrit ces infernal lignes; je n'ai aucune idée de la raison de quiconque aurait envie de le faire.
TL;DR: vous avez juste arrosé le tout, recommencer et utiliser
git reset
à partir de maintenant.J'ai peur que la première de ces lignes de commande inconditionnellement supprimés à partir de la copie de travail de tous les fichiers qui sont dans le git de la zone de transit. Le second unstaged tous les fichiers qui ont été suivis, mais ont été supprimés. Malheureusement, cela signifie que vous avez perdu toutes les modifications non validées à ces fichiers.
Si vous souhaitez obtenir votre copie de travail et de l'indice de revenir à la façon dont ils ont été à la dernière validation, vous pouvez (soigneusement) utilisez la commande suivante:
Je dis "soigneusement" depuis
git reset --hard
renversera les modifications non validées dans votre copie de travail et l'index. Cependant, dans cette situation, il semble que si vous voulez juste pour revenir à l'état lors de votre dernier commit, et les modifications non validées ont été perdus de toute façon.Mise à jour: il sons de vos commentaires sur l'Ambre de la réponse que vous n'avez pas encore créé de commits (depuis la TÊTE ne peut pas être résolu), donc ce n'est pas aider, je le crains.
Quant à la façon dont ces tuyaux de travail:
git ls-files -z
etgit diff --name-only --diff-filter=D -z
deux sorties, une liste de noms de fichiers séparés par l'octet0
. (Ceci est utile, car, à la différence des retours à la ligne,0
octets sont garantis de ne pas se produire dans les noms de fichiers sur les systèmes de type Unix.) Le programmexargs
essentiellement construit des lignes de commandes à partir de son entrée standard, par défaut, en prenant les lignes de l'entrée standard et les ajouter à la fin de la ligne de commande. Le-0
option dit d'attendre l'entrée standard par séparées par0
octets.xargs
peut invoquer la commande plusieurs fois d'utiliser tous les paramètres à partir de l'entrée standard, en s'assurant que la ligne de commande ne devient jamais trop longtemps.Comme un exemple simple, si vous avez un fichier nommé
test.txt
, avec le contenu suivant:... alors la commande
xargs echo whatever < test.txt
invoquer la commande:Si vous voulez unstage de tous les changements utiliser la commande ci-dessous,
Dans le cas où vous souhaitez unstage les modifications et revenir à partir du répertoire de travail,