Langsung ke konten
AFM Studio
  • Halaman

    AFM Studio
  • Karya
  • Lab
  • Tentang
  • CV
  • Kontak
  • Proyek

    AksaraPerpustakaan pengetahuan Otorita IKN yang bisa dicari, dengan server memeriksa akses setiap pembaca di tiga tingkat
  • Daily TaqwaSistem presensi salat anti-manipulasi untuk ~2.000 pegawai OIKN di Masjid Negara IKN
  • Lantara v2Mesin perizinan Otorita IKN tempat administrator menambah jenis izin baru dari layar, tanpa developer
  • eKiosk IKNDua ruang kendali untuk Nusantara: konten kios dan pelacakan bus live dengan estimasi kedatangan yang menilai dirinya sendiri
  • E-Monev IKNPlatform pemantauan pembangunan Nusantara selama 23 tahun, melacak progres triwulan setiap unit terhadap 24 KPI
  • JDIH OIKNPortal dokumen hukum publik OIKN, dengan alur penerbitan terkendali dan ringkasan AI yang tidak pernah keluar dari server
  • Jejak PenanamanAplikasi absen acara penanaman pohon IKN yang membuktikan peserta hadir di lokasi lewat selfie ber-geofence
  • Dashboard SAKTIPipeline malam dan dashboard yang menggantikan unduhan anggaran manual di keenam satker OIKN
  • DoseRxKalkulator dosis untuk 127 obat yang membulatkan dosis ke tablet dan sirup yang dijual apotek Indonesia
  • CubiqPelatih speedcubing dengan timer setara kompetisi dan solver buatan sendiri untuk 8 puzzle utama
  • ScimotionPerpustakaan sains interaktif berisi 86 artikel, masing-masing dijelaskan bersama animasi yang bisa dikendalikan pembaca
  • WA Daily Scrum BotBot WhatsApp yang menagih laporan standup tim 14 orang dan menandai tugas yang macet berhari-hari

↑ ↓ untuk berpindah · Enter untuk membuka · Esc untuk menutup

Git Rebase Simulator

Sandbox aman untuk berlatih rebase, hard reset, dan force-push, dengan id commit yang berubah seperti di Git

Tangkapan layar
perintah Git yang bisa dilatih dengan aman
17
skenario dicek terhadap Git asli
9
skenario masalah Git sehari-hari yang bisa dibagikan
6
Di halaman ini

Masalahnya

Rebase adalah perintah Git yang paling ditakuti developer, dan ketakutan itu beralasan. Rebase biasanya dijelaskan sebagai "memindahkan commit ke base baru". Padahal tidak ada yang dipindahkan. Rebase menulis commit baru dengan id baru, dan commit aslinya tetap ada di repositori tanpa ada yang menunjuknya. Hampir setiap kepanikan "pekerjaan saya hilang", beserta obatnya, yaitu reflog, berawal dari salah paham yang satu itu.

Alat visual yang bagus sudah ada, dan Learn Git Branching yang paling dikenal. Saya menautkannya dari situs ini. Tapi alat-alat yang saya lihat punya tiga celah yang sama. Mereka memakai id palsu seperti C1 dan C2, jadi commit yang sudah di-rebase tetap terlihat sama. Mereka menyembunyikan commit yang tertinggal, jadi tidak ada yang belajar cara memulihkannya. Dan tidak ada isi berkas, sehingga tidak ada konflik, padahal di situlah rebase paling menyakitkan. Simulator ini untuk developer yang memakai Git setiap hari tapi belum percaya pada rebase, dan untuk orang yang mengajarkannya.

Yang saya bangun

Simulatornya bekerja seperti cara Git menyimpan data

Saya mengimplementasikan model penyimpanan Git sendiri, lalu gambarnya membaca dari model itu. Setiap id commit dihitung dari isi commit tersebut, termasuk parent-nya. Jadi saat rebase memberi sebuah commit parent baru, id-nya berubah sendiri di layar. Commit hanya pernah ditambahkan, tidak pernah diubah atau dihapus, kecuali kita menjalankan pembersihan. Setelah setiap perintah di setiap tes, ada pemeriksaan yang memastikan tidak ada yang berubah atau hilang dari yang sudah ada sebelumnya.

Commit yang tertinggal tetap terlihat

Setelah rebase atau hard reset, commit lama tetap tampil, berwarna abu-abu dan tanpa branch yang menunjuknya. Panel reflog mencatat setiap kali sebuah branch atau HEAD berpindah, beserta penyebabnya. Satu klik membuat branch di commit yang hilang, sama seperti cara memperbaikinya di Git yang asli.

Berkas asli menghasilkan konflik asli

Setiap commit membawa isi berkas yang sebenarnya. Saat rebase tidak bisa diterapkan dengan bersih, muncul konflik three-way dengan penanda milik Git sendiri, dan kita bisa melanjutkan, melewati, atau membatalkannya seperti di Git. Tampilan perbandingan menjalankan merge dan rebase dari titik awal yang sama secara berdampingan. Riwayatnya terlihat berbeda, tapi isi berkas akhirnya identik, dan ada tes yang memeriksanya.

Saya mengeceknya terhadap Git yang asli

Alat belajar yang keliru tapi meyakinkan akan membuat orang salah paham soal rebase dengan penuh percaya diri. Jadi saya menulis skrip yang menjalankan program Git asli lewat sembilan skenario, dua di antaranya terhadap repositori bare yang berperan sebagai remote, lalu merekam hasilnya. Tes membandingkan bentuk riwayatnya: parent, posisi branch, dan objek mana yang baru. Tes tidak membandingkan id commit, karena Git asli ikut memasukkan waktu dan identitas penulis. Situsnya menyebutkan hal itu.

Perintah yang tidak didukung ditolak dengan jelas

Simulator ini menolak pull dengan sadar, karena pull menyembunyikan separuh pekerjaannya yang menulis ulang riwayat. Pesan error-nya menyarankan fetch lalu merge atau rebase. Beberapa opsi lanjutan ditolak dengan cara yang sama. Jawaban salah yang terdengar yakin adalah hal terburuk yang bisa diberikan alat belajar.

Hasilnya

Git Rebase Simulator sudah live dan open source dengan lisensi MIT, dalam bahasa Inggris dan Indonesia, dan bisa dipakai offline setelah dimuat pertama kali. Simulator ini mendukung 17 perintah Git, termasuk interactive rebase dan remote simulasi untuk push, fetch, dan force-push. Enam skenario siap pakai, misalnya hard reset yang tidak disengaja atau force-push yang berbahaya, bisa dibagikan lewat tautan. Saya membangunnya dalam sekitar lima jam pada 5 Agustus 2026, dari spesifikasi tertulis.

Di balik layarDetail teknis untuk engineer
  • Mesinnya murni: (state, command) → { state, events }, tanpa React, DOM, Date, atau Math.random. Timestamp berasal dari jam virtual di dalam state.
  • Object store bersifat append-only; gc satu-satunya cara menghapus. Invariannya dijalankan setelah setiap perintah di setiap tes: setiap objek sebelumnya harus tetap ada dan identik per byte.
  • Hash adalah SHA-1 dari serialisasi kanonis setiap objek, mengikuti format loose-object Git. Id blob dan tree sama persis dengan Git asli (dicek terhadap git ls-tree); id commit berbeda karena timestamp dan identitas penulis.
  • SHA-1 ditulis sendiri di lib/hash/sha1.ts (99 baris), dicek dengan vektor uji RFC 3174. SubtleCrypto bersifat async dan hanya ada di browser, sehingga mesinnya jadi tidak murni dan tidak bisa diuji di Node.
  • Sebuah sesi adalah daftar baris perintah. Memutarnya ulang membangun store yang identik per byte, jadi URL yang dibagikan menyimpan skripnya.
  • pnpm fixtures:record (scripts/record-fixtures.mjs) memanggil binary git asli. Skrip ini hanya untuk pengembangan dan tidak pernah jalan di CI atau build browser.
  • Ditolak dengan menyebut namanya: pull, --rebase-merges, merge base criss-cross, revert merge tanpa -m, membuang commit yang sudah ada di upstream berdasarkan patch-id, dan banyak remote.
  • Bagian yang ditulis sendiri: parser gitrevisions (HEAD~3, HEAD^2, ref@{n}, hash pendek), three-way merge atas array baris di lib/git/merge3.ts, dan tata letak lajur git log --graph yang deterministik di lib/layout/lanes.ts, diuji dengan snapshot.
  • Reachability dihitung ulang dari nol di setiap perubahan, tanpa refcount, jadi tampilan orphan tidak bisa melenceng.
  • Interactive rebase mendukung pick, reword, squash, fixup, drop, dan pengurutan ulang, bisa diputar ulang sebagai rebase -i --todo=pick:<oid>,squash:<oid>,….
  • Animasi cangkok digerakkan oleh event commits-replaced dari mesin (pasangan id lama ke baru), tidak pernah ditebak dari bentuk graf.
  • Perintah: add, commit, branch, checkout/switch, merge, rebase, cherry-pick, reset, revert, tag, diff, log, status, reflog, gc, push, fetch.
  • Nama awalnya Cangkok. Domain committer cangkok.local dipertahankan, karena ikut masuk ke setiap hash commit dan mengubahnya akan membatalkan semua fixture yang sudah direkam.
  • PRD menyebut bahasa Indonesia sebagai bahasa utama; aplikasi yang dirilis memakai bahasa Inggris sebagai default di /en/, bahasa Indonesia di /id/, dan ada tes keselarasan kedua bahasa.
  • Dependensi runtime: next, react, react-dom. Tanpa pustaka Git, hashing, tata letak graf, animasi, atau state. 4 rute × 2 bahasa, static export sekitar 2,0 MB. 186 tes di 21 berkas, sekitar 11.700 baris, 32 commit.

Tangkapan layar

Beranda
Sandbox
Scenarios
Compare

Sedang merekrut, atau membangun hal serupa?

Saya terbuka untuk posisi full-time dan proyek freelance tertentu.