Bagaimana cara menghapus komit terakhir pada Github dan secara lokal?

127

Saya mencoba menghapus 2 commit terakhir dari salah satu repositori GitHub saya. Saya sudah mencoba seperti yang disarankan di sini : git push -f origin HEAD^^:master. Tampaknya berfungsi, karena dua komit terakhir dihapus.

Kemudian saya menghapusnya dari repositori lokal saya dengan git rebase -i HEAD~2. Saya menghapus baris yang terkait dengan komit tersebut, dan memeriksa git logapakah mereka dihapus dengan benar.

Setelah itu, saya membuat beberapa perubahan di repositori lokal saya, membuat komit baru, dan mendorong ke GitHub. Masalahnya adalah, di akun GitHub saya, saya memiliki dua commit sebelumnya yang saya coba hapus.

Saya pikir masalahnya ada di repositori lokal saya, karena jika saya mengkloning repositori Github saya ke lokal saya dan membuat beberapa perubahan di sini, ketika saya mendorong komit baru, komitmen lama itu tidak didorong ke GitHub.

Ada ide?

Ivan Fernandez
sumber

Jawaban:

199

Untuk menghapus dua komit terakhir secara lokal, saya sarankan menggunakan:

git reset --hard HEAD^^

Rebase adalah operasi yang sama sekali berbeda yang tidak akan membantu Anda di sini.

KL-7
sumber
23
Jika Anda sudah mendorong perubahan ini ke repositori jarak jauh. Anda dapat menghapusnya dengan git push -f
Ivan Fernandez
Bisakah Anda menggeneralisasi ini untuk jumlah komit terakhir?
user_19
6
@ user_19 Anda dapat melakukan hal-hal seperti git reset --hard HEAD^4atau git reset --hard HEAD~4. Padahal, hal-hal mungkin akan sedikit rumit jika sejarah Anda mengandung gabungan. Anda dapat menemukan informasi lebih lanjut tentang menentukan revisi di bagian terkait di sini .
KL-7
2
Jika saya ingin menghapus 7 komit terakhir lalu ?? Apakah saya perlu memasukkan 7 kali ^ setelah KEPALA ... tolong jelaskan saya
Gagan Gami
4
@GaganGami, saya pikir Anda akan melakukannya git reset --hard HEAD~7, tapi tolong perbaiki saya jika saya salah.
Con Antonakos
105

Jika Anda ingin menghapus 2 (dua) commit terakhir, ada perintah mudah untuk melakukannya:

git reset --hard HEAD~2

Anda dapat mengubah 2jumlah komit terakhir yang ingin Anda hapus.

Dan untuk mendorong perubahan ini ke jarak jauh, Anda perlu melakukan git pushdengan parameter force ( -f):

git push -f

Namun, saya tidak merekomendasikan untuk melakukan gitperintah dengan -fatau --hardopsi yang terlibat jika ada komit baru di remote (Github) setelah ini berkomitmen yang ingin Anda hapus. Dalam hal ini, selalu gunakan git revert.

Dherik
sumber
Apakah perubahan yang saya buat tetap?
Zuhayer Tahir
@SymfonyUser, no. Ketika Anda membuat hardperintah, Anda kehilangan dua komitmen ini. Jika Anda ingin menyimpan perubahan, buat difffile komit ini sebelum menerapkan reset.
Dherik
3
@ZuhayerTahir jika Anda hanya ingin membatalkan komit untuk 5 komit terakhir maka lakukan saja git reset HEAD~5(jangan gunakan hard). Dengan cara ini Anda akan mendapatkan perubahan dalam status bertahap (mis. Tidak berkomitmen). Bagi saya lihat jawaban ini .
Sayang
@ Honey Terima kasih atas tanggapan Anda. Saya sampai pada kesimpulan yang sama.
Zuhayer Tahir
29

Berikut ini berfungsi untuk saya

git reset HEAD~n

Ini menghapus nkomit terakhir dari repo lokal, karena HEAD^hanya menghapus satu. Jika Anda perlu menghapus perubahan ini dari jarak jauh, Anda mungkin perlu memaksakan push karena Anda akan berada di belakang remote.

git push -f origin <branch>
Sial01
sumber