Saya tidak sengaja menambahkan banyak file sementara menggunakan git add -A
Saya berhasil menghapus file dengan menggunakan perintah berikut dan berhasil menghapus indeks kotor.
git ls-files -z | xargs -0 rm -f
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
Perintah di atas tercantum dalam git help rm
. Namun sayangnya, file saya juga dihapus saat eksekusi, meskipun saya telah memberikan opsi cache. Bagaimana saya bisa menghapus indeks tanpa kehilangan konten?
Juga akan sangat membantu jika seseorang dapat menjelaskan cara operasi pipa ini.
git
version-control
sarat
sumber
sumber
rm -f
bukan perintah git dan tidak memiliki--cached
opsi. File lokal Anda telah dihapus sebelum Anda dieksekusigit rm
jadi saya tidak berpikir Anda bisa menyalahkangit rm
apa pun secara sah .git reset --hard
itu bukan jawaban yang benar dan pada kenyataannya akan menghapus konten. Ini akan membingungkan pengguna - seperti halnya saya.Jawaban:
git reset
Jika semua yang Anda inginkan adalah membatalkan menjalankan "git add" terlalu bersemangat:
Perubahan Anda tidak akan bertahap dan siap untuk Anda tambahkan kembali sesuka Anda.
JANGAN LARI
git reset --hard
.Ini tidak hanya akan menghapus stage dari file yang ditambahkan, tetapi akan mengembalikan semua perubahan yang Anda buat di direktori kerja Anda. Jika Anda membuat file baru di direktori kerja, itu tidak akan menghapusnya.
sumber
git checkout -- *
jugaJika Anda memiliki repo yang masih asli (atau HEAD tidak disetel) [1] Anda bisa saja
Tentu saja, ini mengharuskan Anda untuk menambahkan kembali file yang memang ingin Anda tambahkan.
[1] Catatan (seperti yang dijelaskan dalam komentar) ini biasanya hanya terjadi ketika repo baru ("asli") atau jika tidak ada komitmen yang dibuat. Lebih teknis, setiap kali tidak ada checkout atau pohon kerja.
Hanya membuatnya lebih jelas :)
sumber
Gunakan
git reset HEAD
untuk mengatur ulang indeks tanpa menghapus file. (Jika Anda hanya ingin mengatur ulang file tertentu dalam indeks, Anda dapat menggunakannyagit reset HEAD -- /path/to/file
untuk melakukannya.)Operator pipa, dalam sebuah shell, mengambil
stdout
proses di sebelah kiri dan meneruskannyastdin
ke proses di sebelah kanan. Ini pada dasarnya setara dengan:tetapi sebaliknya
$ proc1 | proc2
, proses kedua dapat mulai mendapatkan data sebelum yang pertama selesai mengeluarkannya, dan tidak ada file sebenarnya yang terlibat.sumber
git reset HEAD
tanpa menentukan yang lain, dan itu akan mengatur ulang seluruh indeks. Anda kemudian dapat menambahkan kembali hanya file yang Anda inginkan.$ git reset HEAD fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree. Use '--' to separate paths from revisions
git reset
, tanpaHEAD
.$ git reset fatal: Failed to resolve 'HEAD' as a valid ref.
sumber
Jika KEPALA tidak diatur (yaitu, Anda belum memiliki komitmen, tetapi Anda tidak ingin hanya membuang
.git
karena Anda sudah menyiapkan konfigurasi repo lain yang ingin Anda pertahankan), Anda juga dapat melakukanuntuk unstage segalanya. Ini secara efektif sama dengan solusi sehe, tetapi menghindari mucking dengan internal Git.
sumber
.git
karena Anda sudah mengatur repo lain yang mengonfigurasi Anda ingin tetap. Saya telah mengedit untuk memperjelas ini.Peringatan: jangan gunakan perintah berikut kecuali Anda ingin kehilangan pekerjaan yang tidak berkomitmen!
Menggunakan
git reset
telah dijelaskan, tetapi Anda meminta penjelasan tentang perintah yang di-piped juga, jadi begini:Perintah ini
git ls-files
mencantumkan semua file yang diketahui git. Opsi-z
memaksakan format tertentu pada mereka, format yang diharapkan olehxargs -0
, yang kemudian memanggilrm -f
mereka, yang berarti menghapusnya tanpa memeriksa persetujuan Anda.Dengan kata lain, "daftarkan semua file yang diketahui git dan hapus salinan lokal Anda".
Lalu kita mulai
git diff
, yang menunjukkan perubahan antara berbagai versi item yang diketahui git. Itu bisa berupa perubahan antara pohon yang berbeda, perbedaan antara salinan lokal dan salinan jarak jauh, dan sebagainya.Seperti yang digunakan di sini, ini menunjukkan perubahan yang tidak dipentaskan; file yang telah Anda ubah tetapi belum berkomitmen. Opsi ini
--name-only
berarti Anda hanya menginginkan nama file (lengkap) dan--diff-filter=D
berarti Anda hanya tertarik pada file yang dihapus. (Hei, bukankah kita hanya menghapus banyak hal?) Ini kemudian disalurkan ke yangxargs -0
kita lihat sebelumnya, yang memanggilgit rm --cached
mereka, yang berarti bahwa mereka dihapus dari cache, sementara pohon yang bekerja harus dibiarkan sendiri - kecuali bahwa Anda baru saja menghapus semua file dari pohon kerja Anda. Sekarang mereka juga dihapus dari indeks Anda.Dengan kata lain, semua perubahan, dipentaskan atau tidak dipentaskan, hilang, dan pohon kerja Anda kosong. Menangis, checkout file Anda segar dari asal atau jarak jauh, dan ulangi pekerjaan Anda. Mengutuk sadis yang menulis garis-garis neraka ini; Saya tidak tahu sama sekali mengapa ada orang yang mau melakukan ini.
TL; DR: Anda baru saja menyemprot semuanya; mulai lagi dan gunakan
git reset
mulai sekarang.sumber
Saya khawatir baris perintah pertama dihapus tanpa syarat dari copy pekerjaan semua file yang ada di area stage git. Yang kedua tidak menampilkan semua file yang dilacak tetapi sekarang telah dihapus. Sayangnya ini berarti Anda akan kehilangan modifikasi yang tidak dikomit ke file-file tersebut.
Jika Anda ingin mendapatkan copy pekerjaan Anda dan indeks kembali ke bagaimana mereka pada komit terakhir , Anda dapat ( hati-hati ) menggunakan perintah berikut:
Saya katakan "hati-hati" karena
git reset --hard
akan menghapus perubahan yang tidak dikomit di copy pekerjaan Anda dan indeks. Namun, dalam situasi ini kedengarannya seolah-olah Anda hanya ingin kembali ke keadaan di komit terakhir Anda, dan perubahan yang tidak dikomit telah hilang pula.Pembaruan: kedengarannya dari komentar Anda pada jawaban Amber bahwa Anda belum membuat komitmen (karena HEAD tidak dapat diatasi), jadi ini tidak akan membantu, saya khawatir.
Adapun cara kerja pipa-pipa itu:
git ls-files -z
dangit diff --name-only --diff-filter=D -z
keduanya menampilkan daftar nama file yang dipisahkan dengan byte0
. (Ini berguna, karena, tidak seperti baris baru,0
byte dijamin tidak muncul dalam nama file pada sistem mirip Unix.) Program inixargs
pada dasarnya membangun baris perintah dari input standar, secara default dengan mengambil baris dari input standar dan menambahkannya ke akhir. dari baris perintah. The-0
pilihan kata untuk mengharapkan standar input oleh dipisahkan oleh0
byte.xargs
mungkin memanggil perintah beberapa kali untuk menggunakan semua parameter dari input standar, memastikan bahwa baris perintah tidak pernah menjadi terlalu panjang.Sebagai contoh sederhana, jika Anda memiliki file yang dipanggil
test.txt
, dengan konten berikut:... maka perintah tersebut
xargs echo whatever < test.txt
akan memanggil perintah:sumber
Jika Anda ingin membatalkan tahapan semua perubahan gunakan perintah di bawah ini,
Jika Anda ingin membatalkan perubahan dan mengembalikannya dari direktori kerja,
sumber