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 reset filepath
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 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:
git reset --soft HEAD^
atau
git reset --soft HEAD~1
Kemudian atur ulang file yang tidak diinginkan untuk membiarkannya keluar dari komit:
git reset HEAD path/to/unwanted_file
Sekarang komit lagi, Anda bahkan dapat menggunakan kembali pesan komit yang sama:
git commit -c ORIG_HEAD
git push
perbaiki hingga repo Anda, itu akan mengeluh Updates 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, mis git push origin master -f
. (Jangan lakukan ini pada repo hulu yang diambil orang lain)
git reset --soft HEAD^
adalah operasi
git reset
tetapi ingin cara untuk mempengaruhi komit yang ada "di tempat". Saya baru tahu git commit -C
. Jadi bagi saya, yang saya inginkan adalah resep persis Anda dengan satu langkah lagi, "komit baru lagi" dijabarkan sebagai git 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 menggunakan rm
perintah itu sendiri!
git rm --cached
untuk menyimpan file di disk
rm
dalam git
perintah adalah melakukan apa rm
sendiri tidak!
git commit --amend
masih ada dan dapat ditemukan misalnya dengan git 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.
git checkout <commit_id> <path_to_file>
Anda dapat melakukan ini beberapa kali jika Anda ingin menghapus banyak file.
2.
git commit -am "remove unwanted files"
3.
Temukan komit dari komit di mana file ditambahkan secara keliru , katakanlah "35c23c2" di sini
git rebase 35c23c2~1 -i // notice: "~1" is necessary
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
:
pick 35c23c2 the first commit
fixup 0d78b28 remove unwanted files
Anda harus baik setelah menyimpan file.
Menyelesaikan :
git push -f
Jika Anda sayangnya mendapatkan konflik, Anda harus menyelesaikannya secara manual.
git rm --cached <file(s)>
.
--fixup=35c23c2
ke git 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
ke git 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.
git reset HEAD^ -- path/to/file
git commit --amend --no-edit
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.
Jika Anda belum mendorong perubahan pada server yang dapat Anda gunakan
git reset --soft HEAD~1
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
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:
git checkout <commit_id> <path_to_file>
atau mengembalikannya ke status di HEAD remote:
git checkout origin/master <path_to_file>
kemudian ubah komit dan Anda akan menemukan file telah menghilang dari daftar (dan tidak dihapus dari disk Anda!)
git checkout HEAD~ path/to/file
git commit --amend
Yang berikut ini akan membatalkan tahapan hanya file yang Anda maksud, yang diminta OP.
git reset HEAD^ /path/to/file
Anda akan melihat sesuatu seperti yang berikut ...
Perubahan yang harus dilakukan: (gunakan "git reset HEAD ..." untuk unstage)
diubah: / path / ke / file
Perubahan yang tidak dilakukan untuk komit: (gunakan "git add ..." untuk memperbarui apa yang akan dilakukan) (gunakan "git checkout - ..." untuk membuang perubahan dalam direktori kerja)
diubah: / path / ke / file
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:
git commit --amend -a
atau (jika Anda memiliki beberapa perubahan lain yang belum Anda lakukan, belum)
git commit add /path/to/file
git commit --amend
Saya akan menjelaskan kepada Anda dengan contoh.
Biarkan A, B, C menjadi 3 komitmen berturut-turut. Komit B berisi file yang seharusnya tidak dilakukan.
git log # take A commit_id
git rebase -i "A_commit_ID" # do an interactive rebase
change commit to 'e' in rebase vim # means commit will be edited
git rm unwanted_file
git rebase --continue
git push --force-with-lease <branchName>
noop
ke edit [A_commit_ID]
ataue [A_commit_ID]
Anda cukup mencoba.
git reset --soft HEAD~1
dan buat komit baru.
Namun, ada perangkat lunak yang luar biasa "gitkraken". yang membuatnya mudah untuk bekerja dengan git.
git commit --amend
penghapusan file diperbarui di komit terakhir Anda; dan setelahnya, Anda dapat memeriksa memang telah dihapus dengangit log -1 --stat
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "removed unwanted file from git"
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:
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit --squash <commit_id>
git add <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "brand new file!"
git rebase --interactive <commit_id>^
dan Anda kemudian dapat menyelesaikan rebase dengan mudah tanpa harus mengingat perintah yang lebih kompleks atau komit pesan atau ketik sebanyak.
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:
git gui citool --amend
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).
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 oleh git 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:
git checkout origin/<remote-branch> <filename>
git commit --amend
Lakukan urutan perintah berikut:
//to remove the last commit, but preserve changes
git reset --soft HEAD~1
//to remove unneded file from the staging area
git reset HEAD `<your file>`
//finally make a new commit
git commit -m 'Your message'
Hanya ingin melengkapi jawaban teratas karena saya harus menjalankan perintah tambahan:
git reset --soft HEAD^
git checkout origin/master <filepath>
Bersulang!
Sesuatu yang bekerja untuk saya, tetapi masih berpikir harus ada solusi yang lebih baik:
$ git revert <commit_id>
$ git reset HEAD~1 --hard
Biarkan saja perubahan yang ingin Anda buang di komit lain, periksa yang lain
$ git commit --amend // or stash and rebase to <commit_id> to amend changes
Sebenarnya, saya pikir cara yang lebih cepat dan lebih mudah adalah dengan menggunakan mode interaktif git rebase.
git rebase -i head~1
(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.
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
Jika Anda menggunakan GitHub dan belum mendorong komit, GitHub Desktop menyelesaikan masalah ini dengan mudah:
Jika Anda ingin menghapus file dari komit sebelumnya gunakan filter
git filter-branch --prune-empty --index-filter 'git rm --ignore-unmatch --cached "file_to_be_removed.dmg"'
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
$ rm -rf .git/refs/original/refs
jika Anda tidak mendorong perubahan Anda untuk git
git reset --soft HEAD~1
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:
git rm <file>
git commit --amend
atau bahkan lebih baik:
atur ulang dulu
git reset --soft HEAD~1
setel ulang file yang tidak diinginkan
git reset HEAD path/to/unwanted_file
komit lagi
git commit -c ORIG_HEAD
Here is the step to remove files from Git Commit.
>git reset --soft HEAD^1(either commitid ) -- now files moved to the staging area.
>git rm --cached filename(it will removed the file from staging area)
>git commit -m 'meaningfull message'(Now commit the required files)
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
git --uncommit <nama file>
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.