- Manyana adalah prototipe kontrol versi berbasis CRDT yang dikembangkan oleh Bram Cohen, menawarkan pendekatan baru untuk menghilangkan konflik merge dan mempertahankan riwayat secara struktural
- Dengan memanfaatkan CRDT (Conflict-Free Replicated Data Type), merge selalu berhasil, dan konflik ditangani sebagai penanda informasi sehingga pengguna dapat memahami perubahan dengan jelas
- Inti konsepnya mencakup persistensi urutan baris, merge non-blocking, dan riwayat yang terinternalisasi, serta tidak merusak catatan yang ada bahkan selama proses rebase
- Ini adalah implementasi tingkat demo yang ditulis dalam sekitar 470 baris kode Python, dan seluruh kode serta dokumen desainnya dipublikasikan di GitHub sebagai domain publik
- Sebuah contoh eksperimental yang mengajukan model kontrol versi generasi berikutnya tanpa kegagalan merge melampaui keterbatasan Git
Manyana: Visi Konsisten untuk Masa Depan Kontrol Versi
- Manyana adalah prototipe sistem kontrol versi berbasis CRDT yang dirilis Bram Cohen, sebagai upaya mengatasi masalah konflik merge pada sistem yang ada
- CRDT menjamin merge selalu berhasil, dan konflik diperlakukan sebagai penanda informatif agar pengguna dapat melihat perubahan yang sebenarnya dengan jelas
- Pendekatan ini memiliki tiga karakteristik utama: persistensi urutan baris, penanganan konflik non-blocking, dan riwayat yang terinternalisasi dalam struktur
- Bahkan dalam proses rebase, riwayat yang ada tetap dipertahankan, dan struktur merge kompleks tanpa satu leluhur bersama pun dapat ditangani secara stabil
- Manyana adalah implementasi demo yang ditulis dalam sekitar 470 baris kode Python, dan dokumen desain serta kodenya tersedia di GitHub sebagai domain publik
Inti Pendekatan Berbasis CRDT
- CRDT memberikan merge yang selalu berhasil dan eventual consistency yang menjamin hasil yang sama terlepas dari urutan merge
- Bahkan jika beberapa pengguna mengerjakan branch secara independen lalu menggabungkannya dalam urutan apa pun, hasilnya tetap sama
- Melalui persistensi urutan baris, jika urutan kode yang disisipkan di posisi yang sama sudah ditentukan sekali, urutan itu akan tetap dipertahankan setelahnya
- Ini mencegah masalah ketika area konflik diselesaikan secara berbeda di tiap branch
- Konflik diperlakukan hanya sebagai penanda untuk penyampaian informasi dan tidak memblokir merge
- Hasil merge selalu dihasilkan, dan konflik ditandai sebagai “bagian yang diubah secara bersamaan di lokasi yang berdekatan”
- Dengan melacak pelaku dan tindakan dari tiap perubahan, sistem memberikan penanda konflik yang berguna
- Riwayat terinternalisasi di dalam struktur
- Status direpresentasikan sebagai struktur ‘weave’ yang mencakup semua baris file, dengan metadata waktu penambahan dan penghapusan pada tiap baris
- Saat merge, cukup memasukkan dua status tanpa perlu mencari leluhur bersama atau menelusuri DAG, dan hasil yang benar akan selalu dihasilkan
Penanda Konflik yang Lebih Baik
- Sistem kontrol versi tradisional saat terjadi konflik hanya menampilkan dua blok kode berdampingan, sehingga pengguna harus menafsirkan sendiri perbedaannya
- Manyana secara eksplisit menandai tiap area konflik dengan keterangan seperti “dihapus”, “ditambahkan”, dan menunjukkan siapa yang melakukan perubahan apa
- Misalnya, jika satu pengguna menghapus fungsi dan pengguna lain menambahkan satu baris di dalam fungsi tersebut, Manyana menampilkan struktur tiap perubahan dengan pemisahan yang jelas
- Dengan begitu, pengguna tidak perlu membandingkan dua blok secara manual, melainkan bisa langsung memahami makna dan konteks perubahan
Mendefinisikan Ulang Rebase
- Dalam sistem berbasis CRDT, rebase tidak merusak riwayat
- Rebase konvensional menumpuk ulang commit di atas base baru dan menciptakan riwayat fiktif
- Di Manyana, efek yang sama dapat diperoleh sambil tetap mempertahankan seluruh riwayat asli
- Untuk itu, cukup tambahkan anotasi “primary ancestor” pada DAG
- Pendekatan ini tetap bekerja stabil bahkan pada struktur merge tanpa leluhur bersama, sehingga dapat menghindari kegagalan merge 3-way tradisional
Status Proyek Saat Ini
- Manyana adalah implementasi demo, bukan sistem kontrol versi yang lengkap, dan bekerja pada tingkat file individual
- Terdiri dari sekitar 470 baris kode Python
- Fitur Cherry-pick dan local undo belum diimplementasikan, tetapi arah pengembangan selanjutnya dijelaskan dalam README
- Proyek ini membuktikan bahwa kontrol versi berbasis CRDT dapat menyelesaikan masalah UX dan memberikan hasil yang lebih baik daripada alat yang ada
- Seluruh kode didistribusikan sebagai domain publik (public domain), dan dokumen desain lengkap disertakan dalam README GitHub
Ringkasan Reaksi Komunitas
- Seorang pengguna menilai bahwa meski Git telah digunakan lebih dari 10 tahun, paradigma kontrol versi baru tetap dibutuhkan, dan menyebut upaya Manyana secara positif
- Ia menilai konsep merge yang selalu berhasil belum terasa intuitif dan meminta contoh serta penjelasan tambahan
- Ia menunjukkan minat pada ide perbaikan rebase, dan menyebut bahwa dalam proyek pribadinya ia memakai metode pengelolaan merge melalui branch perantara
- Ia juga menyoroti keterbatasan Git dalam penanganan file biner, kebingungan pembedaan branch kiri/kanan, serta kurangnya ringkasan perubahan kode berskala besar
- Ia mengusulkan agar kontrol versi di masa depan mendukung fitur token-aware atau plugin berdasarkan bahasa dan format file
- Pengguna lain bertanya apakah Manyana memiliki dasar yang mirip dengan Pijul atau Darcs, sambil meminta perbandingan antara masalah performa Darcs dan status terkini Pijul
Kesimpulan
- Manyana adalah demo nyata penerapan CRDT pada kontrol versi, yang mendesain ulang secara mendasar penanganan konflik dan masalah rebase
- Struktur tanpa kegagalan merge, konflik sebagai informasi, dan riwayat yang terinternalisasi secara struktural menunjukkan arah desain yang melampaui keterbatasan model Git saat ini
- Meski belum menjadi sistem yang lengkap, ini adalah titik awal yang bermakna sebagai cetak biru perancangan sistem kontrol versi generasi berikutnya
1 komentar
Komentar Hacker News
Menurut saya, cara menampilkan merge adalah masalah yang terpisah dari cara merepresentasikan histori
Saya juga tidak suka UI merge bawaan Git, jadi saya memakai p4merge. Ini alat yang menampilkan empat panel (kiri, kanan, base bersama, hasil), jadi penyebab konflik dan cara menyelesaikannya bisa langsung terlihat
Saya rasa tidak perlu sampai mengganti VCS-nya sendiri
merge.conflictStylemenjadi"diff3"atau"zdiff3", versi base juga akan ditampilkanDengan begitu, hanya dari marker konflik pun kita bisa menebak sisi mana yang menambahkan kode baru
Dulu saya terkejut mendengar di sebuah podcast ada tamu yang membuat VCS baru tetapi salah memahami cara Git menyimpan diff. Kalau setelah bertahun-tahun mengerjakan proyek pun konsep dasarnya tidak pernah dicari, rasanya semangat NIH (reinvention) memang masih hidup
Namun jika ditangani di level SCM, ada keuntungan karena sistem bisa mengingat riwayat merge pengguna. Git punya beberapa edge case di bagian ini
Saya tidak yakin merge yang tidak pernah gagal itu benar-benar hal yang baik
Kegagalan merge sering kali bukan sekadar konflik posisi, tetapi sinyal adanya konflik semantik. Dalam kasus seperti itu, memang harus ditangani secara manual
Saya rasa CRDT tidak cocok untuk version control
Konflik adalah inti dari version control. Jika dua pengembang mengubah kode ke arah yang berbeda, pada akhirnya tetap dibutuhkan pilihan semantik. Dalam situasi seperti ini, CRDT berisiko menghasilkan kode yang aneh
Sudah ada banyak alat di atas Git yang memberi UX merge lebih baik, dan kemudahan cherry-pick atau revert juga merupakan keunggulan Git
Misalnya di satu branch sebuah konstanta dihapus, sementara di branch lain konstanta itu digunakan, maka kodenya akan rusak
Karena konflik Git kebanyakan adalah masalah sintaktis, pendekatan semantic merge yang lebih cerdas atau pendekatan CRDT mungkin bisa membantu
Misalnya untuk melacak nama file, properti, hash, dan sebagainya, kita bisa memakai OR-set(https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type).
Namun penyelesaian konflik tetap harus ditangani di antarmuka eksternal
Saya tidak begitu paham mengapa fokusnya ke CRDT
Masalah semantik dalam konflik tetap ada. Bahkan perubahan bisa terlihat saling menyisip (interleave) sehingga justru lebih membingungkan
Saya adalah penganut rebase-sentris. Merge commit sebaiknya dihindari, dan semua commit harus menjadi unit yang mandiri. Menurut saya Gitflow adalah anti-pattern
Jujutsu atau Gerrit jauh lebih baik dalam menyelesaikan masalah Git yang sebenarnya, yaitu “mengelola rantai commit berdasarkan feedback review”
Git menerapkan ulang snapshot, sehingga seolah-olah pekerjaan yang sama ada dua kali. Sebaliknya, Pijul bekerja dalam unit patch, sehingga hasilnya sama terlepas dari urutan. Menurut saya itulah unit kerja yang benar-benar independen
Bahkan dalam keadaan ada konflik, commit tertentu masih bisa dibatalkan (undo). Strukturnya bisa lebih fleksibel dibanding Git
Dalam praktiknya, yang penting sering kali hanya hasil akhir. Menggabungkan squash merge dengan tepat lebih realistis
Padahal ada masalah yang pada dasarnya memang perlu konflik. Misalnya fenomena karakter tercampur di editor kolaboratif, yang justru bisa menghasilkan hal yang lebih buruk
Proyek ini terasa seperti pengembangan dari ide Codeville yang dulu dibuat Bram
Codeville muncul pada masa booming DVCS di awal 2000-an, dan memakai penyimpanan dan merge berbasis weave. Ini konsep yang 10 tahun mendahului CRDT, tetapi idenya mengalir secara alami ke sana
Menyenangkan melihat Bram masih terus menggarap masalah ini dengan pendekatan baru
arxiv:2002.09511
Saya tidak setuju dengan pernyataan “belum ada VCS berbasis CRDT”
Pijul sudah ada, dan itu proyek yang dikerjakan para ahli selama ribuan jam
Sudah 6 tahun dalam tahap eksperimen, dan 4 tahun lalu saya sendiri sempat mengirim issue, tapi masih belum ditindaklanjuti
Pijul adalah VCS yang dikembangkan dengan dirinya sendiri, jadi tidak memakai GitHub
pijul pull -a, muncul konflik sehingga saya biasanya langsung clone ulang. Saya penasaran apakah ada pull untuk update pelacakanmanana.py adalah kode Python tanpa dependensi sepanjang 473 baris
Implementasi sebenarnya hanya sekitar 240 baris, sisanya adalah kode test. Sederhana tapi mengesankan
Mengingat insiden left-pad di ekosistem JS, saya rasa Python juga perlu lebih banyak paket kecil yang bertanggung jawab seperti ini
Sistem seperti ini seharusnya dirancang dengan menganalisis pola konflik merge berdasarkan ukuran tim
Tim berisi 1, 10, 100, atau 1000 orang masing-masing menghadapi masalah yang berbeda, dan perlu dipertimbangkan juga bagaimana pengembangan berbasis agen akan mengubahnya
Dari pengalaman saya, pada skala 1 sampai 100 orang, kode biasanya dibagi menjadi subtree per tim sehingga hampir tidak ada konflik.
Jika jumlah agen bertambah, mungkin 100 orang bisa terasa seperti 1000 orang, tetapi untuk sekarang rasanya solusinya muncul lebih dulu daripada masalah nyatanya
Sekarang cukup serahkan konflik merge ke Codex dan selesai, jadi alasan untuk memakai VCS baru pun berkurang
Git dirancang untuk tim besar, dan di era agen hal seperti ini cukup ditangani lewat otomatisasi proses
Masalah justru lebih sering muncul pada bottleneck library bersama atau kebijakan pembatasan akses
Masalah yang lebih besar daripada konflik adalah skalabilitas Git
Ukuran repositori dan laju perubahan sudah mendekati batas. Diperlukan desain ulang menyeluruh pada server, klien, dan protokol
Secara pribadi saya kurang paham masalah apa yang sebenarnya ingin diselesaikan sistem ini
Secara abstrak memang menarik, tetapi dalam praktiknya jj jauh lebih praktis daripada Git
Menurut saya langkah berikutnya adalah sistem version control yang bekerja di level AST, bukan level file.
Sudah ada percobaan seperti LightTable atau Dark; akan menarik jika VCS berbasis tree seperti itu benar-benar diuji