Membatalkan dengan Aman: git revert
Membatalkan commit yang sudah dibagikan tanpa menulis ulang riwayat.
Masalah: commit buruk sudah terlanjur dibagikan
Bayangkan kamu sudah mem-push commit yang ternyata membuat aplikasi error, dan rekanmu sudah menariknya. Kalau kamu pakai git reset untuk menghapusnya, riwayat di komputermu berbeda dari riwayat rekan dan server — kekacauan. Solusinya: tambahkan commit baru yang membatalkan perubahan itu.
git revert
git revert HEAD # batalkan commit terakhir
git revert 4f1c2a7 # batalkan commit tertentu (berdasarkan hash)
git revert HEAD~2 # commit dua langkah ke belakang
Git membuat commit baru berisi kebalikan dari perubahan target. Pesan otomatisnya: Revert "Ubah diskon menjadi 1000 persen". Riwayat bertambah, tidak ada yang dihapus:
c1 Tambah aturan diskon 10 persen
c2 Ubah diskon menjadi 1000 persen <- commit bermasalah
c3 Revert "Ubah diskon menjadi 1000 persen" <- pembatal
reset vs revert
| git reset | git revert | |
|---|---|---|
| Cara kerja | Memindahkan branch mundur (menghapus commit dari riwayat) | Membuat commit baru yang membatalkan |
| Riwayat | Ditulis ulang | Dipertahankan |
| Aman untuk commit yang sudah di-push? | Tidak | Ya |
| Cocok untuk | Pekerjaan lokal yang belum dibagikan | Kesalahan di riwayat bersama |
Revert commit yang bukan terakhir
Kamu bisa membatalkan commit di tengah riwayat; Git menerapkan kebalikannya pada kode saat ini. Jika commit-commit sesudahnya mengubah baris yang sama, Git bisa meminta kamu menyelesaikan konflik (dibahas di bab 14).
Revert beberapa commit sekaligus tanpa commit otomatis
git revert -n HEAD~2..HEAD # -n = jangan commit otomatis, kumpulkan dulu
git commit -m "Batalkan eksperimen diskon"
Revert commit merge
Merge punya dua induk, sehingga Git perlu tahu sisi mana yang dipertahankan: git revert -m 1 <hash-merge> (-m 1 = pertahankan sisi branch utama). Ini topik lanjutan; cukup ingat bahwa perlu opsi -m.
Tips
- Pesan revert boleh disesuaikan agar menjelaskan alasan pembatalan.
- Revert bisa juga di-revert (membatalkan pembatalan) bila ternyata commit awalnya benar.