Hapus komit git yang belum didorong


724

Saya melakukan git committetapi saya belum mendorongnya ke repositori. Jadi ketika saya melakukannya git status, saya mendapatkan # cabang Anda di depan 'master' dengan 1 komit.

Jadi jika saya ingin mengembalikan komit atas saya, bisakah saya lakukan:

git reset --hard eb27bf26dd18c5a34e0e82b929e0d74cfcaab316

mengingat bahwa ketika saya melakukannya git logsaya mendapatkan:

komit eb27bf26dd18c5a34e0e82b929e0d74cfcaab316
Tanggal: Sel 29 Sep 11:21:41 2009 -0700


komit db0c078d5286b837532ff5e276dcf91885df2296
Tanggal: Sel 22 Sep 10:31:37 2009 -0700

9
Pertanyaan ini tampaknya merupakan duplikat dari pertanyaan Anda yang lain: stackoverflow.com/questions/1338728/how-to-delete-a-git-commit
Brian Campbell



3
BERBAHAYA: reset --harddapat mengakibatkan hilangnya pekerjaan, karena melakukan hal itu mengakibatkan git menimpa file lokal Anda (pekerjaan baru Anda) dengan yang dari web (terjadi pada saya). Pertanyaan dan jawaban tentang git harus secara eksplisit menyatakan apa yang dilakukan perintah mereka dan apa risikonya bagi pembaca.
OrangeSherbet

Jawaban:


673

Sebenarnya, ketika Anda menggunakan git reset, Anda harus merujuk komit bahwa Anda ulang untuk ; jadi Anda ingin db0c078komit, mungkin.

Versi yang lebih mudah adalah git reset --hard HEAD^, untuk mengatur ulang ke komit sebelumnya sebelum kepala saat ini; dengan cara itu Anda tidak perlu menyalin di sekitar ID komit.

Waspadalah saat Anda melakukan apa pun git reset --hard, karena Anda dapat kehilangan semua perubahan yang tidak dikomit yang Anda miliki. Anda mungkin ingin memeriksa git statusuntuk memastikan bahwa copy pekerjaan Anda bersih, atau bahwa Anda memang ingin menghilangkan segala perubahan yang ada.

Selain itu, alih-alih KEPALA Anda dapat menggunakan origin/mastersebagai referensi, seperti yang disarankan oleh @bdonlan di komentar:git reset --hard origin/master


374
Atau git reset --hard origin/master, untuk mengatur ulang ke apa pun asalnya.
bdonlan

1
Pointer lain yang bermanfaat yang dapat Anda atur ulang adalah ORIG_HEAD atau generalisasi menggunakan reflog HEAD @ {1} (posisi terakhir HEAD).
Jakub Narębski

12
Pembaca, sebelum Anda git resetkode Anda. Bantulah diri Anda di masa depan: Perbedaan antara reset,, reset --softdan reset --hard(Apa yang terjadi dengan git addalias "pekerjaan Anda" Anda sebelumnya :) Picture: link
user18099

3
Perhatikan bahwa ini akan menghapus apa pun yang ada di komit yang ingin Anda hapus (jadi a tidak git statusakan menunjukkan perubahan dan komit akan dihapus / perubahan hilang).
Bjørn Børresen

12
CATATAN: Hati-hati saat menggunakan git reset --hard HEAD^karena Anda akan kehilangan perubahan pada file yang dikomit (perubahan Anda akan dihapus). Ada dua cabang untuk pertanyaan ini: Untuk mengembalikan komit tetapi masih ada perubahan pada disk melakukannyagit reset --soft HEAD~1
papigee

625

JIKA Anda TIDAK mendorong perubahan Anda ke jarak jauh

git reset HEAD~1

Periksa apakah copy pekerjaan sudah bersih oleh git status.

LAIN Anda telah mendorong perubahan Anda ke jarak jauh

git revert HEAD

Perintah ini akan mengembalikan / menghapus yang terakhir komit / ubah dan kemudian Anda bisa mendorong


34
Ini jawaban untuk "Hapus komit git terbaru yang belum didorong" (jawaban terdekat IMHO)
Pierre de LESPINAY

25
Juga, itu membuat perubahan lokal dilakukan di komit terakhir, sementara git reset --hard tidak
Stanimir Stoyanov

1
bagi saya, itu akan membatalkan komit terdorong terakhir dan komit tidak
dicubit

git kembalikan KEPALA untuk saya baru saja menghapus semua file yang sudah siap untuk dorong. Hati-hati!
Jason Bruce

159
git reset --hard origin/master

untuk mengatur ulang ke apa pun asalnya.

Ini diposting oleh @bdonlan di komentar . Saya menambahkan jawaban ini untuk orang-orang yang tidak membaca komentar.


4
Pertanyaan ini ditanyakan hampir 5 tahun yang lalu, dan ini sudah ada di salah satu komentar.
Anubian Noob

1
Bagaimana jika cabang lokal saat ini berbeda dengan master- yang harus saya gunakan origin/mybranchkemudian?
Pavel Vlasov

9
Saya biasanya tidak membaca komentar ketika saya sedang terburu-buru untuk jawaban ... Terima kasih telah menempatkan sebagai jawaban (yang sederhana yang bekerja)
Leonardo Alves Machado

Peringatan: perlu diketahui bahwa ini akan menghapus semua perubahan kode Anda yang ada, selain dari git reset HEAD~yang hanya menetapkan kembali komit ke dalam kode
Mayer Spitzer

70

Ada dua cabang untuk pertanyaan ini (Mengembalikan komit tidak berarti saya ingin kehilangan semua perubahan lokal saya):

1. Untuk mengembalikan komit terbaru dan membuang perubahan pada file berkomitmen lakukan:

git reset --hard HEAD~1

2. Untuk mengembalikan komit terbaru tetapi mempertahankan perubahan lokal (pada disk) lakukan:

git reset --soft HEAD~1

Ini (perintah nanti) akan membawa Anda ke keadaan Anda seharusnya jika Anda melakukannya git add.

Jika Anda ingin menghapus stage file setelah itu, lakukan

git reset

Sekarang Anda dapat membuat lebih banyak perubahan sebelum menambahkan dan kemudian melakukan lagi.


47

Ketik saja konsol:

$ git reset HEAD~

Perintah ini membuang semua commit lokal sebelum HEAD jarak jauh


7
Bisakah Anda menjelaskan apa yang ditambahkan jawaban Anda atas jawaban yang ada?
nvoigt

Ini menghapus komitmen saat ini sebelum mendorong - tanpa mengembalikan perubahan yang telah Anda buat secara lokal - seperti jawaban lainnya - yang bisa menjadi momen penarikan rambut yang parah
Grant

43

Saya percaya bahwa salah satu dari itu akan sesuai dengan kebutuhan Anda

1 - Batalkan komit dan pertahankan semua file dipentaskan: git reset --soft HEAD~;

2 - Membatalkan komit dan hapus stage semua file: git reset HEAD~;

3 - Membatalkan komit dan hapus semua perubahan: git reset --hard HEAD~;

Di sinilah saya menemukan jawabannya


Jawaban ini harus diterima: D
Aaron John Sabu

30

Hapus komit terakhir sebelum push

git reset --soft HEAD~1

1berarti komit terakhir, jika Anda ingin menghapus dua penggunaan terakhir 2, dan sebagainya *


3
Hai Karina, penyebutan --softadalah tambahan yang bagus untuk jawaban yang mungkin, tetapi bisakah Anda juga menyebutkan alasannya? Menjelaskan solusi Anda selalu membantu. Cobalah untuk tetap menggunakan bahasa Inggris. Terima kasih
Vlastimil Ovčáčík

1
--soft- memastikan Anda tidak kehilangan perubahan dalam file yang
komitnya

19

Saya telah mengalami situasi yang sama saya lakukan di bawah ini karena ini jauh lebih mudah. Dengan melewati commit-IdAnda dapat mencapai komit tertentu yang ingin Anda tuju:

git reset --hard {commit-id}

Saat Anda ingin menghapus komit terakhir Anda sehingga Anda harus melewati commit-Idtempat Anda perlu memindahkan pointer Anda:

git reset --hard db0c078d5286b837532ff5e276dcf91885df2296

Hanya peringatan untuk pemula seperti saya - buat cadangan file di mana Anda ingin MENJAGA perubahan, karena mereka akan dikembalikan ke versi sebelumnya. Skenario saya adalah bahwa saya secara tidak sengaja meletakkan database dump di direktori repo saya dan kemudian melakukan - saya jelas tidak ingin mengkomit file-file itu ke repo tetapi DID ingin menyimpan perubahan yang saya buat pada file lain. Jadi saya harus menyalin dan menempel perubahan yang diperlukan dari cadangan yang saya buat SEBELUM melakukan reset git.
user1063287

10

Inilah yang saya lakukan:

Pertama checkout cabang Anda (untuk mastercabang kasus saya ):

git checkout master

Kemudian atur ulang ke HEAD remote ^ ( itu akan menghapus semua perubahan lokal Anda ), paksa bersih dan tarik:

git reset HEAD^ --hard && git clean -df && git pull

1
Ini adalah opsi yang sangat nuklir. Saya akan menyarankan soft reset untuk komit terbatas.
c0der512

3

Salah satu caranya adalah dengan menghapus cabang lokal dan checkout cabang itu dari server jika cabang lokal Anda berada di depan dari jarak jauh oleh beberapa komit dan Anda perlu membatalkan semua dari mereka.


jawaban yang brilian - memungkinkan untuk dengan mudah mengkliknya di sourcetree :)
Kamil Kiełczewski

1

Saya hanya memiliki masalah yang sama dan akhirnya melakukan:

git rebase -i HEAD~N

(N adalah jumlah commit yang akan ditampilkan git)

Itu meminta editor teks Anda dan kemudian Anda dapat menghapus komit yang Anda inginkan dengan menghapus baris yang terkait dengannya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.