comment supprimer les fichiers non suivis dans Git?

110

Je travaille sur une branche, disons une branche "expérimentale" que je branche depuis ma branche master. Ensuite, je génère un modèle utilisateur dans la branche expérimentale, mais je ne les ajoute pas encore à l'index.

Que dois-je faire si je souhaite annuler toutes les modifications des fichiers récemment ajoutés dans ma branche expérimentale? Les fichiers non suivis sont répertoriés ci-dessous:

$ git status
 On branch new_chick
 Untracked files:
   (use "git add <file>..." to include in what will be committed)

       .project
       app/models/user.rb
       db/migrate/
       test/fixtures/users.yml
       test/unit/user_test.rb

J'ai essayé d'exécuter "git reset --hard" dans l'espoir d'annuler tous ces changements, mais tous les fichiers ci-dessus sont toujours affichés.

Quelqu'un s'il vous plaît me faire la lumière?

Sarun Sermsuwan
la source
2
Double
g00glen00b

Réponses:

220

Pour supprimer les fichiers / répertoires non suivis, procédez comme suit:

git clean -fdx

-f - force

-d - répertoires aussi

-x - supprime également les fichiers ignorés (ne l'utilisez pas si vous ne voulez pas supprimer les fichiers ignorés)


Utiliser avec précaution!
Ces commandes peuvent supprimer définitivement des fichiers arbitraires auxquels vous n'aviez pas pensé au début. Veuillez vérifier et lire tous les commentaires sous cette réponse et la section --help, etc., afin de connaître tous les détails pour affiner vos commandes et obtenir sûrement le résultat attendu.

manojlds
la source
54
Ajoutez -n pour prévisualiser d'abord afin de ne pas supprimer accidentellement des éléments
Druska
8
C'est bien! Sauf que cela supprimera également les fichiers de configuration que vous avez peut-être volontairement ignorés dans .gitignore mais dont vous avez toujours besoin pour votre environnement de développement local. Vous pouvez utiliser la même commande avec l'extra -i pour le mode interactif comme tel: git clean -fdxi et il vous demandera quels fichiers vous souhaitez supprimer.
moeabdol
5
C'est génial, mais vous voudrez peut-être ajouter un avis aux utilisateurs à UTILISER -xAVEC PRÉCAUTION car cela supprimera définitivement les fichiers. Ou utiliser avec -ncomme mentionné par @Druska
lacostenycoder
3
N'a pas -xencore utilisé le .project et les autres fichiers de configuration ont été supprimés. J'ai dû extraire à nouveau le dépôt du dernier commit dans un nouveau répertoire.
chronométreur
2
Je pense que vous devez informer que cette commande est potentiellement dangereuse car elle peut supprimer les fichiers voulus !!!
Davide
20

Approche interactive de l'utilisateur:

git clean -i -fd

Remove .classpath [y/N]? N
Remove .gitignore [y/N]? N
Remove .project [y/N]? N
Remove .settings/ [y/N]? N
Remove src/com/amazon/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/s3/ [y/N]? y

-i pour interactif
-f pour force
-d pour le répertoire
-x pour les fichiers ignorés (ajouter si nécessaire)

Remarque: Ajoutez -n ou --dry-run pour simplement vérifier ce qu'il va faire.

bit_cracker007
la source
17

Ce sont des fichiers non suivis. Cela signifie que git ne les suit pas. Il ne les répertorie que parce qu'ils ne sont pas dans le fichier git ignore. Puisqu'ils ne sont pas suivis par git,git reset je ne les toucherai pas.

Si vous voulez supprimer tous les fichiers non suivis, le moyen le plus simple est git clean -f(utilisez git clean -nplutôt si vous voulez voir ce qu'il détruirait sans rien supprimer). Sinon, vous pouvez simplement supprimer manuellement les fichiers dont vous ne voulez pas.

Lily Ballard
la source
5

Pour supprimer des fichiers non suivis:

git clean -f

Pour supprimer également les répertoires non suivis, utilisez:

git clean -f -d

Pour prévenir tout arrêt cardiaque, utilisez

git clean -n -f -d

Sonu Mishra
la source
Tout "arrêt cardiaque" 😂😂😂
Rishi Kulshreshtha
2

Vous pouvez également revenir à l'état précédent du dépôt local d'une autre manière:

  1. Ajoutez les fichiers non suivis à la zone de préparation avec git add.
  2. revenir à l'état précédent du repo local avec git reset --hard.
Tomasz Nazarenko
la source
1

La commande pour votre sauvetage est git clean.

Jagriti Kumari
la source
0

Eh bien, j'ai eu le même problème. J'avais pris le dernier mais il y avait quelques changements dans le local en raison desquels la fusion ne se produisait pas à un fichier particulier. Le fichier n'a pas été suivi et je ne les voulais pas, alors ce que j'ai fait était -

$ git checkout chemin de fichier / nom de fichier

filepath - L'emplacement à partir duquel j'ai fait le git bash. puis quand j'ai pris les dernières modifications, les modifications étaient disponibles

skb
la source
0

Bien que cela git cleanfonctionne bien, je trouve toujours utile d'utiliser mon propre script pour nettoyer le repo git, mais il présente certains avantages.

Cela affiche une liste de fichiers à nettoyer, puis invite interactivement à nettoyer ou non. C'est presque toujours ce que je veux, car les invites interactives par fichier deviennent fastidieuses.

Il permet également le filtrage manuel de la liste, ce qui est pratique lorsqu'il y a des types de fichiers que vous ne voulez pas nettoyer (et que vous avez des raisons de ne pas valider).


git_clean.sh


#!/bin/bash
readarray -t -d '' FILES < <(
    git ls-files -z --other --directory |
        grep --null-data --null -v '.bin$\|Cargo.lock$'
)
if [ "$FILES" = "" ]; then
    echo  "Nothing to clean!"
    exit 0
fi

echo "Dirty files:"
printf '  %s\n' "${FILES[@]}"

DO_REMOVE=0
while true; do
    echo ""
    read -p "Remove ${#FILES[@]} files? [y/n]: " choice
    case "$choice" in
        y|Y )
            DO_REMOVE=1
            break ;;
        n|N )
            echo "Exiting!"
            break ;;
        * ) echo "Invalid input, expected [Y/y/N/n]"
            continue ;;
    esac
done

if [ "$DO_REMOVE" -eq 1 ];then
    echo "Removing!"
    for f in "${FILES[@]}"; do
       rm -rfv "$f"
    done
fi
ideasman42
la source