Program
Aplikasi bisa terdampak akibat menggabungkan kode bermasalah, baik karena tanpa sengaja mengintegrasikan pekerjaan yang belum selesai ke dalam branch utama maupun luput dari bug kritis yang lolos dari pengujian otomatis.
Di artikel ini, saya akan memandu Anda menggunakan git revert untuk membatalkan merge dengan aman, memastikan riwayat commit tetap utuh dan integritas proyek terjaga.
Cara Kerja git revert
Kita bisa menganggap git revert sebagai versi perintah undo di Git. Namun, perintah git revert tidak menghapus commit atau melompat ke keadaan branch sebelumnya. Sebaliknya, perintah ini membuat commit baru yang membalik perubahan dari commit tertentu.

Sintaks untuk membalik sebuah commit dengan hash <commit_hash> adalah:
git revert <commit_hash>
Kita bisa menampilkan daftar commit beserta pengenal hash-nya menggunakan perintah git log. Keluaran git log menampilkan commit dari yang terbaru hingga yang paling lama, seperti berikut:

Misalnya, untuk membalik commit yang mengimplementasikan fungsi subtract, kita akan menggunakan perintah:
git revert 7ba24a3e62d4d37182428ccfaa070baa222b1151
Dengan menggunakan git revert kita bisa membatalkan perubahan dari commit tertentu tanpa memengaruhi riwayat commit.
Perlu dicatat bahwa git revert bukanlah sesuatu yang magis, dan bergantung pada riwayat commit, ini dapat menghasilkan konflik yang harus diselesaikan secara manual.
Keunggulan git revert Dibanding Perubahan Manual
Mengapa git revert berguna jika kita mungkin perlu menyelesaikan konflik secara manual? Bukankah lebih mudah langsung membatalkan perubahan secara manual? Mari kita lihat keunggulannya:
- Melestarikan riwayat:
git revertmembuat commit baru yang membatalkan perubahan dari commit tertentu sambil mempertahankan seluruh riwayat commit. Ini membantu menjaga riwayat perubahan dan pembatalan yang transparan. - Pembalikan atomik: Memastikan pembalikan bersifat atomik dan konsisten. Saat kita menghapus dan melakukan commit perubahan secara manual, ada risiko kesalahan manusia.
- Kewaspadaan terhadap konflik: Memastikan kita diberi tahu melalui konflik jika ada integrasi atau perubahan yang bergantung pada commit asli. Ini mungkin terasa tidak nyaman, tetapi melindungi dari efek samping yang tidak diinginkan.
- Metadata: Commit baru yang dibuat oleh git revert menyertakan metadata dan pesan commit yang menjelaskan secara kontekstual apa yang dibalik, sehingga membantu pemahaman di masa mendatang. Tanpa
git revert, konteks ini bisa hilang.
Membalik Sebuah Merge dalam Berbagai Skenario
Di bagian ini, kita mempelajari cara membatalkan merge. Demi contoh, kita mengasumsikan kita menggabungkan branch bernama feature ke branch main dengan mengeksekusi perintah dari branch main:
git merge feature
Apa yang kita pelajari di sini dapat diterapkan pada dua branch apa pun dengan mengganti namanya secara tepat.
Membalik merge yang tidak memiliki commit terkait
Perintah git merge tidak selalu membuat commit baru. Commit hanya dibuat jika branch main telah menyimpang dari branch feature. Karena git revert memerlukan sebuah commit untuk dijalankan, kita tidak bisa menggunakannya dalam kasus ini.
Branch main dan feature dianggap menyimpang ketika commit baru dibuat di main yang bukan merupakan leluhur dari branch feature. Dengan kata lain, commit baru dibuat di main setelah feature dibuat.
Jika branch belum menyimpang, saat kita menjalankan perintah git merge feature pada branch main, Git akan menggunakan fast-forward untuk melakukan merge. Ini berarti Git memindahkan HEAD dari branch main ke HEAD dari branch feature.

Kita dapat mengamati bahwa ini terjadi dengan melihat hasil dari git merge:

Untuk membatalkan merge seperti ini, kita hanya perlu memindahkan HEAD dari branch main kembali ke posisi semula. Untuk itu, kita:
- Mengidentifikasi
HEADsebelumnya menggunakangit reflog - Mereset
HEADke posisi sebelumnya menggunakangit reset --hard <previous_head>, mengganti<previous_head>denganHEADsebelumnya.
Keluaran git reflog akan terlihat seperti ini:

Kita bisa mengidentifikasi HEAD sebelumnya dengan melihat baris yang bertuliskan “checkout: moving from feature to main” (tertulis feature dan main karena itu adalah nama branch kita).
Dalam kasus ini, head sebelumnya adalah fe59838. Untuk memindahkan HEAD dari branch main kembali ke sana dan membatalkan merge, kita gunakan perintah:
git reset --hard fe59838

Membalik merge yang memiliki commit terkait
Jika branch main dan feature sudah menyimpang, maka saat kita menggabungkan dua branch, sebuah commit baru akan dibuat, yang disebut merge commit.

Merge commit menerapkan perubahan dari satu branch ke branch lainnya. Dalam kasus ini, perubahan di feature diterapkan ke branch main.
Untuk membalik perubahan pada branch main, kita menggunakan git revert pada merge commit tersebut. Ini akan membuat commit baru yang membatalkan perubahan yang dibawa ke branch main melalui merge, sehingga secara efektif mengembalikan keadaan branch main seperti sebelum merge.
Pertama, kita perlu mengidentifikasi hash dari merge commit. Kita bisa melakukannya menggunakan perintah git log:

Karena merge commit memiliki dua induk (parent), sintaks git revert sedikit berbeda. Kita perlu menggunakan opsi -m 1 untuk menyatakan bahwa kita ingin membalik perubahan relatif terhadap branch main:
git revert -m 1 b8dab2c8611e324ed0d273133987415350e6d10d

Penyelesaian Konflik Saat Membalik Commit
Terkadang, konflik dapat muncul saat membalik commit, khususnya jika commit yang dibalik bertentangan dengan perubahan setelahnya di basis kode. Dalam kasus seperti itu:
- Git akan menjeda proses revert: Kita perlu menyelesaikan konflik secara manual. Git akan menandai file yang berkonflik dan memerlukan intervensi.
- Seleseikan konflik: Buka setiap file yang berkonflik, selesaikan konflik yang ditandai Git, lalu simpan perubahan.
- Stage file yang sudah diselesaikan:
git add <file-path> - Lanjutkan proses revert:
git revert --continue
Kesimpulan
Menggunakan git revert untuk membatalkan merge commit memastikan setiap perubahan dan koreksi terdokumentasi dalam riwayat commit.
Selain itu, memahami skenario yang tepat untuk menerapkan git reset versus git revert membantu kita membuat keputusan yang lebih baik, khususnya saat mempertimbangkan alur kerja kolaboratif atau perubahan yang hanya bersifat lokal.
Anda dapat membaca lebih lanjut tentang topik ini di bagian FAQ di bawah. Jika Anda ingin mempelajari Git lebih jauh, saya merekomendasikan sumber berikut:
FAQs
Bisakah saya membalik merge yang sudah dipush dengan git revert?
Ya, itu adalah kasus penggunaan utama git revert pada merge. Jika perubahannya masih lokal maka git reset adalah cara yang lebih mudah untuk membatalkan merge.
Agar orang lain dapat melihat perubahan, kita perlu mendorong (push) perubahan tersebut ke repository remote. Jadi, untuk membatalkan merge yang sudah dipush, kita lakukan:
git revert -m 1 <merge_commit_hash>
git push origin <branch_name>
Ganti <merge_commit_hash> dengan hash dari merge commit dan <brach_name> dengan nama branch tempat merge dilakukan.
Apakah merge commit akan dihapus setelah menggunakan git revert?
Tidak. Merge commit tetap ada dalam riwayat, tetapi perubahannya dibatalkan oleh commit baru. Tujuan utama membatalkan merge dengan git revert adalah untuk mempertahankan riwayat commit.
Apakah ada cara selain git revert untuk membatalkan merge?
Cara alternatif untuk membatalkan merge adalah menggunakan git reset. Metode ini me-reset branch ke keadaan sebelum merge commit. Pendekatan ini lebih invasif dan dapat menimbulkan masalah jika kolaborator lain sudah mendasarkan pekerjaan mereka pada commit yang akan kita reset. Karena itu, disarankan hanya saat kita yakin tidak akan memengaruhi orang lain.
git reset --hard <commit_hash>
git push --force
Ganti <commit_hash> dengan hash dari commit yang ingin kita kembalikan.
Kapan saya harus menggunakan git reset untuk membatalkan merge?
Saya merekomendasikan menggunakan git reset untuk membatalkan merge hanya ketika merge terjadi secara lokal dan belum dipush.

