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
hap497
sumber
9
Pertanyaan ini tampaknya merupakan duplikat dari pertanyaan Anda yang lain: stackoverflow.com/questions/1338728/how-to-delete-a-git-commit
Brian Campbell
1
Kemungkinan duplikat dari commit Hapus dari cabang di Git
Leonardo Alves Machado
1
Kemungkinan duplikat dari Cara membatalkan komitmen terakhir di Git?
Jan Zerebecki
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

Brian Campbell
sumber
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

Jeril Kuruvila
sumber
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.

Shadoweb
sumber
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.

papigee
sumber
47

Ketik saja konsol:

$ git reset HEAD~

Perintah ini membuang semua commit lokal sebelum HEAD jarak jauh

marcdahan
sumber
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

M. Massula
sumber
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 *

Karina Haddad
sumber
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
Kamlesh Patidar
sumber
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
Adnan
sumber
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.

saga123
sumber
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.

MrCas
sumber