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.
  • .gitignore standar 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 berkasFormatPerilaku git diffPerlakuan yang disarankan
.m, .mdteksperubahan per baris, mudah dibacacommit
.mat besarbiner“binary files differ”, salinan penuhignore atau simpan di luar repo
.fig, .pngbinersama seperti .matignore (hasil/)
.mlappbiner (App Designer)diff tak terbacacommit bila memang source

.gitignore MATLAB Standar #

Berkas .gitignore berisi pola berkas yang sengaja disembunyikan dari Git. Versi minimal yang sudah mencakup kebutuhan umum:

text
*.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:

matlab
    [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:

  1. Baris 1 (system('git init -q -b main')): membuat folder .git/ tersembunyi; opsi -q meredam pesan (pesan aslinya memuat path acak), -b main menamai cabang utama main secara eksplisit agar deterministik.
  2. 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.
  3. Nilai balik system: status 0 berarti 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:

text
== Bagian 2: status sebelum add ==
?? .gitignore
?? analisis.m
berkas .mat di hasil/ disembunyikan .gitignore: 1

Tanda ?? 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:

PrefiksMaknaContoh
feat:fitur barufeat: tambah median di eksperimen
fix:perbaikan galatfix: tandai data revisi final
docs:dokumentasidocs: perbarui README instalasi
refactor:restrukturisasi tanpa perubahan hasilrefactor: pecah monolit jadi 3 modul
test:tambah/perbaiki ujitest: 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):

text
== 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 = 0

Sisa 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.