Menghapus file dari Git commit

Saya menggunakan Git dan saya telah melakukan beberapa file menggunakan

git commit -a

Kemudian, saya menemukan bahwa file telah keliru telah ditambahkan ke komit.

Bagaimana saya bisa menghapus file dari komit terakhir?

Mengomentari pertanyaan (4)
Larutan

Saya pikir jawaban yang lain di sini yang salah, karena ini adalah pertanyaan yang bergerak keliru berkomitmen file kembali ke area stage dari sebelumnya melakukan, tanpa membatalkan perubahan yang dilakukan untuk mereka. Hal ini dapat dilakukan seperti Paritosh Singh yang disarankan:

git reset --soft HEAD^ 

atau

git reset --soft HEAD~1

Kemudian mengatur ulang file yang tidak diinginkan dalam rangka untuk meninggalkan mereka keluar dari komitmen:

git reset HEAD path/to/unwanted_file

Sekarang komit lagi, anda bahkan dapat menggunakan kembali melakukan pesan yang sama:

git commit -c ORIG_HEAD  
Komentar (28)

PERHATIAN! Jika anda hanya ingin menghapus file dari sebelumnya melakukan, dan simpan pada disk, baca juzzlin's jawaban di atas.

Jika ini adalah anda komit terakhir dan anda ingin benar-benar menghapus file dari lokal dan remote repositori, anda dapat:

  1. hapus file git rm <file>
  2. komit dengan mengubah bendera: git commit-mengubah

Mengubah bendera memberitahu git untuk melakukan lagi, tapi "gabung" (bukan dalam pengertian penggabungan dua cabang) ini melakukan dengan komit terakhir.

Seperti yang dinyatakan di komentar, menggunakan git rm di sini adalah seperti menggunakan rm perintah itu sendiri!

Komentar (5)

Ada jawaban semua berbicara tentang menghapus file yang tidak diinginkan dari lalu komit.

Jika anda ingin menghapus file yang tidak diinginkan dari tua melakukan (bahkan mendorong) dan don't ingin membuat yang baru melakukan, yang tidak perlu, karena aksi:

Menemukan berkomitmen bahwa anda ingin file yang sesuai.

git checkout  <path_to_File>

anda dapat melakukan ini beberapa kali jika anda ingin menghapus banyak file.

git commit -am "remove unwanted files"

Menemukan commit_id komit di mana file yang ditambahkan keliru, let's mengatakan "35c23c2" di sini

git rebase 35c23c2~1 -i  // notice: "~1" is necessary

Perintah ini akan membuka editor sesuai dengan pengaturan anda. Default adalah vim.

Langkah terakhir melakukan, yang harus "menghapus file yang tidak diinginkan", ke baris berikutnya dari salah komit("35c23c2" dalam kasus kami), dan set perintah seperti perbaikan:

pick 35c23c2 the first commit
fixup 0d78b28 remove unwanted files

Anda harus menjadi baik setelah menyimpan file.

Untuk menyelesaikan :

git push -f

Jika anda sayangnya dapatkan konflik, anda harus menyelesaikannya secara manual.

Komentar (9)

Sebagai jawaban yang diterima menunjukkan, anda dapat melakukan ini dengan mengatur ulang seluruh komit. Tapi ini agak berat menyerahkan pendekatan. Cara yang bersih untuk melakukan hal ini akan menjaga komit, dan hanya menghapus file-file yang diubah dari itu.

git reset HEAD^ -- path/to/file
git commit --amend --no-edit

The git reset akan mengambil file seperti di commit sebelumnya, dan tahap dalam indeks. File dalam direktori kerja tak tersentuh. The git commit kemudian akan melakukan dan labu indeks ke saat ini melakukan.

Ini pada dasarnya mengambil versi dari file yang telah di commit sebelumnya dan menambahkan untuk saat ini melakukan. Hal ini mengakibatkan tidak ada perubahan bersih, dan begitu file tersebut secara efektif dihapus dari melakukan.

Komentar (8)

Jika anda tidak mendorong perubahan pada server anda dapat menggunakan

git reset --soft HEAD~1

Itu akan me-reset semua perubahan dan kembali ke salah satu komit kembali

Jika anda telah mendorong perubahan anda kemudian ikuti langkah-langkah seperti yang dijawab oleh @CharlesB

Komentar (8)

Menghapus file dengan menggunakan rm akan menghapusnya!

Anda're selalu menambahkan untuk komit dalam git daripada menghapus, jadi dalam hal ini pengembalian berkas ke negara itu sebelum yang pertama melakukan (ini mungkin menghapus 'rm' tindakan jika file baru) dan kemudian kembali komit dan file akan pergi.

Untuk mengembalikan file tersebut ke beberapa negara sebelumnya:

    git checkout  <path_to_File>

atau untuk kembali ke negara di remote KEPALA:

    git checkout origin/master <path_to_File>

kemudian mengubah komit dan anda harus menemukan file yang telah menghilang dari daftar (dan tidak akan dihapus dari disk anda!)

Komentar (0)
git checkout HEAD~ path/to/file
git commit --amend
Komentar (1)

Berikut ini akan disimpan hanya file yang anda inginkan, yang adalah apa OP yang diajukan.

git reset HEAD^ /path/to/file

Anda'll melihat sesuatu seperti berikut...

Perubahan yang akan dilakukan: (gunakan "git reset KEPALA <File>..." untuk disimpan)

dimodifikasi: /path/ke/file

Perubahan tidak dipentaskan untuk melakukan: (gunakan "git add <File>..." untuk update apa yang akan dilakukan) (gunakan "git checkout -- <File>..." untuk membuang perubahan dalam direktori kerja)

dimodifikasi: /path/ke/file

  • "Perubahan yang akan dilakukan" adalah versi sebelumnya dari file sebelum melakukan. Ini akan terlihat seperti penghapusan jika file tersebut tidak pernah ada. Jika anda melakukan perubahan ini, akan ada revisi yang beralih perubahan ke file di cabang anda.
  • "Perubahan tidak dipentaskan untuk melakukan" adalah perubahan yang anda telah lakukan, dan keadaan saat ini file

Pada titik ini, anda dapat melakukan apapun yang anda suka ke file, seperti ulang untuk versi yang berbeda.

Bila anda're siap untuk melakukan:

git commit --amend -a

atau (jika anda've mendapat beberapa perubahan lain yang terjadi bahwa anda don't ingin melakukan, namun)

git commit add /path/to/file
git commit --amend
Komentar (1)

Saya akan menjelaskan kepada anda dengan contoh. Mari A, B, C menjadi 3 berturut-turut melakukan. Melakukan B berisi file yang tidak seharusnya 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   
Komentar (1)

Jika anda secara tidak sengaja telah menambahkan sebuah file untuk anda yang berkomitmen, anda dapat melakukan sesuatu seperti

git rm --cached path_to_file

Pastikan untuk menggunakan --cached jika file anda juga akan dihapus dari proyek anda.

Komentar (1)
git rm --cached <File_to_remove_from_commit__which_added_File>
git commit -m "removed unwanted file from git"

akan meninggalkan anda file lokal masih. Jika anda don't ingin file tersebut baik secara lokal, anda dapat melewatkan --cached pilihan.

Jika semua pekerjaan di cabang lokal anda, anda harus menyimpan file di kemudian berkomitmen, dan ingin memiliki sejarah yang bersih, saya pikir cara yang lebih sederhana untuk melakukan hal ini bisa menjadi:

git rm --cached <File_to_remove_from_commit__which_added_File>
git commit --squash 
git add <File_to_remove_from_commit__which_added_File>
git commit -m "brand new file!"
git rebase --interactive ^

dan anda kemudian dapat menyelesaikan rebase dengan mudah tanpa harus mengingat perintah yang lebih kompleks atau pesan commit atau tipe lebih banyak.

Komentar (1)

Menggunakan git GUI dapat mempermudah menghapus file dari sebelum melakukan.

Dengan asumsi bahwa ini isn't bersama cabang dan anda don't pikiran menulis ulang sejarah, kemudian jalankan:

git gui citool --amend

Anda dapat un-centang file yang keliru yang dilakukan dan kemudian klik "Melakukan".

File dihapus dari melakukan, tapi akan menjadi disimpan pada disk. Jadi jika anda un-check file setelah keliru menambahkan, itu akan menunjukkan anda tidak terlacak daftar file (dan jika anda un-check file setelah keliru memodifikasi hal itu akan menunjukkan perubahan anda tidak dipentaskan untuk melakukan daftar).

Komentar (3)

Jika anda ingin melestarikan commit anda (mungkin anda sudah menghabiskan beberapa waktu menulis rinci pesan komit dan don't ingin kehilangan itu), dan anda hanya ingin menghapus file dari melakukan, tapi bukan dari repositori seluruhnya:

git checkout origin/ <Filename>
git commit --amend
Komentar (0)

Hanya ingin melengkapi jawaban atas karena saya harus berjalan ekstra perintah:

git reset --soft HEAD^
git checkout origin/master <Filepath>

Cheers!

Komentar (1)

Melakukan 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 `
Komentar (3)

Sesuatu yang bekerja untuk saya, tapi masih berpikir harus ada solusi yang lebih baik:

$ git revert 
$ git reset HEAD~1 --hard

Hanya meninggalkan perubahan yang ingin anda buang di sisi lain melakukan, memeriksa orang lain

$ git commit --amend // or stash and rebase to  to amend changes
Komentar (0)

git reset --KEPALA lembut^ angin kembali anda melakukan, dan ketika anda mengetik git status, itu memberitahu anda apa yang harus dilakukan:

Changes to be committed:
  (use "git reset HEAD <File>..." to unstage)
Komentar (0)

Sebenarnya, saya pikir lebih cepat dan cara yang lebih mudah adalah dengan menggunakan git rebase modus interaktif.

git rebase -i head~1  

(atau kepala~4, seberapa jauh anda ingin pergi)

dan kemudian, bukan 'pilih', menggunakan 'edit'. Aku tidak menyadari betapa kuat 'edit' adalah.

https://www.youtube.com/watch?v=2dQosJaLN18

Harap anda akan menemukan itu berguna.

Komentar (1)

Punya masalah yang sama di mana saya memiliki perubahan dalam cabang lokal di mana saya ingin kembali hanya satu file. Apa yang bekerja untuk saya adalah -

(fitur/target_branch di bawah ini adalah di mana saya punya semua perubahan saya termasuk orang-orang yang saya ingin membatalkan untuk file tertentu)

(asal/fitur/target_branch adalah cabang terpencil di mana saya ingin mendorong perubahan)

(fitur/pementasan saya sementara pementasan cabang di mana saya akan mendorong dari semua saya ingin perubahan kecuali perubahan itu dalam satu file)

  1. Membuat sebuah cabang lokal dari saya asal/fitur/target_branch - yang disebut * fitur/pementasan**

  2. Bergabung saya bekerja di cabang lokal fitur/target_branch ke * fitur/pementasan** branch

  3. Memeriksa * fitur/pementasan kemudian git reset --lembut ORIG_HEAD* (Sekarang semua perubahan dari fitur/pementasan' akan dipentaskan tetapi tidak terikat.)*

  4. Yang belum di-stage file yang saya sebelumnya telah diperiksa dengan perubahan yang tidak perlu

  5. Berubah hulu cabang untuk * fitur/pementasan* untuk asal/fitur/target_branch*

  6. Berkomitmen sisa mengadakan perubahan dan mendorong hulu ke saya remote asal/fitur/target_branch

Komentar (0)

Jika anda tidak membutuhkan file itu lagi, anda bisa melakukan

git rm file
git commit --amend
git push origin branch
Komentar (0)