{"slug":"git-versioning-commit-push-rollback-guide","locale":"id","isFallback":false,"translationAvailable":["en","id"],"translationUrls":{"en":"/api/notes/git-versioning-commit-push-rollback-guide?locale=en","id":"/api/notes/git-versioning-commit-push-rollback-guide?locale=id"},"title":"Panduan Git: Commit, Push, Tag, dan Rollback Aman","description":"Catatan personal tentang kekhawatiran kehilangan kode dan bagaimana Git versioning menjadi jawabannya — dari commit pertama sampai rollback aman.","date":"2026-03-06","updated":"2026-03-06","tags":["git","github","version-control","workflow"],"content":"\nJujur, saya sempat khawatir.\n\nHari itu saya dan AI baru saja selesai mengerjakan banyak perubahan besar — refactor theme hook, utilitas baru, perbaikan SEO, security headers, dan beberapa file yang dihapus. Semuanya terasa benar. TypeScript clean, tidak ada error. Tapi ada satu pertanyaan yang tiba-tiba muncul di kepala saya:\n\n> *\"Kalau ternyata ada yang salah setelah commit... bisa balik ke versi sebelumnya gak?\"*\n\nPertanyaan itu ternyata jadi pintu masuk ke pemahaman yang lebih baik tentang bagaimana Git bekerja sebagai mesin waktu untuk kode.\n\n---\n\n## Apa Itu Versioning di Git?\n\nSetiap kali kita menjalankan `git commit`, Git tidak hanya \"menyimpan file\" — ia mengambil **snapshot lengkap** dari seluruh kondisi project di titik waktu itu.\n\nBayangkan seperti ini: setiap commit adalah foto. Kumpulan foto itu membentuk album perjalanan project kita.\n\n```bash\ngit log --oneline -5\n```\n\nOutput-nya kira-kira seperti ini:\n\n```\nfcb9e5f refactor: audit & hardening — theme hook, utils, security headers\n7dbb190 feat: add cross-env dependency and improve code formatting\n5c48cab Improve language switcher visibility and styling\n374bd29 fix: correct apphosting.yaml secret variable syntax\nd04d9bb feat: enhance security & refactor admin role management\n```\n\nSetiap baris adalah satu \"foto\". Hash pendek di depan (`fcb9e5f`, `7dbb190`, dst.) adalah ID unik snapshot tersebut. Kapan pun saya mau, saya bisa kembali ke salah satu dari mereka.\n\n---\n\n## Tiga Aksi Dasar yang Harus Dikuasai\n\n### `git add` + `git commit` — Ambil Foto\n\nSebelum foto bisa diambil, kita perlu memilih dulu apa yang ingin masuk ke frame:\n\n```bash\n# Masukkan semua perubahan ke \"frame\"\ngit add -A\n\n# Ambil fotonya dengan keterangan\ngit commit -m \"feat: deskripsi perubahan yang jelas\"\n```\n\nPesan commit yang baik itu investasi. Tiga bulan ke depan, kalimat `\"fix: add passive: true to scroll listener in BackToTop\"` jauh lebih berguna daripada `\"update\"`.\n\n### `git push` — Kirim Foto ke Album Online\n\nCommit yang hanya ada di komputer lokal itu rentan — kalau laptop mati atau rusak, riwayatnya hilang. `git push` mengirim semua snapshot tadi ke GitHub:\n\n```bash\ngit push origin main\n```\n\nSekarang riwayat project ada di dua tempat: lokal dan GitHub. Ini backup otomatis.\n\n### `git tag` — Beri Nama pada Titik Penting\n\nHash seperti `fcb9e5f` susah diingat. Tag adalah cara memberi nama yang manusiawi pada sebuah commit penting:\n\n```bash\n# Buat tag di commit saat ini\ngit tag v1.1-audit-hardening\n\n# Kirim tag ke GitHub\ngit push origin --tags\n```\n\nSetelah ini, saya tidak perlu ingat hash-nya. Cukup ingat nama tagnya.\n\n---\n\n## Tiga Skenario Rollback\n\nIni inti dari kekhawatiran saya tadi. Ternyata ada beberapa cara untuk \"mundur\", tergantung seberapa parah situasinya.\n\n### Skenario 1 — Intip Versi Lama Tanpa Mengubah Apapun\n\nKalau hanya ingin lihat isi file di versi tertentu tanpa mengubah apapun:\n\n```bash\n# Lihat isi satu file dari commit tertentu\ngit show 7dbb190:src/components/layout/header.tsx\n```\n\nAman. Tidak ada yang berubah di project.\n\n### Skenario 2 — Batalkan Commit Terakhir, Kode Tetap Ada\n\nCommit sudah dibuat tapi ternyata pesannya salah, atau mau edit dulu sebelum commit ulang:\n\n```bash\n# Batalkan commit, tapi perubahan file tetap ada\ngit reset --soft HEAD~1\n```\n\nFile tidak berubah, tapi commit-nya hilang. Saya bebas edit lagi lalu commit ulang.\n\n### Skenario 3 — Rollback Aman ke Versi/Tag Tertentu\n\nIni cara paling benar kalau ingin benar-benar kembali ke kondisi sebelumnya, tapi **tanpa menghapus riwayat**:\n\n```bash\n# Balik semua perubahan sejak tag tertentu\ngit revert --no-commit v1.1-audit-hardening..HEAD\ngit commit -m \"revert: kembali ke kondisi v1.1\"\ngit push origin main\n```\n\n`git revert` tidak menghapus commit lama — ia menambah commit baru yang membalik perubahan. Riwayat tetap utuh, dan ini pilihan terbaik untuk project yang sudah di-push ke GitHub bersama orang lain.\n\n---\n\n## Alur Kerja yang Saya Pakai Sekarang\n\nSetelah memahami semua ini, alur kerja saya jadi lebih tenang:\n\n**Sebelum mulai perubahan besar** — buat tag dulu sebagai checkpoint:\n```bash\ngit tag v1.2-sebelum-fitur-baru\ngit push origin --tags\n```\n\n**Setelah selesai** — commit dengan pesan yang jelas, lalu push:\n```bash\ngit add -A\ngit commit -m \"feat: nama fitur yang dikerjakan\"\ngit push origin main\n```\n\n**Kalau ada masalah** — rollback ke tag terdekat:\n```bash\ngit revert --no-commit v1.2-sebelum-fitur-baru..HEAD\ngit commit -m \"revert: ada masalah, kembali ke v1.2\"\ngit push origin main\n```\n\n---\n\n## Pelajaran yang Saya Ambil\n\nKekhawatiran saya tadi bukan tidak beralasan. Kehilangan kode yang sudah susah payah ditulis itu nyata risikonya — terutama kalau baru belajar dan belum terbiasa dengan Git.\n\nTapi ternyata Git dirancang memang untuk menghilangkan rasa khawatir itu. Setiap `commit` adalah jaring pengaman. Setiap `tag` adalah checkpoint yang bisa kita jadikan pelampung. Dan `git revert` adalah tombol \"undo\" yang tidak merusak riwayat.\n\nSekarang saya commit lebih sering, pesan commit lebih deskriptif, dan setiap kali mau mulai sesuatu yang besar — saya buat tag dulu.\n\nKebiasaan kecil yang bikin tidur lebih nyenyak.\n"}