Mengapa ada dua cara untuk menghapus file dari git?

Terkadang git menawarkan git rm --cached menonaktifkan file, terkadang git reset HEAD file . Kapan harus menggunakan yang mana?

EDIT:

 D:\code\gt2>git init Initialized empty Git repository in D:/code/gt2/.git/ D:\code\gt2>touch a D:\code\gt2>git status # On branch master # # Initial commit # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # a nothing added to commit but untracked files present (use "git add" to track) D:\code\gt2>git add a D:\code\gt2>git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: a # D:\code\gt2>git commit -ma [master (root-commit) c271e05] a 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 a D:\code\gt2>touch b D:\code\gt2>git status # On branch master # Untracked files: # (use "git add <file>..." to include in what will be committed) # # b nothing added to commit but untracked files present (use "git add" to track) D:\code\gt2>git add b D:\code\gt2>git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: b # 
942
03 авг. diatur oleh Senthess 03 Agustus. 2011-08-03 00:50 '11 pada 0:50 2011-08-03 00:50
@ 11 jawaban

git rm --cached <filePath> tidak menghapus file, tetapi sebenarnya menghapus file dari repositori (jika sudah dilakukan sebelumnya), tetapi meninggalkan file di pohon kerja (meninggalkan Anda tanpa pengawasan). file).

git reset -- <filePath> membatalkan semua perubahan tambahan pada file ini.

Namun, jika Anda menggunakan git rm --cached untuk file baru yang ada dalam persiapan git rm --cached , itu akan terlihat seolah-olah Anda baru saja menginstalnya, karena tidak pernah diperbaiki sebelumnya.

1581
03 авг. balasan yang diberikan oleh Ryan Stewart 03 Agu. 2011-08-03 01:03 '11 pada 1:03 2011-08-03 01:03

git rm --cached digunakan untuk menghapus file dari indeks. Dalam kasus ketika file sudah dalam repo, git rm --cached akan menghapus file dari indeks, meninggalkannya di direktori kerja, dan perbaikannya juga akan menghapusnya dari repo. Pada prinsipnya, setelah diperbaiki, Anda tidak akan mentransfer file dan menyimpan salinan lokal.

git reset HEAD file (yang secara default menggunakan flag --mixed ) berbeda ketika, ketika file sudah di repo, ia mengganti versi indeks file dengan referensi ke repo (HEAD), secara efektif tanpa menggunakan modifikasi .

Dalam kasus file tidak berversi, itu akan menonaktifkan seluruh file, karena file itu tidak ada di HEAD. Dalam aspek ini, git reset HEAD file dan git rm --cached sama, tetapi mereka tidak sama (seperti yang dijelaskan dalam kasus file yang sudah di repo)

Why are there 2 ways to unstage a file in git? - tidak pernah ada satu cara untuk melakukan sesuatu di git. ini kecantikannya :)

315
03 авг. jawabannya diberikan manojlds 03 agt . 2011-08-03 02:00 '11 pada pukul 2:00 2011-08-03 02:00

Cukup sederhana:

  • git rm --cached <file> menyebabkan git benar-benar menghentikan file sepenuhnya (meninggalkannya pada sistem file, tidak seperti git rm sederhana *)
  • git reset HEAD <file> membatalkan perubahan yang dilakukan pada file sejak komit terakhir (tetapi tidak mengembalikannya ke sistem file, berbeda dengan apa yang disarankan nama perintah **). File tetap di bawah kontrol versi.

Jika file tersebut sebelumnya tidak ada dalam kontrol versi (mis., Anda tidak memformat file yang baru saja Anda git add untuk pertama kali), maka kedua perintah memiliki efek yang sama, oleh karena itu, penampilan "dua cara untuk melakukan sesuatu ini" ".

* Ingatlah bahwa jawabannya menyebutkan klausa @DrewT tentang file git rm --cached yang sebelumnya terikat ke repositori. Dalam konteks pertanyaan ini, file baru saja ditambahkan dan belum diperbaiki, tidak ada yang perlu dikhawatirkan.

** Saya takut untuk waktu yang sangat lama untuk menggunakan perintah git reset karena namanya - dan hari ini saya sering melihat sintaks untuk memastikan bahwa saya tidak mengacaukan ( pembaruan ): Saya akhirnya menemukan waktu untuk menggeneralisasi penggunaan git reset pada halaman TL; DR , jadi sekarang saya memiliki model mental yang lebih baik tentang cara kerjanya, dan deskripsi singkat ketika saya lupa beberapa detail.)

100
18 окт. Jawabannya diberikan waldyrious 18 Oktober. 2014-10-18 00:16 '14 pada 0:16 2014-10-18 00:16

Utas ini agak lama, tetapi saya masih ingin menambahkan sedikit demo, karena ini masih bukan masalah intuitif:

 me$ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: to-be-added # modified: to-be-modified # deleted: to-be-removed # me$ git reset -q HEAD to-be-added # ok me$ git reset -q HEAD to-be-modified # ok me$ git reset -q HEAD to-be-removed # ok # or alternatively: me$ git reset -q HEAD to-be-added to-be-removed to-be-modified # ok me$ git status # On branch master # Changes not staged for commit: # (use "git add/rm <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: to-be-modified # deleted: to-be-removed # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # to-be-added no changes added to commit (use "git add" and/or "git commit -a") 

git reset HEAD (tanpa -q ) memberikan peringatan tentang file yang dimodifikasi, dan kode keluarnya adalah 1, yang akan dianggap sebagai kesalahan dalam skrip.

Sunting: git checkout HEAD to-be-modified to-be-removed juga berfungsi untuk unstaging, tetapi sepenuhnya menghapus perubahan dari ruang kerja

40
16 апр. Balas diberikan oleh Daniel Alder pada 16 April 2013-04-16 22:00 '13 jam 10 malam 2013-04-16 22:00

jika Anda secara tidak sengaja meletakkan file yang tidak ingin Anda komit, dan ingin memastikan bahwa Anda menyimpan perubahan, Anda juga dapat menggunakan:

 git stash git stash pop 

itu melakukan reset di HEAD dan menerapkan kembali perubahan Anda, memungkinkan Anda untuk mengatur u>git stash ; git checkout -b <feature> ; git stash pop ).

28
10 февр. Balas diberikan oleh ives pada 10 Februari 2015-02-10 20:06 '15 pada 20:06 2015-02-10 20:06

Dua perintah ini memiliki beberapa perbedaan halus jika file ini sudah ada dalam repo dan di bawah kendali versi (direkam sebelumnya, dll.):

  • git reset HEAD <file> menonaktifkan file di komit saat ini.
  • git rm --cached <file> juga git rm --cached <file> menonaktifkan file untuk komitmen selanjutnya. Ini tidak diinstal sampai ditambahkan lagi dengan git add <file> .

Dan satu lagi perbedaan penting:

  • Setelah menjalankan git rm --cached <file> dan klik cabang Anda di komputer jarak jauh, siapa pun yang menarik cabang Anda dari jarak jauh akan menerima file yang SEHARUSNYA dihapus dari foldernya, meskipun dalam pekerjaan lokal Anda mengatur file tersebut hanya berhenti dilihat ( tidak ada secara fisik dihapus dari folder).

Perbedaan terakhir ini penting untuk proyek-proyek yang menyertakan file konfigurasi di mana setiap pengembang dalam tim memiliki konfigurasi yang berbeda (yaitu, url basis, ip atau port yang berbeda), jadi jika Anda menggunakan git rm --cached <file> , menarik cabang Anda, Anda harus secara manual membuat kembali konfigurasi, atau Anda dapat mengirimkannya kepada Anda, dan mereka dapat mengeditnya kembali ke pengaturan ip mereka (dll.), karena menghapus hanya memengaruhi fakta bahwa orang menarik keluar cabang Anda dengan jauh.

15
10 авг. balasan yang diberikan oleh DrewT 10 Agustus. 2014-08-10 23:04 '14 pada 23:04 2014-08-10 23:04

Katakanlah Anda stage seluruh direktori melalui git add <folder> , tetapi Anda ingin mengecualikan file dari daftar bertahap (mis. Daftar yang dihasilkan ketika Anda menjalankan git status ) dan menyimpan perubahan pada file yang dikecualikan (Anda melakukan sesuatu dan tidak siap) untuk berkomitmen, tetapi Anda tidak ingin kehi>

git reset <file>

Ketika Anda menjalankan git status , Anda akan melihat bahwa file apa pun yang Anda reset unstaged staged , dan sisa file yang Anda added masih dalam daftar staged .

8
28 авг. balasan diberikan oleh jiminikiz 28 Agustus. 2015-08-28 19:08 '15 pada 19:08 2015-08-28 19:08

1.

 D:\code\gt2>git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: a 

(gunakan "git rm --cached ..." untuk ketidakstabilan)

  • git adalah sistem pointer

  • Anda tidak memiliki komitmen untuk mengubah pointer ke

  • Satu-satunya cara untuk "membuang file dari ember yang ditunjuk" adalah dengan menghapus file yang Anda katakan git untuk melihat perubahan.

2

 D:\code\gt2>git commit -ma [master (root-commit) c271e05] a 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 a 

git melakukan -ma

  • Anda berkomitmen, diselamatkan

3

 D:\code\gt2>git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: b # 

(gunakan "git reset HEAD ..." untuk memutuskan koneksi)

  • Anda telah melakukan dalam kode Anda sekarang
  • sekarang Anda dapat mengatur u>kembali ke penyimpanan terakhir
7
08 сент. Balas diberikan oleh Timothy LJ Stewart 08 Sep. 2016-09-08 19:26 '16 pada 19:26 2016-09-08 19:26

Saya terkejut tidak ada yang disebutkan git reflog ( http://git-scm.com/docs/git-reflog ):

 # git reflog <find the place before your staged anything> # git reset HEAD@{1} 

reflog adalah riwayat git yang tidak hanya melacak perubahan dalam repo, tetapi juga melacak tindakan pengguna (misalnya, menarik, checkout ke cabang yang berbeda, dll.) dan memungkinkan Anda untuk membatalkan tindakan ini. Karena itu, alih-alih membuang file yang keliru ditempatkan, tempat Anda dapat kembali ke titik di mana Anda tidak membuat file.

Ini mirip dengan git reset HEAD <file> , tetapi dalam beberapa kasus mungkin lebih terperinci.

Maaf - tidak menjawab pertanyaan Anda, tetapi hanya menunjukkan metode lain dari file non-stasioner yang saya gunakan cukup sering (saya, misalnya, menyukai jawaban dari Ryan Stewart dan sangat valid). Saya harap ini membantu.

5
10 февр. Jawaban diberikan oleh Alex pada 10 Februari. 2015-02-10 15:06 '15 pada 15:06 2015-02-10 15:06

Sepertinya saya bahwa git rm --cached <file> menghapus file dari indeks tanpa menghapusnya dari direktori di mana git rm <file> sederhana git rm <file> akan berjalan, seperti halnya OS rm <file> menghapus file dari direktori tanpa menghapus versinya.

3
06 июня '13 в 15:06 2013-06-06 15:06 jawabannya diberikan ernie.cordell 06 Juni 13 di 15:06 2013-06-06 15:06

Untuk mengabaikan seluruh direktori, gunakan rm secara rekursif (-r)

 git rm -r --cached folderpath 
0
18 окт. balasan yang diberikan DevWL 18 Okt 2017-10-18 22:52 '17 pada 10:52 malam 2017-10-18 22:52

Pertanyaan lain tentang tag atau Ajukan pertanyaan