“Git rm --cached x” vs “git reset head - x”?

163

GitRef.org - Dasar :

git rmakan menghapus entri dari area pementasan. Ini agak berbeda darigit reset HEAD file "unstages". Maksud saya "unstage", maksud saya ini akan mengembalikan area pementasan ke apa yang ada di sana sebelum kita mulai memodifikasi berbagai hal. git rmdi sisi lain hanya menendang file dari panggung sepenuhnya, sehingga tidak termasuk dalam snapshot komit berikutnya, sehingga secara efektif menghapusnya.

Secara default, a git rm file akan menghapus file sepenuhnya dari area pementasan dan juga dari disk Anda> (direktori kerja). Untuk meninggalkan file di direktori kerja, Anda dapat menggunakan git rm --cached.

Tapi apa sebenarnya perbedaan antara git rm --cached asddan git reset head -- asd?

Pacerier
sumber

Jawaban:

219

Ada tiga tempat di mana file, katakanlah, dapat - pohon, indeks dan copy pekerjaan. Saat Anda baru saja menambahkan file ke folder, Anda menambahkannya ke copy pekerjaan.

Ketika Anda melakukan sesuatu seperti git add fileAnda menambahkannya ke indeks. Dan ketika Anda melakukan itu, Anda menambahkannya ke pohon juga.

Mungkin akan membantu Anda mengetahui tiga flag yang lebih umum di git reset:

reset git [- <mode>] [ <commit>]

Formulir ini mengatur ulang kepala cabang saat ini ke <commit>dan mungkin memperbarui indeks (mengatur ulang ke pohon <commit>) dan pohon yang bekerja tergantung pada <mode>, yang harus menjadi salah satu dari yang berikut:
--soft

Tidak menyentuh file indeks atau pohon kerja sama sekali (tetapi me-reset kepala ke <commit>, sama seperti semua mode lakukan). Ini membuat semua file Anda yang diubah "Perubahan untuk dikomit", seperti yang dikatakan status git.

--Campuran

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.

--keras

Atur ulang indeks dan pohon kerja. Setiap perubahan pada file yang dilacak di pohon kerja sejak <commit>dibuang.

Sekarang, ketika Anda melakukan sesuatu seperti git reset HEAD- apa yang sebenarnya Anda lakukan adalah git reset HEAD --mixeddan itu akan "mereset" indeks ke keadaan sebelum Anda mulai menambahkan file / menambahkan modifikasi ke indeks (via git add) Dalam hal ini, copy pekerjaan dan indeks (atau pementasan) sinkron, tetapi Anda membuat HEAD dan indeks untuk sinkron setelah reset.

git rmdi sisi lain menghapus file dari direktori yang berfungsi dan indeks dan ketika Anda melakukan, file tersebut dihapus dari pohon juga. git rm --cachednamun menghapus file dari indeks saja dan menyimpannya di copy pekerjaan Anda. Ini adalah kebalikan dari git add file Dalam hal ini, Anda membuat indeks berbeda dari HEAD dan yang berfungsi, di dalamnya HEAD memiliki versi file yang sebelumnya dikomit, copy pekerjaan memiliki modifikasi terakhir jika ada atau konten dari HEAD dari file dan Anda menghapus file dari indeks. Komit sekarang akan menyinkronkan indeks dan struktur dan file akan dihapus.

manojlds
sumber
Saya melihat bahwa setelah git rm --cacheditu git diffperintah tidak menunjukkan diff, tetapi git diff --cachedmenunjukkan diff, seolah-olah masih cache. The git statusnamun menunjukkan file sebagai Untracked. Sepertinya tidak konsisten.
haridsv
7
Sudahlah ... Aku seharusnya menggunakannya git reset --mixed. Saya sedikit bingung dengan pernyataan yang git rm --cachedbertolak belakanggit add . Diambil secara harfiah, itu tidak benar dan dapat menyebabkan kerusakan. Dalam kasus saya, saya biasa git addmenambahkan file yang dimodifikasi ke area pementasan dan ingin kebalikan dari "yang menambahkan" bukan penambahan awal file. + Jawaban Greg Hewgill membantu saya mendapatkan gambaran yang lebih jelas.
haridsv
12
Saya menemukan penggunaan copy pekerjaan, pohon, dan pohon kerja sedikit membingungkan. Apakah pohon yang berfungsi itu copy pekerjaan, atau pohon?
Nealv
3
Seperti @haridsv sebutkan, mengatakan git rm --cached'adalah kebalikan dari git add file' menyesatkan. git reset filelebih dekat menjadi kebalikan dari git add file.
Matt Browne
@Nealv terlambat, tetapi untuk orang lain yang menemukan utas ini: copy pekerjaan, pohon, dan pohon kerja semua merujuk pada hal yang sama (dalam konteks git).
De Novo
83

Mungkin sebuah contoh akan membantu:

git rm --cached asd
git commit -m "the file asd is gone from the repository"

melawan

git reset HEAD -- asd
git commit -m "the file asd remains in the repository"

Perhatikan bahwa jika Anda belum mengubah apa pun , komit kedua tidak akan benar-benar melakukan apa pun.

Greg Hewgill
sumber
3
Dapatkah Anda memberi tahu saya apa arti tanda hubung ganda itu - setelah HEAD sebenarnya artinya?
Yuva
30
@yuva: --Digunakan untuk memisahkan opsi perintah dari nama file. Jika ada cabang dan file bernama asd, maka git reset HEAD asdakan ambigu. The --mengatakan "semuanya berikut ini adalah nama file".
Greg Hewgill
Apakah git reset HEAD <file>persis sama dengan git rm --cached <file>dulu git add --intent-to-add <file>?
Alkohol itu jahat
1
@alcoholisevil tidak, kecuali dalam kasus khusus. Lihat ini sangat baik, jawaban ringkas.
De Novo
45

git rm --cached fileakan menghapus file dari atas panggung. Yaitu, ketika Anda mengkomit file akan dihapus. git reset HEAD -- filehanya akan mengatur ulang file di area pementasan ke status di mana ia berada di komit HEAD, yaitu akan membatalkan perubahan yang Anda lakukan padanya sejak komit terakhir. Jika perubahan itu terjadi baru menambahkan file, maka mereka akan setara.

yurik
sumber
7
Dalam hubungannya dengan gagasan (sebagaimana disebutkan dalam jawaban lain) yang git rm --cached fileagak berlawanan git add, jawaban ini sangat masuk akal bagi saya, dan cukup ringkas. Hampir sesingkat komentar ini;)
rbatt
2
@ rbatt hanya untuk menaruh komentar di sini juga, dan mengklarifikasi, git rm --cached filebukan kebalikan darigit add file . Perilaku terjadi kebalikan dari git add filedalam kasus tertentu di mana Anda telah menambahkan file baru, yang sebelumnya tidak terlacak. Dalam setiap kasus kebalikannya git add fileadalah git reset HEAD file. git reset HEAD filejuga membalik git add filedalam kasus pertama (menambahkan file yang tidak terlacak), dan dalam setiap kasus, itulah sebabnya git menyarankan untuk dilakukan jika Anda ingin membalikkan git add.
De Novo