Saya menggunakan Git dan saya telah melakukan beberapa file menggunakan
git commit -a
Kemudian, saya menemukan bahwa file telah keliru ditambahkan ke komit.
Bagaimana saya bisa menghapus file dari komit terakhir?
git
git-commit
Lolly
sumber
sumber
git reset filepath
Jawaban:
Saya pikir jawaban lain di sini salah, karena ini adalah pertanyaan untuk memindahkan file yang salah berkomitmen ke area stage dari komit sebelumnya, tanpa membatalkan perubahan yang dilakukan pada mereka. Ini dapat dilakukan seperti yang disarankan Paritosh Singh:
atau
Kemudian atur ulang file yang tidak diinginkan untuk membiarkannya keluar dari komit:
Sekarang komit lagi, Anda bahkan dapat menggunakan kembali pesan komit yang sama:
sumber
git push
perbaiki hingga repo Anda, itu akan mengeluhUpdates were rejected because the tip of your current branch is behind its remote counterpart.
. Jika Anda yakin ingin mendorongnya (mis. Itu garpu Anda) maka Anda bisa menggunakan-f
opsi untuk memaksakan dorongan, misgit push origin master -f
. (Jangan lakukan ini pada repo hulu yang diambil orang lain)git reset --soft HEAD^
adalah operasigit reset
tetapi ingin cara untuk mempengaruhi komit yang ada "di tempat". Saya baru tahugit commit -C
. Jadi bagi saya, yang saya inginkan adalah resep persis Anda dengan satu langkah lagi, "komit baru lagi" dijabarkan sebagaigit commit -C [hash of original HEAD commit from first step]
.PERHATIAN ! Jika Anda hanya ingin menghapus file dari komit Anda sebelumnya, dan menyimpannya di disk , baca jawaban juzzlin atas.
Jika ini adalah komit terakhir Anda dan Anda ingin menghapus file sepenuhnya dari repositori lokal dan jauh Anda, Anda dapat:
git rm <file>
git commit --amend
Bendera amand memberitahu git untuk melakukan lagi, tetapi "menggabungkan" (bukan dalam arti menggabungkan dua cabang) ini melakukan dengan komit terakhir.
Seperti yang dinyatakan dalam komentar, menggunakan di
git rm
sini seperti menggunakanrm
perintah itu sendiri!sumber
git rm --cached
untuk menyimpan file di diskrm
dalamgit
perintah adalah melakukan aparm
sendiri tidak!git commit --amend
masih ada dan dapat ditemukan misalnya dengangit reflog
. Jadi itu tidak seburuk yang dikatakan komentar lain.Semua jawaban yang ada berbicara tentang menghapus file yang tidak diinginkan dari yang terakhir komit .
Jika Anda ingin menghapus file yang tidak diinginkan dari yang lama komit (bahkan didorong) dan tidak ingin membuat komit baru, yang tidak perlu, karena tindakan:
1.
Temukan komit yang Anda inginkan file untuk menyesuaikan.
Anda dapat melakukan ini beberapa kali jika Anda ingin menghapus banyak file.
2.
3.
Temukan komit dari komit di mana file ditambahkan secara keliru , katakanlah "35c23c2" di sini
Perintah ini membuka editor sesuai dengan pengaturan Anda. Yang standar adalah vim.
Pindahkan komit terakhir, yang seharusnya menjadi "hapus file yang tidak diinginkan", ke baris selanjutnya dari komit yang salah ("35c23c2" dalam kasus kami), dan tetapkan perintah sebagai
fixup
:Anda harus baik setelah menyimpan file.
Menyelesaikan :
Jika Anda sayangnya mendapatkan konflik, Anda harus menyelesaikannya secara manual.
sumber
git rm --cached <file(s)>
.--fixup=35c23c2
kegit commit
perintah. Ini akan mengatur komit secara otomatis sebagai perbaikan dari komit yang diperlukan dan jadi Anda tidak perlu menentukannya di rebase. Selain itu, jika Anda menambahkan--autosquash
kegit rebase
perintah, git akan secara otomatis memindahkan Anda berkomitmen untuk lokasi yang benar, sehingga Anda tidak perlu melakukan apapun di rebase interaktif - hanya menyimpan hasilnya (yang berarti Anda bahkan tidak perlu-i
bendera, meskipun saya tetap ingin menggunakannya untuk memastikan semuanya terlihat seperti yang saya harapkan).Seperti yang ditunjukkan oleh jawaban yang diterima, Anda dapat melakukan ini dengan mengatur ulang seluruh komit. Tapi ini pendekatan yang agak berat.
Cara yang lebih bersih untuk melakukan ini adalah menjaga komit, dan cukup menghapus file yang diubah darinya.
The
git reset
akan mengambil berkas itu di komit sebelumnya, dan tahap dalam indeks. File di direktori kerja tidak tersentuh.Kemudian
git commit
akan melakukan dan menekan indeks ke dalam komit saat ini.Ini pada dasarnya mengambil versi file yang ada di komit sebelumnya dan menambahkannya ke komit saat ini. Ini menghasilkan tidak ada perubahan bersih, sehingga file dihapus secara efektif dari komit.
sumber
Jika Anda belum mendorong perubahan pada server yang dapat Anda gunakan
Ini akan mengatur ulang semua perubahan dan kembali ke satu komit kembali
Jika Anda telah mendorong perubahan Anda, ikuti langkah-langkah yang dijawab oleh @CharlesB
sumber
Menghapus file menggunakan rm akan menghapusnya!
Anda selalu menambahkan komit di git daripada menghapus, jadi dalam contoh ini kembalikan file ke keadaan sebelum komit pertama (ini mungkin tindakan 'rm' hapus jika file tersebut baru) lalu komit kembali dan file akan pergi.
Untuk mengembalikan file ke kondisi sebelumnya:
atau mengembalikannya ke status di HEAD remote:
kemudian ubah komit dan Anda akan menemukan file telah menghilang dari daftar (dan tidak dihapus dari disk Anda!)
sumber
sumber
Yang berikut ini akan membatalkan tahapan hanya file yang Anda maksud, yang diminta OP.
Anda akan melihat sesuatu seperti yang berikut ...
Pada titik ini, Anda dapat melakukan apa pun yang Anda suka ke file, seperti mengatur ulang ke versi yang berbeda.
Saat Anda siap untuk berkomitmen:
atau (jika Anda memiliki beberapa perubahan lain yang belum Anda lakukan, belum)
sumber
Saya akan menjelaskan kepada Anda dengan contoh.
Biarkan A, B, C menjadi 3 komitmen berturut-turut. Komit B berisi file yang seharusnya tidak dilakukan.
sumber
noop
keedit [A_commit_ID]
ataue [A_commit_ID]
Anda cukup mencoba.
dan buat komit baru.
Namun, ada perangkat lunak yang luar biasa "gitkraken". yang membuatnya mudah untuk bekerja dengan git.
sumber
git commit --amend
penghapusan file diperbarui di komit terakhir Anda; dan setelahnya, Anda dapat memeriksa memang telah dihapus dengangit log -1 --stat
akan meninggalkan Anda file lokal. Jika Anda tidak menginginkan file tersebut secara lokal, Anda dapat melewati opsi --cached.
Jika semua pekerjaan ada di cabang lokal Anda, Anda perlu menyimpan file di komit kemudian, dan seperti memiliki riwayat bersih, saya pikir cara yang lebih sederhana untuk melakukan ini bisa menjadi:
dan Anda kemudian dapat menyelesaikan rebase dengan mudah tanpa harus mengingat perintah yang lebih kompleks atau komit pesan atau ketik sebanyak.
sumber
Menggunakan git GUI dapat menyederhanakan menghapus file dari komit sebelumnya.
Dengan asumsi bahwa ini bukan cabang bersama dan Anda tidak keberatan menulis ulang riwayat , maka jalankan:
Anda dapat menghapus centang pada file yang keliru dilakukan dan kemudian klik "Komit".
File dihapus dari komit, tetapi akan disimpan di disk . Jadi, jika Anda tidak memeriksa file setelah menambahkannya secara keliru, itu akan ditampilkan dalam daftar file Anda yang tidak dilacak (dan jika Anda tidak memeriksa file setelah salah memodifikasi, itu akan ditampilkan dalam perubahan Anda tidak dipentaskan untuk daftar komit).
sumber
sudo apt-get install git-gui
git rebase -i HEAD~4
dan kemudian menjalankan perintah Anda untuk membuka editor. Catatan lain: "Unstaging" dapat ditemukan di menu "Commit".git reset --soft HEAD^
(mengingat --soft arg), diikuti olehgit commit -c ORIG_HEAD
(daripada - amend, yang mengacaukan semuanya).Jika Anda ingin menyimpan komit (mungkin Anda sudah menghabiskan waktu menulis pesan komit terperinci dan tidak ingin kehilangan komit), dan Anda hanya ingin menghapus file dari komit, tetapi tidak dari repositori sepenuhnya:
sumber
Lakukan urutan perintah berikut:
sumber
Hanya ingin melengkapi jawaban teratas karena saya harus menjalankan perintah tambahan:
Bersulang!
sumber
Sesuatu yang bekerja untuk saya, tetapi masih berpikir harus ada solusi yang lebih baik:
Biarkan saja perubahan yang ingin Anda buang di komit lain, periksa yang lain
sumber
git reset --soft HEAD^
mengembalikan komit Anda, dan saat Anda mengetikgit status
, itu memberi tahu Anda apa yang harus dilakukan:sumber
Sebenarnya, saya pikir cara yang lebih cepat dan lebih mudah adalah dengan menggunakan mode interaktif git rebase.
(Atau kepala ~ 4, seberapa jauh Anda ingin pergi)
dan kemudian, alih-alih 'memilih', gunakan 'edit'. Saya tidak menyadari betapa kuatnya 'edit' itu.
https://www.youtube.com/watch?v=2dQosJaLN18
Semoga Anda merasa terbantu.
sumber
Punya masalah yang sama di mana saya memiliki perubahan di cabang lokal di mana saya ingin mengembalikan hanya satu file. Apa yang berhasil untuk saya adalah -
( fitur / target_branch di bawah adalah tempat saya memiliki semua perubahan saya termasuk yang ingin saya batalkan untuk file tertentu)
( asal / fitur / target_branch adalah cabang jarak jauh tempat saya ingin mendorong perubahan saya)
( fitur / pementasan adalah cabang pementasan sementara saya di mana saya akan mendorong dari semua perubahan yang saya inginkan kecuali perubahan ke satu file)
Buat cabang lokal dari asal / fitur / target_branch saya - menyebutnya fitur / pementasan
Menggabungkan fitur cabang lokal saya / target_branch ke cabang fitur / pementasan
Memeriksa fitur / pementasan lalu git reset --soft ORIG_HEAD (Sekarang semua perubahan dari fitur / pementasan 'akan dipentaskan tetapi tidak dikomit.)
Unstaged file yang sebelumnya saya laporkan dengan perubahan yang tidak perlu
Mengubah cabang upstream untuk fitur / pementasan ke asal / fitur / target_branch
Mengkomit selebihnya dari perubahan bertahap dan mendorong upstream ke asal / fitur / target_branch jauh saya
sumber
Jika Anda tidak membutuhkan file itu lagi, Anda bisa melakukannya
sumber
Jika Anda menggunakan GitHub dan belum mendorong komit, GitHub Desktop menyelesaikan masalah ini dengan mudah:
sumber
Jika Anda ingin menghapus file dari komit sebelumnya gunakan filter
Jika Anda melihat kesalahan ini:
Tidak dapat membuat cadangan baru. Cadangan sebelumnya sudah ada di referensi / asli / Paksa menimpa cadangan dengan -f
Hapus saja cadangan referensi pada repo lokal Anda
sumber
jika Anda tidak mendorong perubahan Anda untuk git
Ini akan mengatur ulang semua perubahan dan kembali ke satu komit kembali
Jika ini adalah komit terakhir yang Anda buat dan Anda ingin menghapus file dari repositori lokal dan jauh coba ini:
atau bahkan lebih baik:
atur ulang dulu
setel ulang file yang tidak diinginkan
komit lagi
sumber
Ini berfungsi bagi saya untuk menghapus file dari bit ember repo yang saya mendorong file ke cabang awalnya.
sumber
Saya menyalin file saat ini di folder yang berbeda, kemudian menyingkirkan semua perubahan yang tidak dicopot dengan:
Kemudian salin kembali. Komit, Dorong.
sumber
Anda cukup menggunakan perintah ini:
sumber
sumber
Tidak ada jawaban saat ini yang masuk akal. Kedengarannya ada permintaan yang cukup bahwa solusi nyata harus diusulkan: https://github.com/git/git/blob/master/Documentation/SubmittingPatches
akan menyenangkan. Saya mengerti bahwa kita tidak ingin memodifikasi riwayat, tetapi jika saya lokal dan tidak sengaja menambahkan file "retas" lokal dan ingin menghapusnya dari komit, ini akan sangat membantu.
sumber