Saya keliru menambahkan file ke Git menggunakan perintah:
git add myfile.txt
Saya belum lari git commit
. Apakah ada cara untuk membatalkan ini, sehingga file-file ini tidak akan dimasukkan dalam komit?
git
version-control
git-commit
git-stage
paxos1977
sumber
sumber
HEAD
atauhead
sekarang dapat menggunakan@
di tempatHEAD
sebaliknya. Lihat jawaban ini (bagian terakhir) untuk mempelajari mengapa Anda bisa melakukan itu.git checkout
tidak menghapus perubahan bertahap dari indeks komit. Ini hanya mengembalikan perubahan yang tidak dipentaskan ke revisi yang dilakukan terakhir - yang omong-omong bukan apa yang saya inginkan juga, saya ingin perubahan itu, saya hanya ingin mereka di komit kemudian.Jawaban:
Anda dapat membatalkan
git add
sebelum komit denganyang akan menghapusnya dari indeks saat ini (daftar "akan dilakukan") tanpa mengubah apa pun.
Kamu bisa menggunakan
tanpa nama file apa pun untuk menghapus tahapan perubahan yang terjadi. Ini bisa berguna ketika ada terlalu banyak file untuk dicantumkan satu per satu dalam jumlah waktu yang wajar.
Dalam versi lama Git, perintah di atas setara dengan
git reset HEAD <file>
dangit reset HEAD
masing - masing, dan akan gagal jikaHEAD
tidak terdefinisi (karena Anda belum membuat komitmen di repositori Anda) atau ambigu (karena Anda membuat cabang bernamaHEAD
, yang merupakan hal bodoh yang tidak seharusnya Anda lakukan). Ini diubah di Git 1.8.2 , jadi, di Git versi modern Anda dapat menggunakan perintah di atas bahkan sebelum membuat komit pertama Anda:sumber
git add
menimpa versi uncommited yang dipentaskan sebelumnya, kami tidak dapat memulihkannya. Saya mencoba menjelaskan ini dalam jawaban saya di bawah.git reset HEAD *.ext
di manaext
file dari ekstensi yang diberikan ingin Anda hapus. Bagi saya itu*.bmp
&*.zip
git rm --cached
) itu berarti Anda sedang bersiap untuk membuat komit yang menghapus file itu.git reset HEAD <filename>
di sisi lain akan menyalin file dari KEPALA ke indeks, sehingga komit berikutnya tidak akan menunjukkan perubahan yang dibuat untuk file itu.git reset -p
seperti itugit add -p
. Ini luar biasa!git add
Anda ingin memulihkan (61/3AF3...
- > object id613AF3...
), lalugit cat-file -p <object-id>
(mungkin layak untuk memulihkan beberapa jam kerja tetapi juga pelajaran untuk melakukan lebih sering ...)Kamu ingin:
Pemikiran:
Ketika saya masih baru dalam hal ini, saya pertama kali mencoba
(untuk membatalkan seluruh penambahan awal saya), hanya untuk mendapatkan pesan bermanfaat ini (tidak begitu):
Ternyata ini karena HEAD ref (branch?) Tidak ada sampai setelah komit pertama. Artinya, Anda akan mengalami masalah pemula yang sama dengan saya jika alur kerja Anda, seperti milik saya, adalah sesuatu seperti:
git init
git add .
git status
... banyak gulungan omong kosong oleh ...
=> Sial, saya tidak ingin menambahkan semua itu.
google "undo git add"
=> temukan Stack Overflow - yay
git reset .
=> fatal: Gagal menyelesaikan 'KEPALA' sebagai referensi yang valid.
Lebih lanjut ternyata ada bug yang dicatat karena tidak membantu hal ini di milis.
Dan bahwa solusi yang tepat ada di sana di keluaran status Git (yang, ya, saya anggap sebagai 'omong kosong)
Dan solusinya adalah menggunakan
git rm --cached FILE
.Catat peringatan di tempat lain di sini -
git rm
menghapus salinan file lokal yang berfungsi, tetapi tidak jika Anda menggunakan --cached . Inilah hasil darigit help rm
:Saya mulai menggunakan
untuk menghapus semuanya dan mulai lagi. Namun tidak berhasil, karena sementara
add .
bersifat rekursif, ternyatarm
perlu-r
berulang. Mendesah.Oke, sekarang saya kembali ke tempat saya mulai. Lain kali saya akan gunakan
-n
untuk melakukan dry run dan melihat apa yang akan ditambahkan:Saya zip semuanya ke tempat yang aman sebelum percaya
git help rm
tentang--cached
tidak menghancurkan apa-apa (dan bagaimana jika saya salah mengeja itu).sumber
rm -rf .git
,git init
karena saya tidak percayagit rm --cached
untuk menyimpan copy pekerjaan saya. Dikatakan sedikit bagaimana git masih terlalu kompleks di beberapa tempat.git unstage
seharusnya hanya perintah standar stok, saya tidak peduli jika saya bisa menambahkannya sebagai alias.git reset HEAD <File>...
git add
perintah menambahkan file baru, tetapi tidak berubah ke file yang ada.Jika Anda mengetik:
Git akan memberi tahu Anda apa yang dipentaskan, dll., Termasuk instruksi tentang cara unstage:
Saya menemukan Git melakukan pekerjaan yang cukup baik untuk mendorong saya untuk melakukan hal yang benar dalam situasi seperti ini.
Catatan: Versi terbaru Git (1.8.4.x) telah mengubah pesan ini:
sumber
add
file ed sudah dilacak (add
satu - satunya menyimpan versi baru ke cache - di sini akan ditampilkan pesan Anda). Di tempat lain, jika file itu sebelumnya tidak dipentaskan, itu akan menampilkanuse "git rm --cached <file>..." to unstage
git reset HEAD <file>
ini adalah satu-satunya yang akan bekerja jika Anda ingin menghapusgit reset HEAD
untuk unstage.Untuk memperjelas:
git add
memindahkan perubahan dari direktori kerja saat ini ke area pementasan (indeks).Proses ini disebut pementasan . Jadi perintah yang paling alami untuk melakukan perubahan (file yang diubah) adalah yang jelas:
git add
hanya alias yang lebih mudah diketik untukgit stage
Sayang sekali tidak ada perintah
git unstage
atau pun tidakgit unadd
. Yang relevan lebih sulit untuk ditebak atau diingat, tetapi cukup jelas:Kami dapat dengan mudah membuat alias untuk ini:
Dan akhirnya, kami memiliki perintah baru:
Secara pribadi saya menggunakan alias yang lebih pendek:
sumber
git stage
adalah alias untukgit add
, yang merupakan perintah bersejarah, baik pada Git dan SCM lainnya. Telah ditambahkan pada bulan Desember 2008 dengan komit 11920d28da di "Git's git repository", jika saya bisa mengatakannya.Tambahan untuk jawaban yang diterima, jika file Anda yang keliru ditambahkan sangat besar, Anda mungkin akan melihat bahwa, bahkan setelah menghapusnya dari indeks dengan '
git reset
', tampaknya masih menempati ruang dalam.git
direktori.Ini tidak perlu dikhawatirkan; file tersebut memang masih dalam repositori, tetapi hanya sebagai "objek longgar". Itu tidak akan disalin ke repositori lain (melalui klon, push), dan ruang akhirnya akan direklamasi - meskipun mungkin tidak segera. Jika Anda cemas, Anda dapat menjalankan:
Pembaruan (yang berikut adalah upaya saya untuk menghapus beberapa kebingungan yang dapat timbul dari jawaban yang paling banyak dipilih):
Jadi, yang merupakan nyata undo dari
git add
?git reset HEAD <file>
?atau
git rm --cached <file>
?Sebenarnya, dan jika saya tidak salah: tidak ada .
git add
tidak dapat dibatalkan - dengan aman, secara umum.Mari kita ingat dulu apa yang
git add <file>
sebenarnya dilakukannya:Jika
<file>
itu sebelumnya tidak dilacak ,git add
menambahkan ke cache , dengan konten saat ini.Jika
<file>
itu sudah dilacak ,git add
menyimpan konten saat ini (snapshot, versi) ke cache. Di Git, tindakan ini masih disebut add , (bukan sekadar memperbaruinya ), karena dua versi (snapshot) file yang berbeda dianggap sebagai dua item berbeda: karenanya, kami memang menambahkan item baru ke cache, untuk menjadi yang terakhir dilakukan nanti.Sehubungan dengan ini, pertanyaannya sedikit ambigu:
Skenario OP tampaknya menjadi yang pertama (file tidak terlacak), kami ingin "undo" menghapus file (bukan hanya konten saat ini) dari item yang dilacak. Jika ini masalahnya, maka tidak masalah untuk dijalankan
git rm --cached <file>
.Dan kita juga bisa lari
git reset HEAD <file>
. Secara umum ini lebih disukai, karena bekerja di kedua skenario: itu juga membatalkan ketika kami salah menambahkan versi dari item yang sudah dilacak.Tetapi ada dua peringatan.
Pertama: Ada (seperti yang ditunjukkan dalam jawaban) hanya satu skenario di mana
git reset HEAD
tidak berfungsi, tetapigit rm --cached
tidak: repositori baru (tidak ada komitmen). Tapi, sungguh, ini kasus yang praktis tidak relevan.Kedua: Sadarilah bahwa
git reset HEAD
tidak dapat secara ajaib memulihkan konten file yang sebelumnya di-cache, itu hanya menyinkronkannya kembali dari KEPALA. Jika salah kaprah kamigit add
menimpa versi tidak berkomitmen yang dipentaskan sebelumnya, kami tidak dapat memulihkannya. Karena itulah, sebenarnya, kami tidak dapat membatalkan [*].Contoh:
Tentu saja, ini tidak terlalu kritis jika kita hanya mengikuti alur kerja malas melakukan 'git add' hanya untuk menambahkan file baru (kasus 1), dan kami memperbarui konten baru melalui komit,
git commit -a
perintah.* (Sunting: di atas secara praktis benar, tetapi masih ada beberapa cara yang agak retas / berbelit-belit untuk memulihkan perubahan yang dipentaskan, tetapi tidak dilakukan dan kemudian ditimpa - lihat komentar oleh Johannes Matokic dan iolsmit)
sumber
git cat-file
dapat digunakan untuk memulihkan kontennya.git add
adalah melaluigit fsck --unreachable
itu akan mendaftar semua objek yang tidak dapat dijangkau, yang kemudian dapat Anda periksa dengangit show SHA-1_ID
ataugit fsck --lost-found
yang akan> Menulis objek menggantung ke dalam.git/lost-found/commit/
atau.git/lost-found/other/
, tergantung pada jenisnya. Lihat jugagit fsck --help
Membatalkan file yang sudah ditambahkan cukup mudah menggunakan Git. Untuk mengatur ulang
myfile.txt
, yang telah ditambahkan, gunakan:Penjelasan:
Setelah Anda mengatur file yang tidak diinginkan, untuk membatalkan, Anda dapat melakukannya
git reset
.Head
adalah kepala file Anda di lokal dan parameter terakhir adalah nama file Anda.Saya telah membuat langkah-langkah pada gambar di bawah ini secara lebih rinci untuk Anda, termasuk semua langkah yang mungkin terjadi dalam kasus ini:
sumber
akan "un-add" semua yang Anda tambahkan dari direktori Anda saat ini secara rekursif
sumber
git reset HEAD <file>
akan mengatakanfatal: Failed to resolve 'HEAD' as a valid ref.
Lari
dan hapus semua file secara manual atau dengan memilih semuanya dan mengklik unstage dari tombol komit .
sumber
git-gui
...." :)Git memiliki perintah untuk setiap tindakan yang dapat dibayangkan, tetapi membutuhkan pengetahuan yang luas untuk memperbaiki segala sesuatunya dan karena itu kontra-intuitif paling baik ...
Apa yang Anda lakukan sebelumnya:
git add .
, ataugit add <file>
.Apa maumu:
Hapus file dari indeks, tetapi tetap versi dan kiri dengan perubahan yang tidak dikomit dalam copy pekerjaan:
Setel ulang file ke status terakhir dari HEAD, batalkan perubahan dan hapus dari indeks:
Ini diperlukan karena
git reset --hard HEAD
tidak akan berfungsi dengan file tunggal.Hapus
<file>
dari indeks dan versi, menjaga file tidak versi dengan perubahan dalam copy pekerjaan:Hapus
<file>
dari copy pekerjaan dan versi sepenuhnya:sumber
reset head
batalkan perubahan Anda saat ini, tetapi file tersebut masih dipantau oleh git.rm --cached
mengeluarkan file dari versi, jadi git tidak lagi memeriksanya untuk perubahan (dan juga menghapus perubahan sekarang yang diindeks, disuruh git oleh yang sebelumnyaadd
), tetapi file yang diubah akan disimpan dalam copy pekerjaan Anda, yaitu di folder file Anda pada HDD.git reset HEAD <file>
sementara - perintah hanya akan diterapkan pada komit berikutnya, tetapigit rm --cached <file>
akan menghapus tahapan sampai ditambahkan lagi dengangit add <file>
. Juga,git rm --cached <file>
berarti jika Anda mendorong cabang itu ke remote, siapa pun yang menarik cabang itu akan menghapus file yang SEBENARNYA dari folder mereka.Pertanyaannya tidak diajukan dengan jelas. Alasannya adalah
git add
ada dua makna:git rm --cached file
.git reset HEAD file
.Jika ragu, gunakan
Karena melakukan hal yang diharapkan dalam kedua kasus.
Peringatan: jika Anda melakukannya
git rm --cached file
pada file yang diubah (file yang sudah ada sebelumnya di repositori), maka file tersebut akan dihapus padagit commit
! Itu masih akan ada di sistem file Anda, tetapi jika orang lain menarik komit Anda, file tersebut akan dihapus dari pohon kerja mereka.git status
akan memberi tahu Anda jika file itu file baru atau diubah :sumber
git rm --cached somefile
. Saya berharap jawaban ini membuat jalan ke halaman ke posisi yang menonjol di mana ia dapat melindungi pemula dari disesatkan oleh semua klaim palsu.Jika Anda berada di komit awal dan tidak dapat digunakan
git reset
, cukup nyatakan "Git kebangkrutan" dan hapus.git
folder dan mulai lagi dari awalsumber
git add -A && git rm --cached EXCLUDEFILE && git commit -m 'awesome commit'
(Ini juga berfungsi ketika tidak ada komit sebelumnya, ulangFailed to resolve 'HEAD'
masalah)Sesuai dengan banyak jawaban lain, Anda dapat menggunakan
git reset
TAPI:
Saya menemukan posting kecil yang hebat ini yang benar-benar menambahkan perintah Git (well, alias) untuk
git unadd
: lihat git unadd untuk detail atau ..Secara sederhana,
Sekarang kamu bisa
sumber
Gunakan
git add -i
untuk menghapus file yang baru saja ditambahkan dari komit Anda yang akan datang. Contoh:Menambahkan file yang tidak Anda inginkan:
Masuk ke add interaktif untuk membatalkan add Anda (perintah yang diketik di git di sini adalah "r" (revert), "1" (entri pertama dalam daftar revert shows), 'kembali' untuk keluar dari mode revert, dan "q" (berhenti):
Itu dia! Ini buktinya, menunjukkan bahwa "foo" kembali ke daftar yang tidak terlacak:
sumber
git remove
ataugit rm
dapat digunakan untuk ini, dengan--cached
bendera. Mencoba:sumber
git rm --cached ...
akan menghapus file dari repo git. Mereka masih akan ada di komputer Anda, tetapi ini SANGAT berbeda dari perubahan yang tidak dipentaskan ke file. Bagi siapa pun yang menemukan ini, itu bukan jawaban yang valid untuk pertanyaan itu.Berikut adalah cara untuk menghindari masalah yang menjengkelkan ini ketika Anda memulai proyek baru:
git init
.Git membuatnya sangat sulit untuk dilakukan
git reset
jika Anda tidak memiliki komitmen. Jika Anda membuat komitmen awal kecil hanya untuk memilikinya, setelah itu Anda bisagit add -A
dangit reset
sebanyak yang Anda inginkan untuk mendapatkan semuanya dengan benar.Keuntungan lain dari metode ini adalah jika Anda mengalami masalah akhir baris nanti dan perlu menyegarkan semua file Anda, mudah:
sumber
autocrlf
nilai ... Ini tidak akan berfungsi di setiap proyek, tergantung pengaturannya.git reset somefile
dangit reset
keduanya berfungsi sebelum membuat komitmen pertama, sekarang. Ini telah menjadi kasus sejak beberapa rilis Git kembali.Mungkin Git telah berkembang sejak Anda memposting pertanyaan Anda.
Sekarang, Anda dapat mencoba:
Ini harus menjadi apa yang Anda cari.
sumber
Perhatikan bahwa jika Anda gagal menentukan revisi maka Anda harus menyertakan pemisah. Contoh dari konsol saya:
(Git versi 1.7.5.4)
sumber
git reset <path>
dan berfungsi dengan baik tanpa pemisah. Saya juga menggunakan git 1.9.0. Mungkin itu tidak berfungsi di versi yang lebih lama?Untuk menghapus file baru dari area pementasan (dan hanya dalam kasus file baru), seperti yang disarankan di atas:
Gunakan rm --cached hanya untuk file baru yang ditambahkan secara tidak sengaja.
sumber
--cached
adalah bagian yang sangat penting di sini.Untuk mengatur ulang setiap file dalam folder tertentu (dan subfoldernya), Anda dapat menggunakan perintah berikut:
sumber
git status
untuk melihat apa pun yang tersisa dan mengatur ulang secara manual yaitugit reset file
.Gunakan
*
perintah untuk menangani banyak file sekaligus:dll.
sumber
.*
atau.*.prj
Cukup ketik
git reset
itu akan kembali kembali dan sepertinya Anda tidak pernah mengetikgit add .
sejak komit terakhir Anda. Pastikan Anda sudah berkomitmen sebelumnya.sumber
Misalkan saya membuat file baru,
newFile.txt
:Misalkan saya menambahkan file tidak sengaja,
git add newFile.txt
:Sekarang saya ingin membatalkan pengaya ini, sebelum komit,
git reset newFile.txt
:sumber
Untuk file tertentu:
Untuk semua file yang ditambahkan:
Catatan: checkout mengubah kode dalam file dan pindah ke keadaan terakhir (berkomitmen). reset tidak mengubah kode; itu hanya me-reset header.
sumber
git reset <file>
dangit checkout <file>
.Perintah ini akan membatalkan perubahan Anda:
Anda juga bisa menggunakan
untuk menambahkan bagian file.
sumber
Ada juga mode interaktif:
Pilih opsi 3 untuk menghapus file. Dalam kasus saya, saya sering ingin menambahkan lebih dari satu file, dan dengan mode interaktif Anda dapat menggunakan angka seperti ini untuk menambahkan file. Ini akan mengambil semua kecuali 4: 1, 2, 3, dan 5
Untuk memilih urutan, cukup ketik 1-5 untuk mengambil semua dari 1 hingga 5.
Git pementasan file
sumber
Untuk membatalkan
git add
, gunakan:sumber
Akan menghapus file bernama filename.txt dari indeks saat ini, area "akan dikomit", tanpa mengubah apa pun.
sumber
git add myfile.txt
# Ini akan menambahkan file Anda ke dalam daftar yang harus dikomitKebalikan dari perintah ini adalah,
jadi, Anda akan berada di kondisi sebelumnya. Ditentukan akan kembali dalam daftar tidak terlacak (keadaan sebelumnya).
Ini akan mengatur ulang kepala Anda dengan file yang ditentukan. jadi, jika kepala Anda tidak memiliki arti, itu hanya akan meresetnya.
sumber
Di Sourcetree Anda dapat melakukan ini dengan mudah melalui GUI. Anda dapat memeriksa perintah mana yang digunakan Sourcetree untuk menghapus stage file.
Saya membuat file baru dan menambahkannya ke Git. Kemudian saya unstaged menggunakan GUI Sourcetree. Ini hasilnya:
Sourcetree digunakan
reset
untuk menghapus file baru.sumber
sumber