Setiap proyek tanpa version control akhirnya menumbuhkan berkas bernama laporan_final.m, laporan_final_v2.m, dan laporan_final_REVISI_budi.m — tiga salinan yang isinya hampir sama dan tidak ada yang berani dihapus. Git menyelesaikan masalah ini dengan menyimpan riwayat perubahan di dalam folder tersembunyi .git/, sehingga folder proyek tetap bersih dan setiap versi bisa dipulihkan kapan pun. Chapter ini membahas:
- Alur dasar Git untuk proyek MATLAB:
init,add,commit. .gitignorestandar MATLAB — terutama memisahkan berkas.m(teks) dari.mat(biner).- Commit granular, branch eksperimen, merge, tag, dan arkeologi kode.
Semua demo dijalankan nyata lewat system('git ...') dari dalam MATLAB di folder sementara (di luar folder proyek), lalu dibersihkan.
Mengapa Git Ramah untuk Kode .m #
Git menyimpan perubahan baris demi baris (diff). Berkas .m adalah teks murni, sehingga git diff menampilkan persis baris mana yang berubah — ideal untuk review kode. Berkas biner tidak memiliki baris, jadi Git hanya bisa menyimpan salinan utuh setiap kali isinya berubah:
| Jenis berkas | Format | Perilaku git diff | Perlakuan yang disarankan |
|---|---|---|---|
.m, .md | teks | perubahan per baris, mudah dibaca | commit |
.mat besar | biner | “binary files differ”, salinan penuh | ignore atau simpan di luar repo |
.fig, .png | biner | sama seperti .mat | ignore (hasil/) |
.mlapp | biner (App Designer) | diff tak terbaca | commit bila memang source |
.gitignore MATLAB Standar #
Berkas .gitignore berisi pola berkas yang sengaja disembunyikan dari Git. Versi minimal yang sudah mencakup kebutuhan umum:
*.mat
hasil/
*.asv
*.m~Baris *.mat mengabaikan semua berkas .mat — tepat untuk data hasil olahan; data mentah kecil yang tidak bisa dibuat ulang tetap layak di-commit, cukup beri pengecualian !data/*.mat bila diperlukan. Baris hasil/ mengabaikan seluruh folder output, *.asv mengabaikan autosave Editor, dan *.m~ file sementara. .mlapp adalah pengecualian menarik: formatnya biner, tetapi berkas tersebut adalah source code App Designer — umumnya tetap di-commit meskipun diff-nya tidak terbaca.
Alur Dasar: init, add, commit #
Tiga perintah membentuk siklus dasar. git init membuat repo di folder proyek, git add menandai berkas yang akan direkam, git commit menyimpannya sebagai snapshot permanen:
[st, ~] = system('git init -q -b main');
fprintf('git init -q -b main: status %d\n', st);
system('git config user.name "Budi Santoso"');
system('git config user.email "[email protected]"');
[~, nama] = system('git config --get user.name');
fprintf('identitas commit: %s\n', strtrim(nama));Mari kita bedah baris-baris kode di atas:
- Baris 1 (
system('git init -q -b main')): membuat folder.git/tersembunyi; opsi-qmeredam pesan (pesan aslinya memuat path acak),-b mainmenamai cabang utamamainsecara eksplisit agar deterministik. - Baris 3-4 (
git config ...): identitas penulis commit — tanpa nama dan email, Git menolak commit. Konfigurasi ini lokal untuk repo demo, tidak menyentuh pengaturan global. - Nilai balik
system: status0berarti perintah sukses; pola[st, out] = system(...)adalah cara MATLAB menangkap keluaran shell sebagai teks.
Sebelum commit pertama, contoh.m membuat analisis.m dan berkas biner hasil/olah.mat, lalu memeriksa apa yang Git lihat:
== Bagian 2: status sebelum add ==
?? .gitignore
?? analisis.m
berkas .mat di hasil/ disembunyikan .gitignore: 1Tanda ?? berarti berkas belum dilacak. hasil/olah.mat sama sekali tidak muncul — .gitignore bekerja.
Commit Granular dan Pesan Konvensional #
Aturan granular: satu commit = satu perubahan makna. contoh.m melakukan dua commit terpisah — penambahan fitur, lalu perbaikan data — dengan pesan mengikuti pola konvensional jenis: deskripsi:
| Prefiks | Makna | Contoh |
|---|---|---|
feat: | fitur baru | feat: tambah median di eksperimen |
fix: | perbaikan galat | fix: tandai data revisi final |
docs: | dokumentasi | docs: perbarui README instalasi |
refactor: | restrukturisasi tanpa perubahan hasil | refactor: pecah monolit jadi 3 modul |
test: | tambah/perbaiki uji | test: uji nilai batas konversi |
Branch untuk Eksperimen dan Merge #
Branch adalah garis waktu paralel: git switch -c eksperimen membuat cabang baru untuk dicoba bebas risiko, dan git switch main kembali ke garis utama. Diagram di bawah memetakan alur di contoh.m:
Merge menggabungkan cabang eksperimen kembali ke main. Bila main tidak bergerak sejak percabangan, Git cukup menggeser penunjuk (fast-forward) — persis yang terjadi pada demo (merge eksperimen ke main (fast-forward): status 0). Bila kedua cabang mengubah baris yang sama di berkas .m, Git menandai konflik dengan penanda <<<<<<<, =======, >>>>>>> langsung di dalam berkas; kita menyelesaikannya dengan mengedit berkas manual, lalu git add + git commit.
Arkeologi Kode dan Rilis #
Perintah inspeksi menjawab pertanyaan arkeologi: git log (riwayat), git diff HEAD~1 HEAD (apa yang berubah di commit terakhir), git blame analisis.m (siapa mengubah baris ini dan kapan), git revert (membatalkan commit dengan commit baru). Tag menandai titik rilis: git tag v1.0 membekukan penunjuk ber nama untuk versi yang sudah diuji. Bagian akhir contoh.m merangkum semuanya:
Output yang Dihasilkan (dari contoh.m lengkap):
== Bagian 1: init + identitas + .gitignore ==
git init -q -b main: status 0
identitas commit: Budi Santoso
.gitignore ditulis: *.mat, hasil/, *.asv, *.m~
== Bagian 2: status sebelum add ==
?? .gitignore
?? analisis.m
berkas .mat di hasil/ disembunyikan .gitignore: 1
== Bagian 3: add + commit granular ==
dua commit selesai, pohon bersih: 1
== Bagian 4: branch eksperimen + merge ==
merge eksperimen ke main (fast-forward): status 0
== Bagian 5: arkeologi kode ==
jumlah commit: 3
feat: tambah median di eksperimen
fix: tandai data revisi final
feat: tambah analisis skor dasar
diff HEAD~1 HEAD --stat:
analisis.m | 1 +
1 file changed, 1 insertion(+)
tag rilis: v1.0
== Bagian 6: pembersihan ==
repo demo dihapus: exist = 0Sisa perintah bekerja berpasangan remote: git remote add origin <url> sekali, lalu git push -u origin main untuk mengirim, git pull untuk menarik perubahan rekan, dan git push --tags untuk membagikan rilis v1.0. Git berjalan di sandbox ini sebagai versi 2.47.3, sehingga seluruh demo di atas nyata dan dapat diulang.
Ringkasan #
Git merekam riwayat proyek MATLAB per baris karena .m adalah teks; .gitignore menutup *.mat dan hasil/ agar biner regeneratif tidak membengkakkan repo. Siklus inti: init → add → commit granular dengan pesan jenis: deskripsi; eksperimen aman di branch yang di-merge kembali, tag menandai rilis, dan log/diff/blame membedah masa lalu kode. contoh.m menjalankan seluruh alur lewat system() di folder sementara dan membersihkannya hingga tuntas.