Mengapa menggunakan 'git rm' untuk menghapus file, bukan 'rm'?

171

Pada SVN, menghapus sesuatu dari sistem file secara langsung (daripada menggunakan svn) menciptakan banyak sakit kepala.

Saya belum menemukan ini menjadi masalah ketika menggunakan git, tapi saya perhatikan bahwa git memiliki rmimplementasi sendiri ( git rm).

Apa perbedaan antara rmdan git rm?

cjm2671
sumber

Jawaban:

253

Jika Anda hanya menggunakan rm, Anda harus menindaklanjutinya git add <fileRemoved>. git rmlakukan ini dalam satu langkah.

Anda juga dapat menggunakan git rm --cachedyang akan menghapus file dari indeks (staging untuk dihapus pada komit berikutnya), tetapi simpan salinan Anda di sistem file lokal.

Andy
sumber
Jawaban yang bagus. Saya dapat menggunakan git reset --harddan kemudian melakukan checkout master untuk keluar dari keadaan kepala yang terpisah karena saya tahu saya tidak memiliki perubahan yang tidak dikomit. Jika Anda belum melakukan perubahan, Anda mungkin ingin melakukan git simpanan, tapi saya relatif baru untuk git jadi saya tidak tahu perintah yang tepat. Jika Anda datang ke sini pada atau setelah 2014, saya harap jawaban ini bermanfaat bagi Anda.
Eric Hepperle - CodeSlayer2010
@Andy - Jika saya menggunakan rm(bukan git rm) dan menghapus banyak file yang menggunakannya, dan sekarang tidak ingin gitmelacaknya. Apakah ada cara untuk mengembalikan perubahan? Saya ingin gitmenginjak saya rmsebagai dihapus karena saya tidak menggunakan git rmdi tempat pertama.
Chetan Arvind Patil
Akan lebih baik jika ini dijabarkan dengan jelas di dokumen online (mungkin ada di sana, tetapi jelas tidak jelas atau pertanyaan ini tidak akan ditanyakan). Akan lebih baik bagi pengguna untuk mengetahui bahwa mereka tidak melakukan kesalahan jika mereka menggunakan rute OS rm. Dan ada alasan untuk memilih rute OS. Misalnya, jika Anda perlu menghapus file untuk menguji apakah sesuatu berfungsi sebelum melakukan perubahan, rute OS sedikit lebih aman daripada menggunakan git rm, seperti dalam kasus git Anda harus membatalkan tahapan tindakan, sedangkan pada opsi OS Anda hanya perlu untuk mengambil (saya percaya).
bob
12

Menghapus file menggunakan rmbukan masalah, tetapi jika Anda kemudian ingin melakukan bahwa file itu dihapus, Anda harus git rmtetap melakukan, jadi Anda mungkin melakukannya seperti itu langsung dari kelelawar.

Selain itu, tergantung pada shell Anda, melakukan git rmsetelah menghapus file, Anda tidak akan mendapatkan penyelesaian tab sehingga Anda harus menguraikan jalurnya sendiri, sedangkan jika Anda git rmsementara file tersebut masih ada, penyelesaian tab akan berfungsi seperti biasa.

hammar
sumber
7

git rmakan menghapus file dari indeks dan direktori kerja (hanya indeks jika Anda menggunakan --cached) sehingga penghapusan dipentaskan untuk komit berikutnya.

manojlds
sumber
4

Namun, jika Anda menggunakan rm alih-alih git rm. Anda dapat melewati git add dan langsung melakukan perubahan menggunakan:

git commit -a

Perjuangan
sumber
3

Hapus file dari indeks, atau dari pohon kerja dan indeks. git rm tidak akan menghapus file hanya dari direktori kerja Anda.

Inilah cara Anda menghapus file menggunakan rm -fdan kemudian menghapusnya dari indeks Anda dengangit rm

$ rm -f index.html
$ git status -s
 D index.html
$ git rm index.html
rm 'index.html'
$ git status -s
D  index.html

Namun Anda dapat melakukan ini semua hanya dengan satu saja git rm

$ git status -s
$ git rm index.html
rm 'index.html'
$ ls
lib vendor
$ git status -s
D  index.html
basicxman
sumber
2

Saat menggunakan git rm, penghapusan akan menjadi bagian dari komit Anda selanjutnya. Jadi, jika Anda ingin menekan perubahan Anda harus menggunakan git rm

Keis
sumber
2

Menambah jawaban Andy, ada utilitas tambahan untuk git rm:

  1. Keamanan : Saat melakukan git rmalih - alih rm, Git akan memblokir penghapusan jika ada perbedaan antara HEADversi file dan indeks pementasan atau versi pohon yang berfungsi. Blok ini adalah mekanisme keamanan untuk mencegah penghapusan perubahan yang sedang berlangsung.

  2. Pengamanan : git rm --dry-run. Opsi ini adalah perlindungan yang akan menjalankan git rmperintah tetapi tidak benar-benar menghapus file. Sebaliknya itu akan menampilkan file mana yang akan dihapus.

Joe
sumber