Bagaimana cara menghapus satu file dari area pementasan (undo git add)?

1232

Situasi: Saya memiliki repositori Git dengan file yang sudah ada dalam indeks. Saya membuat perubahan pada beberapa file, buka Git dan tambahkan file-file ini ke area pementasan saya dengan "git add."

Pertanyaan: Bagaimana cara menghapus salah satu file dari area pementasan tetapi tidak menghapusnya dari indeks atau membatalkan perubahan ke file itu sendiri?

PHLAK
sumber
40
Area pementasan adalah indeks, jadi mungkin Anda bisa mengklarifikasi dengan tepat apa yang Anda maksud?
CB Bailey
Kemungkinan duplikat dari Bagaimana membatalkan 'git add' sebelum melakukan?
TungstenX

Jawaban:

1903

Jika saya memahami pertanyaan dengan benar, Anda hanya ingin "membatalkan" git addyang telah dilakukan untuk file itu.

Jika Anda perlu menghapus satu file dari area pementasan, gunakan

git reset HEAD -- <file>

Jika Anda perlu menghapus seluruh direktori (folder) dari area pementasan, gunakan

git reset HEAD -- <directoryName>

Modifikasi Anda akan disimpan. Ketika Anda menjalankan git statusfile sekali lagi akan muncul sebagai dimodifikasi tetapi belum dipentaskan.

Lihat git resethalaman manual untuk detailnya.

Tim Henigan
sumber
41
Terima kasih ... Saya baru saja memperhatikan bahwa hal itu dinyatakan tepat di atas file yang dipentaskan. Kira saya sudah melihat layar itu begitu lama sehingga saya secara selektif memilih apa yang ingin saya lihat.
PHLAK
2
Ini menghapus semua perubahan saya, bertentangan dengan setiap saran yang saya dapatkan di mana saja (halaman manual, di sini, teman, & c). Saya terus berpikir suatu hari ini akan melakukan apa yang diiklankan, tetapi tidak.
rektide
6
Apakah ada cara untuk menghapus file dari pementasan ketika belum ada komitmen untuk repo?
Jared Forsyth
3
Saya terus datang dan datang ke pertanyaan ini. Mengapa saya tidak bisa lebih sering memperbaikinya? :)
Puce
3
@ Jared Forsyth Untuk menghapus file yang tidak pernah dikomit dari panggung, gunakan perintah git rm --cached FILEseperti yang disarankan oleh jawaban lain.
chmike
151
git rm --cached FILE

,

git rm -r --cached CVS */CVS
pengguna335425
sumber
28
benar, tetapi lebih baik untuk menggunakan di git resetsini saya pikir, karena Anda dapat menghilangkan opsi --chached dan cepat sedih menggunakan git rmperintah :-) Dengan git resetAnda berada di sisi yang aman, jika Anda lupa menambahkan "beberapa opsi" itu akan simpan kembaliannya agar lebih aman untuk penggunaan sehari-hari (saya bicarakan git reset --hard).
Konrad 'ktoso' Malawski
20
Metode ini berguna jika Anda tidak memiliki komitmen sebelumnya.
SomeKittens
2
git rm --cached FILEmenghapus file secara bertahap, tanpa menghapus file dari pohon yang berfungsi. Ini berbeda dari pertanyaan, yaitu tentang kehancuran git add.
Sampo Smolander
1
Jawaban ini menimbulkan kesalahan jika Anda telah menghapus file dari pohon kerja.
Samuel Robert
3
git rm --cachedakan menyebabkan file dihapus dari indeks, yaitu file tersebut akan menjadi file yang tidak terlacak . Saya tidak berpikir ini yang diinginkan OP. Silakan lihat utas terkait di sini: stackoverflow.com/questions/45047810/…
smwikipedia
88

git reset <file>

Berfungsi apakah Anda memiliki komitmen sebelumnya atau tidak.

MTS
sumber
53

Jadi, sedikit perubahan pada jawaban Tim Henigan: Anda harus menggunakan - sebelum nama file. Akan terlihat seperti ini:

git reset HEAD -- <file>
GuerillaNerd
sumber
6
Apa yang --dilakukan dan mengapa menambahkannya? Saya lakukan git reset HEAD <file>dan itu berhasil.
Paolo
15
--adalah jenis pembagi. Jika nama file tidak konvensional, misal ( -fatau master) git akan menafsirkannya sebagai argumen baris perintah atau nama cabang alih-alih nama file. Lihat di sini
Andrew
3
Ini bekerja untuk saya di mana perintah tanpa - bukan karena tidak memiliki komitmen sebelumnya untuk file itu. Terima kasih.
Mat
18
git reset filename.txt

Jika Anda memiliki modifikasi dalam filename.txt, Anda menambahkannya secara bertahap dan Anda ingin menghapus file dari pementasan tetapi Anda tidak ingin kehilangan perubahan.

Vlad Cioaba
sumber
6

Jika Anda hanya ingin menghapus sebagian dari perubahan pada file Anda, Anda dapat menggunakan:

git reset -p

atau

git reset -p <file_name>

Perintah ini pada dasarnya kebalikan dari git add -p: hanya akan menghapus perubahan yang dipilih dari area pementasan. Saya menemukan ini sangat berguna dalam "unadding" sesuatu yang saya tambahkan secara tidak sengaja.

fede1024
sumber
4

Jika Anda ingin menghapus file mengikuti pola tertentu dan Anda gunakan git rm --cached, Anda dapat menggunakan pola glob-file juga.

Lihat di sini .

thilinarmtb
sumber
2

Kamu ingin:

  • Mempengaruhi satu file

  • Hapus file dari area pementasan

  • Tidak menghapus satu file dari indeks

  • Jangan batalkan perubahan itu sendiri

dan solusinya adalah

git reset HEAD file_name.ext

atau

git reset HEAD path/to/file/file_name.ext
Apakah Nhu Vy
sumber
2

Ketika Anda melakukannya git status, Git memberi tahu Anda cara unstage:

Changes to be committed: (use "git reset HEAD <file>..." to unstage).

Jadi git reset HEAD <file>bekerja untuk saya dan perubahan itu tidak tersentuh.


sumber
2

Saya pikir Anda mungkin bingung dengan konsep indeks , seperti komentar @CB Bailey:

Area pementasan adalah indeks.

Anda hanya dapat mempertimbangkan direktori pementasan dan indeks sebagai hal yang sama.
Jadi, sama seperti jawaban @Tim Henigan , saya kira:

Anda hanya ingin "membatalkan" git addyang telah dilakukan untuk file itu.



Inilah jawaban saya:

Secara umum, ada dua cara untuk membatalkan operasi tahap , seperti jawaban lain yang telah disebutkan:

git reset HEAD <file>

dan

git rm --cached <file>

Tapi apa bedanya?

Asumsikan file telah dipentaskan dan ada di direktori kerja juga, gunakan git rm --cached <file>jika Anda ingin menghapusnya dari direktori pementasan , dan simpan file dalam direktori kerja . Tetapi perhatikan bahwa operasi ini tidak hanya akan menghapus file dari direktori staging tetapi juga menandai file tersebut deleteddi direktori staging , jika Anda menggunakan

git status

setelah operasi ini, Anda akan melihat ini:

        deleted:    <file>

Ini adalah catatan untuk menghapus file dari direktori pementasan . Jika Anda tidak ingin menyimpan catatan itu dan hanya ingin membatalkan operasi tahap file sebelumnya, gunakan git reset HEAD <file>saja.


-------- AKHIR JAWABAN --------

PS: Saya perhatikan ada jawaban yang disebutkan:

git checkout -- <file>

Perintah ini untuk situasi ketika file telah dipentaskan , tetapi file tersebut telah dimodifikasi dalam direktori kerja setelah dipentaskan, gunakan operasi ini untuk mengembalikan file dalam direktori yang berfungsi dari direktori staging . Dengan kata lain, setelah operasi ini, perubahan terjadi di direktori kerja Anda , BUKAN direktori pementasan Anda .

Wulfric Lee
sumber
2

Setelah versi 2.23, Git telah memperkenalkan git restoreperintah yang dapat Anda gunakan untuk melakukan itu. Mengutip dokumentasi resmi:

Kembalikan jalur yang ditentukan di pohon kerja dengan beberapa konten dari sumber pemulihan. Jika jalur dilacak tetapi tidak ada di sumber pemulihan, itu akan dihapus agar sesuai dengan sumber.

Perintah ini juga dapat digunakan untuk mengembalikan konten dalam indeks dengan --staged, atau mengembalikan pohon kerja dan indeks dengan --staged --worktree.

Jadi Anda dapat memohon git restore --staged <path>dan menghapus stage file tetapi juga menyimpan perubahan yang Anda buat. Ingat bahwa jika file itu tidak dipentaskan Anda kehilangan semua perubahan yang Anda buat untuk itu.

Mike
sumber
2

Untuk versi Git yang lebih baru ada git restore --staged <file>.

Ketika saya melakukan git statusdengan versi Git 2.26.2.windows.1juga disarankan untuk tidak melakukan staging:

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)

( Posting ini menunjukkan, bahwa dalam versi sebelumnya git reset HEADdirekomendasikan pada saat ini)

Saya sangat merekomendasikan posting ini menjelaskan perbedaan antara git revert, git restoredan git resetdan juga parameter tambahan untuk git restore.

Ruik
sumber
1

Jika Anda membuat perubahan pada banyak file yang dilacak tetapi hanya ingin melakukan beberapa tahapan, lakukan a

git add .

tidak selalu menguntungkan (atau disarankan) - karena ini menggerakkan semua file yang dilacak (beberapa kasus di mana Anda ingin menyimpan perubahan hanya untuk diri sendiri dan tidak ingin mengarahkannya ke repositori jarak jauh).

juga tidak ideal melakukan banyak

git add path/to/file1 path/to/file2

jika Anda memiliki banyak direktori bersarang (yang merupakan kasus di sebagian besar proyek) - akan mengganggu

Saat itulah Git GUI sangat membantu (mungkin hanya waktu saya menggunakannya). Cukup buka Git GUI, itu menunjukkan bagian file bertahap dan tidak bertahap. Pilih file dari bagian panggung yang ingin Anda hapus stage dan tekan

Ctrl+U (untuk windows)

untuk unstage mereka.

rite2hhh
sumber
0

Sampel saya:

$ git status
On branch feature/wildfire/VNL-425-update-wrong-translation
Your branch and 'origin/feature/wildfire/VNL-425-update-wrong-translation' have diverged,
and have 4 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   ShopBack/Source/Date+Extension.swift
    modified:   ShopBack/Source/InboxData.swift
    modified:   ShopBack/en.lproj/Localizable.strings

Seperti yang Anda perhatikan

> Changes to be committed:
>       (use "git reset HEAD <file>..." to unstage)
Khang Azun
sumber
-1

Anda harus berada di direktori file dan kemudian ketik berikut ini ke terminal

git reset HEAD .

Asumsinya adalah Anda hanya perlu mereset satu file.

nevosial
sumber
-4

Untuk membatalkan tahapan semuanya sekaligus, jalankan perintah ini

git reset HEAD -- .
Devendra Verma
sumber
Tidak dapat menambahkan file setelah itu.
Karl Morrison
-10

git checkout -- <file>

Ini berfungsi dengan baik untuk menghapus file dari Staging Area

Juan Ramirez
sumber
4
seperti yang disebutkan di bawah ini, ini mengembalikan perubahan pada file, yang melangkah lebih jauh dari yang ingin OP tuju.
stolli
git rm flie.txt --cached
Juan Ramirez
-11

Dalam kasus saya, saya lakukan

git checkout -- FILE
Maxi Capodacqua
sumber
9
Ini akan mengembalikan perubahan ke file, bukan?
Martin Burch