J'ai accidentellement ajouté beaucoup de fichiers temporaires en utilisant git add -A
J'ai réussi à décompresser les fichiers en utilisant les commandes suivantes et j'ai réussi à supprimer l'index sale.
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ées dans le git help rm
. Mais malheureusement, mes fichiers ont également été supprimés lors de l'exécution, même si j'avais donné l'option de cache. Comment effacer l'index sans perdre le contenu?
Il serait également utile que quelqu'un explique le fonctionnement de cette opération de canalisation.
git
version-control
Sarat
la source
la source
rm -f
n'est pas une commande git et n'a pas d'--cached
option. Vos fichiers locaux ont été supprimés avant votre exécution,git rm
donc je ne pense pas que vous puissiez légitimement blâmergit rm
quoi que ce soit.git reset --hard
n'est pas correcte et supprimera en fait le contenu. Cela va dérouter les utilisateurs - comme cela m'a fait.Réponses:
git reset
Si tout ce que vous voulez, c'est d'annuler une exécution "git add" trop zélée:
Vos modifications ne seront pas mises en scène et seront prêtes à être ajoutées à votre guise.
NE COUREZ PAS
git reset --hard
.Il non seulement mettra en scène vos fichiers ajoutés, mais annulera toutes les modifications que vous avez apportées dans votre répertoire de travail. Si vous avez créé de nouveaux fichiers dans le répertoire de travail, il ne les supprimera cependant pas.
la source
git checkout -- *
aussi jouerSi vous avez un dépôt vierge (ou si HEAD n'est pas défini) [1], vous pouvez simplement
Bien sûr, cela vous obligera à ajouter à nouveau les fichiers que vous avez voulez ajouter.
[1] Remarque (comme expliqué dans les commentaires), cela ne se produira généralement que lorsque le dépôt est neuf ("vierge") ou si aucun engagement n'a été fait. Plus techniquement, chaque fois qu'il n'y a pas de caisse ou d'arbre de travail.
Juste pour être plus clair :)
la source
Utilisez
git reset HEAD
pour réinitialiser l'index sans supprimer les fichiers. (Si vous souhaitez uniquement réinitialiser un fichier particulier dans l'index, vous pouvez legit reset HEAD -- /path/to/file
faire.)L'opérateur de tuyaux, dans une coquille, prend le
stdout
processus à gauche et le transmetstdin
au processus à droite. C'est essentiellement l'équivalent de:mais au lieu de cela
$ proc1 | proc2
, le deuxième processus peut commencer à obtenir des données avant que le premier ne soit sorti, et aucun fichier réel n'est impliqué.la source
git reset HEAD
sans spécifier quoi que ce soit d'autre, et cela réinitialisera l'index entier. Vous pouvez ensuite simplement ajouter à nouveau 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
alors, sans leHEAD
.$ git reset fatal: Failed to resolve 'HEAD' as a valid ref.
la source
Si HEAD n'est pas défini (c.-à-d., Vous n'avez pas encore de commit, mais vous ne voulez pas simplement souffler
.git
parce que vous avez déjà configuré une autre configuration de dépôt que vous souhaitez conserver), vous pouvez également fairepour tout déchaîner. C'est en fait la même chose que la solution de sehe, mais évite de nettoyer avec les composants internes de Git.
la source
.git
parce que vous avez configuré une autre configuration de référentiel vouloir garder. J'ai édité pour clarifier cela.Attention: n'utilisez la commande suivante que si vous voulez perdre du travail non engagé!
L'utilisation
git reset
a été expliquée, mais vous avez également demandé une explication des commandes canalisées, alors voici:La commande
git ls-files
répertorie tous les fichiers connus de git. L'option leur-z
impose un format spécifique, le format attendu parxargs -0
, qui les invoquerm -f
ensuite, ce qui signifie de les supprimer sans vérifier votre approbation.En d'autres termes, "listez tous les fichiers que git connaît et supprimez votre copie locale".
Ensuite, nous arrivons à
git diff
, qui montre les changements entre les différentes versions des éléments que git connaît. Il peut s'agir de changements entre différentes arborescences, de différences entre les copies locales et les copies distantes, etc.Tel qu'utilisé ici, il montre les changements non programmés; les fichiers que vous avez modifiés mais que vous n'avez pas encore validés. L'option
--name-only
signifie que vous voulez uniquement les noms de fichiers (complets) et--diff-filter=D
que vous êtes intéressé par les fichiers supprimés uniquement. (Hé, n'avons-nous pas simplement supprimé un tas de choses?) Cela est ensuite canalisé dans le fichier quexargs -0
nous avons vu auparavant, qui les invoquegit rm --cached
, ce qui signifie qu'elles sont supprimées du cache, tandis que l'arborescence de travail doit être laissée seule - sauf que vous venez de supprimer tous les fichiers de votre arborescence de travail. Maintenant, ils sont également supprimés de votre index.En d'autres termes, toutes les modifications, échelonnées ou non, ont disparu et votre arborescence de travail est vide. Ayez un cri, extrayez vos fichiers frais d'origine ou à distance et refaites votre travail. Maudissez le sadique qui a écrit ces lignes infernales; Je ne sais absolument pas pourquoi quelqu'un voudrait faire ça.
TL; DR: vous venez de tout arroser; recommencer et utiliser à
git reset
partir de maintenant.la source
Je crains que la première de ces lignes de commande ne supprime inconditionnellement de la copie de travail tous les fichiers qui se trouvent dans la zone de transit de git. Le second a mis en scène tous les fichiers qui ont été suivis mais ont maintenant été supprimés. Malheureusement, cela signifie que vous aurez perdu toutes les modifications non validées de ces fichiers.
Si vous souhaitez récupérer votre copie de travail et votre index comme ils étaient lors du dernier commit , vous pouvez ( avec précaution ) utiliser la commande suivante:
Je dis "soigneusement" car
git reset --hard
cela effacera les changements non validés dans votre copie de travail et votre index. Cependant, dans cette situation, il semble que vous vouliez simplement revenir à l'état lors de votre dernier commit, et les modifications non validées ont quand même été perdues.Mise à jour: il ressort de vos commentaires sur la réponse d'Amber que vous n'avez pas encore créé de commits (car HEAD ne peut pas être résolu), donc cela n'aidera pas, je le crains.
Quant à la façon dont ces canaux fonctionnent:
git ls-files -z
et lesgit diff --name-only --diff-filter=D -z
deux produisent une liste de noms de fichiers séparés par l'octet0
. (Ceci est utile, car, contrairement aux nouvelles lignes, les0
octets sont garantis de ne pas se produire dans les noms de fichiers sur les systèmes de type Unix.) Le programmexargs
construit essentiellement des lignes de commande à partir de son entrée standard, par défaut en prenant des lignes de l'entrée standard et en les ajoutant à la fin de la ligne de commande. L'-0
option dit de s'attendre à ce que l'entrée standard soit séparée par des0
octets.xargs
peut invoquer la commande plusieurs fois pour utiliser tous les paramètres de l'entrée standard, en s'assurant que la ligne de commande ne devient jamais trop longue.À titre d'exemple simple, si vous avez un fichier appelé
test.txt
, avec le contenu suivant:... alors la commande
xargs echo whatever < test.txt
invoquera la commande:la source
Si vous souhaitez annuler toutes les modifications, utilisez la commande ci-dessous,
Dans le cas où vous souhaitez annuler les modifications et les annuler à partir du répertoire de travail,
la source