Bagaimana cara menghapus file dari area git staging?

551

Saya membuat perubahan pada beberapa file saya di repo lokal saya, dan kemudian saya lakukan git add -Ayang saya pikir menambahkan terlalu banyak file ke area pementasan. Bagaimana saya bisa menghapus semua file dari area pementasan?

Setelah saya melakukan itu, saya hanya akan melakukannya secara manual git add "filename".

akhir
sumber
2
Semoga Anda mencari ini: stackoverflow.com/questions/1505948/…
sumitb.mdi
27
git statussudah memberi tahu Anda apa yang harus dilakukan jika Anda ingin menghapus file.
Michael Foukarakis
6
@MichaelFoukarakis status git tidak membantu jika Anda ingin menghapus seluruh direktori jika membanjiri terminal dengan output (seperti node_modules)
whiterook6
2
Di masa mendatang, alih-alih menambahkan semua, Anda mungkin ingin merasa nyaman dengan git add -patau git add --patch(semuanya sama). Bendera itu memungkinkan Anda untuk secara interaktif memilih file atau perubahan individu mana yang ingin Anda panggung - Anda kemudian bisa mendapatkan lebih banyak butiran halus dengan pekerjaan apa yang Anda sertakan dalam komit.
Gabe

Jawaban:

691

Anda dapat menghapus file dari indeks menggunakan

git reset HEAD -- path/to/file

Sama seperti git add, Anda dapat menghapus stage file secara rekursif berdasarkan direktori dan sebagainya, jadi untuk unstage semuanya sekaligus, jalankan ini dari direktori root repositori Anda:

git reset HEAD -- .

Juga, untuk referensi di masa mendatang, output dari git statusakan memberi tahu Anda perintah yang perlu Anda jalankan untuk memindahkan file dari satu negara ke negara lain.

Ash Wilson
sumber
5
$ git reset HEAD -- .menghasilkan fatal: Failed to resolve 'HEAD' as a valid ref.Catatan bahwa saya tidak pernah melakukan komitmen apa pun; ini adalah yang pertama git addsetelahgit init
Patrizio Bertoni
5
Anda juga bisa menggunakan git reset @.
alex
@ alex Apakah lebih baik dari sekadar polos git reset?
Antony Hatchkins
7
@AntonyHatchkins @identik dengan HEAD.
alex
Benar-benar bekerja untuk saya, terima kasih!
wayneseymour
305

Menggunakan

git reset

untuk menghapus semua file yang dipentaskan.

Antony Hatchkins
sumber
3
Dapatkah saya bertanya bagaimana perbedaannya git reset HEAD --atau apakah ini hanya cara yang lebih ringkas untuk melakukan operasi yang sama?
ProNotion
1
@ProNotion Reset digunakan HEADsecara default. Apa tujuan mereka --di Anda git reset HEAD --?
Antony Hatchkins
@AntonyHatchkins itu harus diikuti dengan berhenti penuh (titik) dan diambil dari contoh dalam jawaban yang diterima.
ProNotion
11
@ ProNotion Maaf saya salah paham dengan Anda. git reset HEAD -- .berbeda karena hanya me-reset file di direktori saat ini dan di bawah ini sementara git resetme-reset semua file dalam proyek.
Antony Hatchkins
101

Jika Anda sudah melakukan banyak file yang tidak diinginkan, Anda dapat membatalkan stage dan memberi tahu git untuk menandainya dihapus (tanpa benar-benar menghapusnya) dengan

git rm --cached -r .

--cachedmemberitahu itu untuk menghapus jalur dari pementasan dan indeks tanpa menghapus file itu sendiri dan -rberoperasi pada direktori secara rekursif. Anda kemudian dapat git addfile apa pun yang ingin Anda lacak.

Maks
sumber
Saya kira itu adalah "git rm -."
Alexander Mills
1
ada kesalahan fatal tentang tidak menghapus file dengan "git rm -."
Alexander Mills
@AlexMills Saya memperbarui jawaban saya untuk menyebutkan opsi aktual untuk rmmembatalkan tahapan semua file.
Maks
2
Saya mencoba ini pada file tunggal seperti ini: "git rm --cached my / file.java" dan saya melihat file itu masih dalam area stage, tetapi sudah dihapus! @ Max ketika Anda menjalankan perintah ini apakah file Anda benar-benar dihapus atau hanya un-dipentaskan? Jika Anda tidak mencari perilaku itu, saya akan menjawab.
OrwellHindenberg
@OrwellHindenberg terima kasih telah menunjukkannya! --cachedbenar-benar menghentikan pelacakan file yang sudah Anda komit. Jadi file tersebut sebenarnya tidak dihapus, tetapi git berpikir itu. Saya sudah mengklarifikasi hal ini dalam jawaban saya.
Maks
30

Anda bisa menggunakannya

git reset HEAD

kemudian tambahkan file spesifik yang Anda inginkan

git add [directory/]filename
Shad
sumber
Anda dapat menambahkan parameter -x dan file yang diabaikan akan dihapus juga. Ini berguna jika Anda mengacaukan .gitignore Anda dan memiliki sesuatu yang berguna di sana (seperti dalam kasus saya). ( git-scm.com/docs/git-clean )
Keeprock
1
Dengan kelebihan folder, git statusakan memberi tahu Anda direktori kerja bersih - kebohongan! git clean -dfmelakukan pekerjaan, terima kasih.
Leo
5
Perhatikan bahwa git clean -dfakan menghapus file secara permanen. Pada sistem mirip UNIX, ia akan memanggil unlink()dan file yang dihapus tidak akan dapat dipulihkan.
Hanxue
11
OP bertanya tentang unstaging file. Anda menasihatinya untuk menghapus file. Saya sarankan Anda untuk membaca tentang apa area pementasan sebelum menjawab.
Antony Hatchkins
Terima kasih telah menghapus seluruh proyek saya yang belum disimpan.
Vansuita Jr.
7

Seperti disebutkan dalam jawaban lain, Anda harus menggunakan git reset. Ini akan membatalkan tindakan git add -A.

Catatan: git reset setara dengan git reset --mixedyang melakukan ini

Atur ulang indeks tetapi bukan pohon kerja (yaitu, file yang diubah disimpan tetapi tidak ditandai untuk komit) dan melaporkan apa yang belum diperbarui. Ini adalah tindakan default. [ git reset ]

Dan Rosenstark
sumber
2
.. dan untuk menghapus satu file dari area pementasan, Anda dapat melakukangit reset filenameToNotCommit
SherylHohman
5

Sekarang di v2.24.0 menyarankan

git restore --staged .

untuk menghapus file.

norixxx
sumber
1

Anda dapat mengatur ulang area pementasan dengan beberapa cara:

  1. Setel ulang HEAD dan tambahkan semua file yang diperlukan untuk check-in lagi seperti di bawah ini:

     git reset HEAD ---> removes all files from the staging area
     git add <files, that are required to be committed>
     git commit -m "<commit message>"
     git push 
    
Amit Kaneria
sumber
Apa yang membuat jawaban ini berbeda dari enam jawaban yang ada?
Antony Hatchkins
1

Untuk menghapus semua file dari penggunaan area stage -
git reset
Untuk menghapus penggunaan file tertentu -
git reset "File path"

Akash Bisariya
sumber
1

menggunakan

git reset HEAD

Ini akan menghapus semua file dari area stage

Ajith
sumber
1

Jika file yang tidak diinginkan ditambahkan ke area pementasan tetapi belum dilakukan, maka reset sederhana akan melakukan pekerjaan:

$ git reset HEAD file
# Or everything
$ git reset HEAD .

Untuk hanya menghapus perubahan yang tidak bertahap di direktori kerja saat ini, gunakan:

git checkout -- .
Vlad Bezden
sumber
0

Gunakan " git reset HEAD <file>..." untuk menghapus stage fils

mis: untuk unstage semua file

git reset HEAD .

untuk menghapus satu file

git reset HEAD nameFile.txt
Amirouche Zeggagh
sumber
-3

Saya mencoba semua metode ini tetapi tidak ada yang berhasil untuk saya. Saya menghapus file git menggunakan rm -rf .gitformulir repositori lokal dan kemudian lagi melakukan git initdan git adddan perintah rutin. Itu berhasil.

Bhaskar Dhariyal
sumber
4
Membaca dokumen git umumnya lebih bermanfaat daripada mengikuti saran dari xkcd.com/1597 ;)
Antony Hatchkins
1
Mungkin Anda memiliki masalah integritas dalam kasus spesifik Anda dan ini adalah opsi yang tersisa, namun itu tidak disarankan.
Shad
Tolong jangan lakukan ini, Anda akan menghancurkan seluruh repo git Anda.
Lennart Rolland
-5

Cara terbaik untuk membatalkan file Anda yang sudah ada di area pementasan adalah git reset --hard yang membawa file bertahap Anda kembali. Hati-hati sekarang, itu akan menghapus perubahan bertahap dan tidak bertahap.

data pix
sumber
2
Ini salah dan berbahaya !!! OP ingin "hanya menambahkan secara manual" file kembali lagi setelah itu tetapi --hardmenghapusnya selamanya.
Antony Hatchkins