Hapus file dari Git commit

Saya menggunakan git dan saya membuat beberapa file menggunakan

 git commit -a 

Kemudian saya menemukan bahwa file tersebut keliru ditambahkan ke komit.

Bagaimana cara menghapus file dari komit terakhir?

849
18 сент. Mojoy diatur pada 18 Sep. 2012-09-18 19:59 '12 pada 19:59 2012-09-18 19:59
@ 19 balasan

Saya pikir jawaban lain di sini salah, karena ini tentang memindahkan file yang salah diperbaiki kembali ke area perantara dari fiksasi sebelumnya tanpa membatalkan perubahan yang dibuat olehnya. Ini dapat dilakukan seperti yang disarankan oleh Paritosh Singh:

 git reset --soft HEAD^ 

atau

 git reset --soft HEAD~1 

Kemudian atur u>

 git reset HEAD path/to/unwanted_file 

Sekarang coba lagi, Anda dapat menggunakan kembali pesan komit yang sama:

 git commit -c ORIG_HEAD 
1673
10 марта '13 в 13:56 2013-03-10 13:56 jawabannya diberikan juzzlin 10 Maret '13 pada 13:56 2013-03-10 13:56

Perhatian ! Jika Anda ingin menghapus file dari komit sebelumnya dan menyimpannya ke disk, baca jawaban juzzlin sedikit lebih tinggi.

Jika ini adalah komit terakhir Anda dan Anda ingin menghapus file sepenuhnya dari repositori lokal dan jauh Anda, Anda dapat:

  • hapus file git rm <file>
  • commit dengan perubahan flag: git commit --amend

Bendera fix memberitahu git untuk memperbaikinya lagi, tetapi untuk "menggabungkan" (bukan dalam arti menggabungkan dua cabang) memperbaikinya dengan perbaikan terakhir.

Dan untuk mengatakannya seperti kamu, perintah rm di git melakukan apa yang dilakukan rm sendiri!

168
18 сент. balasan diberikan oleh CharlesB 18 Sep. 2012-09-18 20:22 '12 pada 8:22 malam 2012-09-18 20:22

Respons yang ada menyarankan untuk menghapus file yang tidak diinginkan dari yang terakhir .

Jika Anda ingin menghapus file yang tidak perlu dari komit lama (bahkan jika ditekan) dan tidak ingin membuat komit baru, yang bersifat opsional karena aksinya:

1.

Temukan komit yang Anda inginkan file untuk dicocokkan.

 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 commit_id di mana file ditambahkan secara keliru , katakan, "35c23c2" di sini

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

Perintah ini membuka editor sesuai dengan pengaturan Anda. Standarnya adalah vim.

Pindahkan komit terakhir, yang seharusnya menjadi "hapus file yang tidak perlu", 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 

Setelah menyimpan file Anda harus baik-baik saja.

Untuk menyelesaikan:

 git push -f 

Jika sayangnya Anda mengalami konflik, Anda harus menyelesaikannya secara manual.

75
27 янв. Dijawab oleh Brian 27 Januari 2015-01-27 18:24 '15 pada 18:24 2015-01-27 18:24

Menghapus file dengan rm akan menghapusnya!

Anda selalu menambahkan komit ke git daripada menghapusnya, jadi dalam hal ini Anda mengembalikan file ke keadaan sebelum komit pertama (ini mungkin tindakan hapus "rm" jika file tersebut baru), lalu komit kembali dan file akan masuk .

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 bahwa file tersebut telah menghi>

30
28 янв. Bob Flannigon memposting balasan pada 28 Jan 2013-01-28 17:00 '13 pada 17:00 2013-01-28 17:00

Jika Anda belum mengklik perubahan pada server, Anda dapat menggunakan

 git reset --soft HEAD~1 

Ini akan mengatur u>

Jika Anda mengklik perubahan Anda, ikuti >

28
18 сент. Jawabannya diberikan oleh Paritosh Singh 18 September . 2012-09-18 21:28 '12 pada 21:28 2012-09-18 21:28
 git checkout HEAD~ path/to/file git commit --amend 
27
23 авг. Balas diberikan oleh Denis Shchepetov pada 23 Agustus 2013-08-23 22:01 '13 pada 10:01 2013-08-23 22:01

Seperti yang ditunjukkan oleh jawaban yang diterima, Anda dapat melakukan ini dengan menjatuhkan seluruh komit. Tetapi ini adalah pendekatan yang agak sulit.
Cara yang lebih bersih untuk melakukan ini adalah dengan menyimpan komit dan cukup menghapus file yang dimodifikasi dari itu.

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

git reset akan mengambil file dengan cara yang sama seperti pada komit sebelumnya, dan menghasilkannya dalam indeks. File di direktori kerja tidak disentuh.
Kemudian git commit perbaikan dan memeras indeks ke dalam komit saat ini.

Ini pada dasarnya menerima versi file yang ada di komit sebelumnya dan menambahkannya ke komit saat ini. Ini tidak mengubah jaringan, sehingga file dihapus secara efektif dari komit.

25
25 февр. Balas diberikan oleh Patrick pada 25 Februari 2017-02-25 03:06 '17 pada 3:06 2017-02-25 03:06

Berikut ini akan menonaktifkan hanya file yang Anda maksudkan, yang merupakan persyaratan OP.

 git reset HEAD^ /path/to/file 

Anda akan melihat sesuatu seperti yang berikut ...

Perubahan yang perlu Anda lakukan: (gunakan "git reset HEAD ..." untuk menghapus instalasi)

diubah: / path / ke / file

Perubahan tidak dilakukan untuk melakukan: (gunakan "git add ..." untuk memperbarui apa yang akan dilakukan) (gunakan "git checkout -..." untuk membuang perubahan dalam direktori kerja)

diubah: / path / ke / file

  • "Perubahan yang perlu Anda buat" adalah versi file sebelumnya sebelum melakukan. Akan terlihat seperti penghapusan jika file tidak pernah ada. Jika Anda melakukan perubahan ini, revisi akan muncul yang akan mengembalikan perubahan ke file di cabang Anda.
  • "Perubahan tidak dikirim untuk komit" adalah perubahan yang Anda buat dan status file saat ini

Pada titik ini, Anda dapat melakukan apa pun yang Anda inginkan dalam file, misalnya, mengatur u>

Saat Anda siap untuk berkomitmen:

 git commit --amend -a 

atau (jika Anda memiliki perubahan lain yang tidak ingin Anda buat)

 git commit add /path/to/file git commit --amend 
24
07 дек. jawabannya diberikan ThatsAMorais 07 Desember. 2014-12-07 10:13 '14 pada 10:13 2014-12-07 10:13

Jika Anda ingin menyimpan komit (mungkin Anda telah menghabiskan waktu membuat pesan terperinci tentang komit dan tidak ingin kehi>

 git checkout origin/<remote-branch> <filename> git commit --amend 
8
17 июня '13 в 23:07 2013-06-17 23:07 jawabannya diberikan mattexx 17 Juni '13 pada 23:07 2013-06-17 23:07
 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 juga tidak ingin file lokal, Anda dapat melewati opsi --cached.

Jika semua pekerjaan ada di cabang lokal Anda, Anda perlu menyimpan file di komit kemudian dan, seolah-olah memiliki riwayat bersih, saya pikir cara yang lebih mudah untuk melakukan ini adalah:

 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 dapat dengan mudah menyelesaikan reboot tanpa harus menghafal perintah yang lebih rumit atau memperbaiki pesan atau memasukkan nomor yang sama.

6
23 февр. Jawabannya diberikan oleh Bryan Buckley pada 23 Februari. 2016-02-23 09:22 '16 pada jam 9:22 pagi 2016-02-23 09:22

Menggunakan git GUI dapat membuatnya lebih mudah untuk menghapus file dari komit sebelumnya.

Dengan asumsi bahwa ini bukan cabang bersama, dan Anda tidak keberatan menulis u> , maka jalankan:

 git gui citool --amend 

Anda dapat membatalkan file yang salah diperbaiki, dan kemudian klik "Komit".

2019

Jalankan 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' 
5
10 сент. jawabannya diberikan oleh Sergey Onishchenko 10 September . 2015-09-10 14:51 '15 pada 14:51 2015-09-10 14:51

Saya akan menjelaskan kepada Anda sebuah contoh. Misalkan A, B, C menjadi 3 fiksasi berturut-turut. Komit B berisi file yang seharusnya tidak dilakukan.

  • $ git log # take A commmit_id
  • $ git rebase -i "A_ID"
  • ubah komit ke 'e' dalam rebase vim
  • $ git rm unwanted_file
  • $ git rebase terus berlanjut
  • $ git push-force
3
17 авг. balasan yang diberikan oleh Moaz Rashad 17 Agustus 2017-08-17 12:52 '17 pada 12:52 2017-08-17 12:52

Saya hanya ingin menambahkan jawaban teratas, karena saya harus menjalankan perintah tambahan:

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

Hore!

3
25 мая '16 в 18:24 2016-05-25 18:24 jawabannya diberikan oleh andrepo 25 Mei '16 at 18:24 2016-05-25 18:24

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

 $ git revert <commit_id> $ git reset HEAD~1 --hard 

Biarkan saja perubahan yang ingin Anda batalkan di komit lain, periksa yang lain.

 $ git commit --amend // or stash and rebase to <commit_id> to amend changes 
2
14 авг. balasan diberikan oleh saiyancoder 14 Agustus. 2014-08-14 08:34 '14 pada 8:34 pagi 2014-08-14 08:34

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

 git rebase -i head~1 

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

dan kemudian gunakan 'edit' bukan 'pilih'. Saya tidak mengerti seberapa kuat penyuntingan.

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

Semoga Anda menikmatinya.

1
19 мая '16 в 23:58 2016-05-19 23:58 jawabannya diberikan oleh Matt 19 Mei '16 pada 23:58 2016-05-19 23:58

Punya masalah yang sama ketika saya memiliki perubahan di cabang lokal, di mana saya ingin mengembalikan hanya satu file. Apa yang berhasil untuk saya -

( fitur / target_branch ) tempat saya memiliki semua perubahan, termasuk yang ingin saya batalkan untuk file tertentu)

( asal / fitur / target_branch ) adalah cabang jarak jauh yang ingin saya ubah )

( fungsi / tahap adalah cabang perantara sementara saya di mana saya akan membangun semua perubahan yang saya inginkan, tidak termasuk modifikasi file ini)

  • Buat cabang lokal dari asal / fitur / target_branch saya - menyebutnya fungsi / pernyataan

  • Menggabungkan cabang fitur lokal / target_branch lokal saya dengan cabang

  • Fungsi / pernyataan dicentang, lalu git reset --soft ORIG_HEAD (sekarang semua perubahan dari fungsi / tahap "akan diatur, tetapi tidak diperbaiki.)

  • File yang tidak diinstal Saya sebelumnya memeriksa dengan perubahan yang tidak perlu

  • Cabang hulu diubah untuk fungsi / asal / fitur / target_branch

  • Redid perubahan bertahap yang tersisa dan klik hulu ke sumber / fungsi / target_branch jarak jauh saya

1
23 янв. jawabannya diberikan oleh user1201303 23 januari . 2017-01-23 07:13 '17 pada 7:13 2017-01-23 07:13

Jika Anda belum menekan komit, GitHub Desktop dengan mudah menyelesaikan masalah ini:

  • Pilih repositori → Batalkan komit terakhir.
  • Batalkan pemilihan file yang Anda tambahkan secara keliru. Pesan komit Anda sebelumnya akan berada di kotak dialog.
  • Tekan tombol tahan!
1
14 марта '17 в 22:41 2017-03-14 22:41 jawabannya diberikan oleh Ron pada 14 Maret '17 pada 22:41 2017-03-14 22:41

Jika Anda tidak lagi membutuhkan file ini, Anda dapat membuatnya

 git rm file git commit --amend git push origin branch 
0
29 сент. jawabannya diberikan tven 29 september . 2017-09-29 00:49 '17 pada 0:49 2017-09-29 00:49

Pertanyaan lain tentang tag atau Ajukan Pertanyaan