Bagaimana cara menghapus file yang tidak terlacak di Git?

110

Saya sedang mengerjakan sebuah cabang, katakanlah cabang "eksperimental" yang saya percabangkan dari cabang master saya. Lalu, saya membuat model pengguna di cabang eksperimental, tetapi belum menambahkannya ke indeks.

Apa yang harus saya lakukan jika saya ingin membuang semua perubahan file yang baru-baru ini ditambahkan di cabang eksperimental saya? File yang tidak terlacak terdaftar sebagai berikut:

$ 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

Saya mencoba menjalankan "git reset --hard" dengan harapan dapat membatalkan semua perubahan itu, tetapi semua file di atas masih muncul.

Adakah yang bisa menjelaskan padaku?

Sarun Sermsuwan
sumber

Jawaban:

220

Untuk menghapus file / direktori yang tidak terlacak lakukan:

git clean -fdx

-f - memaksa

-d - direktori juga

-x - hapus juga file yang diabaikan (jangan gunakan ini jika Anda tidak ingin menghapus file yang diabaikan)


Gunakan dengan Hati-hati!
Perintah-perintah ini dapat secara permanen menghapus file sewenang-wenang, yang tidak Anda pikirkan pada awalnya. Silakan periksa kembali dan baca semua komentar di bawah jawaban ini dan --bagian bantuan, dll., Jadi untuk mengetahui semua detail untuk menyempurnakan perintah Anda dan pasti mendapatkan hasil yang diharapkan.

manojlds
sumber
54
Tambahkan -n ke pratinjau terlebih dahulu sehingga Anda tidak menghapus barang secara tidak sengaja
Druska
8
Ini bagus! Selain itu, tindakan ini juga akan menghapus file konfigurasi yang mungkin sengaja Anda abaikan di .gitignore tetapi masih diperlukan untuk lingkungan pengembangan lokal Anda. Anda dapat menggunakan perintah yang sama dengan ekstra -i untuk mode interaktif seperti: git clean -fdxi dan ini akan menanyakan file mana yang ingin Anda hapus.
moeabdol
5
Ini bagus, tapi Anda mungkin ingin menambahkan pemberitahuan kepada pengguna untuk GUNAKAN -xDENGAN HATI-HATI karena ini akan menghapus file secara permanen. Atau gunakan dengan -nseperti yang disebutkan oleh @Druska
lacostenycoder
3
-xMasih tidak digunakan , proyek dan file konfigurasi lainnya terhapus. Harus menarik repo lagi dari komit terakhir ke direktori baru.
pencatat waktu
2
Saya pikir Anda harus memberi tahu bahwa perintah ini berpotensi berbahaya karena dapat menghapus file yang diinginkan !!!
Davide
20

Pendekatan interaktif pengguna:

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 untuk interaktif
-f untuk force
-d untuk direktori
-x untuk file yang diabaikan (tambahkan jika diperlukan)

Catatan: Tambahkan -n atau --dry-run untuk memeriksa apa yang akan dilakukannya.

bit_cracker007
sumber
17

Itu adalah file yang tidak terlacak. Ini berarti git tidak melacaknya. Ini hanya mencantumkannya karena tidak ada di file git ignore. Karena mereka tidak dilacak oleh git, git resettidak akan menyentuhnya.

Jika Anda ingin menghapus semua file yang tidak terlacak, cara termudah adalah git clean -f(gunakan git clean -nsebagai gantinya jika Anda ingin melihat apa yang akan dihancurkan tanpa benar-benar menghapus apa pun). Jika tidak, Anda bisa langsung menghapus file yang tidak Anda inginkan.

Lily Ballard
sumber
5

Untuk menghapus file yang tidak terlacak:

git clean -f

Untuk menghapus direktori yang tidak terlacak juga, gunakan:

git clean -f -d

Untuk mencegah serangan jantung, gunakan

git clean -n -f -d

Sonu Mishra
sumber
Setiap "serangan jantung" 😂😂😂
Rishi Kulshreshtha
2

Anda juga dapat kembali ke status repo lokal sebelumnya dengan cara lain:

  1. Tambahkan file yang tidak terlacak ke area pementasan dengan git add.
  2. kembali ke keadaan sebelumnya dari repo lokal dengan git reset --hard.
Tomasz Nazarenko
sumber
1

Perintah untuk menyelamatkan Anda adalah git clean.

Jagriti Kumari
sumber
0

Nah, saya punya masalah serupa. Saya telah mengambil yang terbaru tetapi ada beberapa perubahan di lokal yang menyebabkan penggabungan tidak terjadi pada file tertentu. File tersebut tidak terlacak dan saya tidak menginginkannya jadi Yang saya lakukan adalah -

$ git checkout jalur file / nama file

filepath - Lokasi tempat saya melakukan git bash. kemudian ketika saya mengambil yang terbaru, perubahan itu tersedia

skb
sumber
0

Meskipun git cleanberfungsi dengan baik, saya masih merasa berguna menggunakan skrip saya sendiri untuk membersihkan repo git, ini memiliki beberapa keuntungan.

Ini menunjukkan daftar file yang akan dibersihkan, kemudian secara interaktif meminta untuk membersihkan atau tidak. Ini hampir selalu yang saya inginkan karena permintaan interaktif per file menjadi membosankan.

Ini juga memungkinkan pemfilteran manual dari daftar yang berguna ketika ada jenis file yang tidak ingin Anda bersihkan (dan memiliki alasan untuk tidak berkomitmen).


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
ideman42
sumber