Terkadang git menyarankan git rm --cached
untuk menghapus stage suatu file, terkadang git reset HEAD file
. Kapan saya 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 -m a
[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
#
git rm
bisa kedua tahap sebuah penghapusan dan juga unstage sebuah penambahan )rm
membatalkanadd
? Menurut Anda bagaimanarm
seharusnya bersikap?git init
tidak adaHEAD
untuk diatur ulang.rm
menyiratkan penghapusan dalam konteks unix. Bukan kebalikan dari menambah indeks. Fungsi untuk menghapus file tidak boleh dibebani dengan fungsi untuk mengubah status pementasan. Jika ada detail implementasi yang membuat mereka nyaman untuk digabungkan, itu hanya menunjuk pada kurangnya lapisan abstraksi di git, yang akan membuat kegunaan lebih jelas.Jawaban:
git rm --cached <filePath>
tidak menghapus suatu file, itu sebenarnya tahapan penghapusan file dari repo (dengan asumsi itu sudah dilakukan sebelumnya) tetapi meninggalkan file di pohon kerja Anda (meninggalkan Anda dengan file yang tidak dilacak).git reset -- <filePath>
akan menghapus tahapan perubahan bertahap untuk file yang diberikan.Yang mengatakan, jika Anda menggunakan
git rm --cached
file baru yang dipentaskan, itu pada dasarnya akan terlihat seperti Anda baru saja tidak dipentaskan karena tidak pernah dilakukan sebelumnya.Perbarui git 2.24
Dalam versi ini lebih baru dari git Anda dapat menggunakan
git restore --staged
bukangit reset
. Lihat git docs .sumber
git rm --cached
unstages file tetapi tidak menghapusnya dari direktori kerja.git rm --cached <filePath>
untuk menghapus beberapa file dari repo setelah menyadarinya seharusnya tidak pernah dalam repo: jadi kemungkinan besar menjalankan perintah ini & kemudian menambahkan file yang relevan kegitignore
. Apakah saya benar?unstage
perintahgit
.git rm --cached
digunakan untuk menghapus file dari indeks. Dalam kasus di mana file sudah di repo,git rm --cached
akan menghapus file dari indeks, meninggalkannya di direktori kerja dan komit sekarang akan menghapusnya dari repo juga. Pada dasarnya, setelah komit, Anda akan membatalkan versi file dan menyimpan salinan lokal.git reset HEAD file
(yang secara default menggunakan--mixed
flag) berbeda dalam hal di mana file sudah dalam repo, ia mengganti versi indeks file dengan yang dari repo (KEPALA), efektif membatalkan modifikasi untuk itu.Dalam hal file tidak berversi, itu akan menghapus stage seluruh file karena file itu tidak ada di HEAD. Dalam aspek ini
git reset HEAD file
dangit rm --cached
sama, tetapi mereka tidak sama (seperti yang dijelaskan dalam kasus file yang sudah di repo)Untuk pertanyaan
Why are there 2 ways to unstage a file in git?
- tidak pernah ada satu cara untuk melakukan apapun di git. itulah keindahannya :)sumber
there is never really only one way to do anything in git. that is the beauty of it
- Hmm ... kenapa? itu selalu hebat, ketika hanya ada satu cara yang jelas. ini menghemat banyak waktu dan ingatan kita di otak))Cukup sederhana:
git rm --cached <file>
membuat git berhenti melacak file sepenuhnya (meninggalkannya di sistem file, tidak seperti biasagit rm
*)git reset HEAD <file>
hapus tahapan modifikasi apa pun yang dilakukan pada file sejak komit terakhir (tetapi tidak mengembalikannya dalam sistem file, bertentangan dengan apa yang mungkin disarankan nama perintah **). File tetap di bawah kendali revisi.Jika file tidak dalam kontrol revisi sebelumnya (yaitu Anda menghapus stage file yang baru saja Anda
git add
edit untuk pertama kali), maka kedua perintah memiliki efek yang sama, maka penampilan ini menjadi "dua cara melakukan sesuatu ".* Ingatlah peringatan @DrewT menyebutkan dalam jawabannya, tentang
git rm --cached
file yang sebelumnya dikomit ke repositori. Dalam konteks pertanyaan ini, dari file yang baru saja ditambahkan dan belum dilakukan, tidak ada yang perlu dikhawatirkan.** Saya takut untuk waktu yang lama dan memalukan untuk menggunakan perintah git reset karena namanya - dan masih hari ini saya sering mencari sintaks untuk memastikan saya tidak mengacau. ( pembaruan : Saya akhirnya meluangkan waktu untuk meringkas penggunaan
git reset
dalam halaman tldr , jadi sekarang saya memiliki model mental yang lebih baik tentang cara kerjanya, dan referensi cepat ketika saya lupa beberapa detail.)sumber
git rm <file> --cached
rm --cached
dan mendorong, siapa pun yang menarik cabang yang sama akan benar-benar menghapus file dari pohon kerjanya.Utas ini agak lama, tetapi saya masih ingin menambahkan sedikit demonstrasi karena masih bukan masalah intuitif:
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 menghapus stage, tetapi menghapus perubahan sepenuhnya dari ruang kerjaPerbarui git 2.23.0: Dari waktu ke waktu, perintah berubah. Sekarang,
git status
katakan:... yang berfungsi untuk ketiga jenis perubahan
sumber
jika Anda secara tidak sengaja melakukan pementasan file yang tidak ingin Anda komit, dan ingin memastikan Anda menyimpan perubahannya, Anda juga dapat menggunakan:
ini melakukan reset ke HEAD dan menerapkan kembali perubahan Anda, memungkinkan Anda untuk mem-stage ulang file individu untuk komit. ini juga membantu jika Anda lupa membuat cabang fitur untuk permintaan tarik (
git stash ; git checkout -b <feature> ; git stash pop
).sumber
git stash
memiliki manfaat terkait lainnya, karena membuat entri di reflog yang kemudian tersedia di masa depan. ketika ragu, silakan dan lakukangit stash
(misalnyagit stash save -u "WIP notes to self"
('-u' adalah untuk memasukkan file baru / tidak terlacak dalam komit simpanan) ... kemudian cobalahgit reflog show stash
untuk melihat daftar komit simpanan dan sha mereka. Saya sarankan shell alias sukaalias grs="git reflog show stash"
2 perintah ini memiliki beberapa perbedaan halus jika file tersebut sudah dalam repo dan di bawah kontrol versi (sebelumnya dilakukan dll):
git reset HEAD <file>
hapus stage file di komit saat ini.git rm --cached <file>
akan membatalkan pentahapan file untuk komitmen selanjutnya. Ini tidak dipentaskan hingga ditambahkan lagi dengangit add <file>
.Dan ada satu lagi perbedaan penting:
git rm --cached <file>
dan mendorong cabang Anda ke jarak jauh, siapa pun yang menarik cabang Anda dari jarak jauh akan mendapatkan file SEBENARNYA dihapus dari folder mereka, meskipun di set kerja lokal Anda file hanya menjadi tidak terlacak (yaitu secara fisik tidak dihapus dari folder).Perbedaan terakhir ini penting untuk proyek-proyek yang menyertakan file konfigurasi di mana setiap pengembang di tim memiliki konfigurasi yang berbeda (yaitu url basis, pengaturan ip atau port yang berbeda) sehingga jika Anda menggunakan
git rm --cached <file>
siapa pun yang menarik cabang Anda harus secara manual mengulangi buat config, atau Anda dapat mengirimkan milik Anda kepada mereka dan mereka dapat mengeditnya kembali ke pengaturan ip mereka (dll.), karena hanya menghapus efek orang yang menarik cabang Anda dari jarak jauh.sumber
Katakanlah Anda
stage
seluruh direktori melaluigit add <folder>
, tetapi Anda ingin mengecualikan file dari daftar bertahap (yaitu daftar yang menghasilkan saat menjalankangit status
) dan menyimpan modifikasi dalam file yang dikecualikan (Anda sedang mengerjakan sesuatu dan itu tidak siap untuk komit, tetapi Anda tidak ingin kehilangan pekerjaan Anda ...). Anda cukup menggunakan:git reset <file>
Ketika Anda menjalankan
git status
, Anda akan melihat bahwa file apa pun yang Andareset
milikiunstaged
dan sisa fileadded
yang masih ada dalamstaged
daftar.sumber
1.
(gunakan "git rm --cached ..." untuk unstage)
git adalah sistem pointer
Anda belum memiliki komit untuk mengubah pointer Anda
satu-satunya cara untuk 'mengeluarkan file dari bucket yang sedang diarahkan' adalah dengan menghapus file yang Anda beri tahu git untuk melihat perubahan
2.
git melakukan -ma
3.
(gunakan "git reset HEAD ..." untuk unstage)
sumber
git init
untuk pertama kalinya.Saya terkejut tidak ada yang menyebutkan reflit git ( http://git-scm.com/docs/git-reflog ):
Reflog adalah riwayat git yang tidak hanya melacak perubahan pada repo, tetapi juga melacak tindakan pengguna (Misalnya tarikan, checkout ke cabang yang berbeda, dll) dan memungkinkan untuk membatalkan tindakan tersebut. Jadi, alih-alih menghapus file yang dipentaskan secara salah, di mana Anda dapat kembali ke titik di mana Anda tidak menampilkan file.
Ini mirip dengan
git reset HEAD <file>
tetapi dalam kasus-kasus tertentu mungkin lebih rinci.Maaf - tidak benar-benar menjawab pertanyaan Anda, tetapi hanya menunjuk cara lain untuk meng-unstage file yang saya gunakan cukup sering (I untuk satu seperti jawaban oleh Ryan Stewart dan sangat banyak.);) Saya harap ini membantu.
sumber
Cukup gunakan:
git reset HEAD <filename>
Ini menghapus panggung file dan membuat perubahan yang Anda lakukan padanya, sehingga Anda dapat, pada gilirannya, mengubah cabang jika Anda ingin dan
git add
file-file itu ke cabang lain sebagai gantinya. Semua perubahan disimpan.sumber
Sepertinya saya yang
git rm --cached <file>
menghapus file dari indeks tanpa menghapusnya dari direktori di mana sebuah plaingit rm <file>
akan melakukan keduanya, seperti halnya OSrm <file>
akan menghapus file dari direktori tanpa menghapus versinya.sumber
Hanya untuk versi 2.23 dan lebih baru,
Alih-alih saran ini, Anda dapat menggunakan
git restore --staged <file>
untukunstage
file.sumber
--stage
maupun--staged
.