# 📘 Panduan & Best Practice Penggunaan Git di Lingkungan Multi-Client
**Khusus Sandbox Development `W:\chepy\`**

Dokumen ini disusun sebagai materi ajar dan pedoman standar (*best practice*) dalam mengelola *source code* aplikasi CodeIgniter 3 multi-client menggunakan sistem kendali versi (**Git**).

---

## DAFTAR ISI
1. [Filosofi Dasar: Mengapa Git Wajib Digunakan?](#1-filosofi-dasar-mengapa-git-wajib-digunakan)
2. [Tiga Zona Kerja Git (The 3 Trees)](#2-tiga-zona-kerja-git-the-3-trees)
3. [Arsitektur Lingkungan `W:\chepy` (Multi-Repo)](#3-arsitektur-lingkungan-wchepy-multi-repo)
4. [Proteksi File Wajib: `.gitignore`](#4-proteksi-file-wajib-gitignore)
5. [Alur Kerja Sehari-hari (Daily Workflow)](#5-alur-kerja-sehari-hari-daily-workflow)
6. [Mekanisme Rollback & Pembatalan (Emergency Undo)](#6-mekanisme-rollback--pembatalan-emergency-undo)
7. [Strategi Percabangan (Branching Strategy)](#7-strategi-percabangan-branching-strategy)
8. [Standar Penulisan Pesan Commit (Commit Convention)](#8-standar-penulisan-pesan-commit-commit-convention)
9. [Tabel Perintah Sakti (Cheat Sheet)](#9-tabel-perintah-sakti-cheat-sheet)
10. [Pantangan Keras (Common Pitfalls & Anti-Patterns)](#10-pantangan-keras-common-pitfalls--anti-patterns)

---

## 1. Filosofi Dasar: Mengapa Git Wajib Digunakan?

Sebelum mengenal Git, pola kerja tradisional yang sering terjadi adalah:
```text
everest_lama/
everest_baru/
everest_fix_banget/
everest_final_bismillah.zip
everest_29agus_bagus/
```
**Masalah dengan pola lama:**
1. Menghabiskan kapasitas penyimpanan karena menyalin seluruh proyek berulang kali.
2. Kita lupa baris mana yang diubah kemarin lusa vs hari ini.
3. Sangat rawan salah menimpa (*overwrite*) kode milik rekan kerja.
4. Ketika terjadi error fatal, kita bingung mengembalikan ke versi yang sebelumnya stabil.

**Solusi dengan Git:**
Folder aplikasi tetap **hanya 1 folder**. Di dalamnya ada folder rahasia `.git` yang bertindak sebagai **perekam riwayat waktu nyata**. Setiap kali ada perubahan, Git hanya menyimpan *perbedaan baris* (diff), bukan menyalin seluruh folder.

---

## 2. Tiga Zona Kerja Git (The 3 Trees)

Git membagi perjalanan sebuah kode menjadi 3 ruangan:

```mermaid
graph LR
    A["📁 1. Working Directory<br/>(File yang sedang Anda ketik di IDE)"] -->|"git add &lt;file&gt;<br/>(Bungkus ke keranjang)"| B["📦 2. Staging Area<br/>(Daftar file siap foto)" ]
    B -->|"git commit -m 'pesan'<br/>(Jepret snapshot permanen)"| C["💾 3. Local Repository<br/>(Album sejarah tersimpan abadi)" ]
    C -.->|"git push (opsional)<br/>(Kirim salinan)"| D["☁️ 4. Remote Server<br/>(GitLab / GitHub / Server Lokal)" ]
```

* **Working Directory**: Keadaan fisik file di disk Anda saat ini.
* **Staging Area (Index)**: Area persiapan. Anda bisa mengedit 10 file, tetapi hanya memilih 2 file penting untuk disimpan ke riwayat.
* **Local Repository**: Database Git (`.git`) yang menyimpan titik balik (*checkpoint*) permanen.
* **Remote Repository**: Server backup terpusat (jika digunakan).

---

## 3. Arsitektur Lingkungan `W:\chepy` (Multi-Repo)

Di lingkungan `W:\chepy`, kita memiliki belasan aplikasi client (`everest`, `san`, `majumapan`, `sumber_boga`, `teguh`, `san_add`, dll). 

### Arsitektur yang Diterapkan: **Multi-Repository Mandiri**

Setiap folder client menjadi repositori Git independen:

```text
W:\chepy\
├── everest\                 ➔ Memiliki .git sendiri
├── san\                     ➔ Memiliki .git sendiri
├── majumapan\               ➔ Memiliki .git sendiri
├── sumber_boga\             ➔ Memiliki .git sendiri
├── teguh\                   ➔ Memiliki .git sendiri
├── run_jodomart\            ➔ Memiliki .git sendiri
├── san_add\                 ➔ Memiliki .git sendiri
├── san_ppu\                 ➔ Memiliki .git sendiri
├── san_sarana\              ➔ Memiliki .git sendiri
├── san_sdl\                 ➔ Memiliki .git sendiri
└── san_tsa\                 ➔ Memiliki .git sendiri
```

### Mengapa Pendekatan Ini yang Terbaik?
1. **Isolasi Log**: Perubahan fitur di SAN Sarana tidak mencemari riwayat perubahan Everest.
2. **Kemandirian Modul**: Tiap client memiliki konfigurasi dan siklus rilis yang berbeda.
3. **Kecepatan & Performa**: Git tidak perlu meng-indeks puluhan ribu file sekaligus dari 11 client, melainkan hanya di lingkup folder client yang sedang Anda buka.

---

## 4. Proteksi File Wajib: `.gitignore`

File `.gitignore` diletakkan di root setiap proyek client. Tujuannya adalah **memberi tahu Git file mana saja yang HARUS DIABAIKAN** agar tidak ikut terekam ke riwayat.

### Contoh Template Standar `.gitignore` untuk CI3 Sandbox:
```gitignore
# ==========================================
# 1. Logs & Session File (Selalu Berubah)
# ==========================================
/application/logs/*
!/application/logs/index.html
/logs/*
*.log

# ==========================================
# 2. File Upload / Data User (Ukuran Besar)
# ==========================================
/uploads/*
/assets/uploads/*
!/uploads/index.html

# ==========================================
# 3. File Temporary & Backup Manual
# ==========================================
*.bak
*.bak*
*.tmp
*.rar
*.zip
*.7z
*.sql
*.tar.gz

# ==========================================
# 4. Folder Konfigurasi IDE Editor
# ==========================================
.idea/
.vscode/
*.sublime-project
*.sublime-workspace
Thumbs.db
Desktop.ini
```

> **Catatan Kredensial Database:**
> File `application/config/database.php` pada sandbox diarahkan ke IP `192.168.5.14`. Pastikan Anda berhati-hati agar file ini tidak tertimpa setelan server produksi (`192.168.11.100`) saat memindahkan kode.

---

## 5. Alur Kerja Sehari-hari (Daily Workflow)

Berikut langkah demi langkah yang Anda lakukan setiap hari saat bekerja:

### Langkah 1: Periksa Status Sebelum Bekerja
Buka terminal di folder client (misal `W:\chepy\sumber_boga`):
```bash
git status
```
*Jika output bertuliskan `working tree clean`, artinya folder Anda aman dan tidak ada perubahan menggantung.*

### Langkah 2: Lakukan Perubahan Kode di IDE
Anda mengedit baris kode di Controller, Model, atau View seperti biasa.

### Langkah 3: Periksa Apa Saja yang Berubah (Diff Check)
Sebelum menyimpan, Anda ingin memastikan baris mana saja yang tadi Anda ketik:
```bash
git diff
```
*Terminal akan menampilkan warna **MERAH** (baris lama yang dihapus/diubah) dan **HIJAU** (baris baru yang ditambahkan).*

### Langkah 4: Daftarkan File yang Siap Disimpan
```bash
# Jika ingin mendaftarkan satu file spesifik:
git add application/controllers/CronTray.php

# Jika ingin mendaftarkan seluruh file yang Anda ubah:
git add .
```

### Langkah 5: Buat Checkpoint (Commit)
Jepret foto permanen dengan menyertakan catatan pesan yang jelas:
```bash
git commit -m "Update query CronTray agar mendukung multi-table"
```
*Selesai! Versi kode Anda saat ini sudah tersimpan abadi di album sejarah Git.*

---

## 6. Mekanisme Rollback & Pembatalan (Emergency Undo)

Inilah kekuatan terbesar Git saat terjadi kesalahan atau kepanikan:

### Kasus A: "Saya sedang edit file X, kodenya rusak, saya ingin kembali seperti semula."
*(Kondisi: File belum di-commit)*
```bash
git checkout -- application/controllers/_tray.php
# Atau di Git versi modern:
git restore application/controllers/_tray.php
```
*Dalam sekejap mata, file tersebut kembali persis seperti kondisi terakhir yang stabil.*

### Kasus B: "Saya sudah terlanjur menjalankan `git add .`, tapi belum di-commit."
```bash
git reset HEAD
# Atau di Git versi modern:
git restore --staged .
```
*File dikeluarkan dari keranjang persiapan tanpa menghapus ketikan Anda.*

### Kasus C: "Saya ingin membatalkan commit terakhir yang sudah tersimpan."
```bash
# Batalkan commit terakhir tapi ketikan kode Anda tetap aman di layar:
git reset --soft HEAD~1

# Batalkan commit terakhir DAN hapus seluruh ketikan (KEMBALI BERSIH TOTAL - HATI-HATI):
git reset --hard HEAD~1
```

---

## 7. Strategi Percabangan (Branching Strategy)

Jika Anda ingin mencoba fitur eksperimen yang rumit dan berpotensi merusak sistem, **JANGAN** lakukan langsung di jalur utama (`master`). Buatlah **Cabang (Branch)** baru!

```mermaid
gitGraph
    commit id: "Baseline Awal"
    commit id: "Tray Stabil"
    branch fitur-eksperimen-kasir
    checkout fitur-eksperimen-kasir
    commit id: "Coba Ubah Query"
    commit id: "Uji Coba Berhasil"
    checkout master
    merge fitur-eksperimen-kasir id: "Gabung ke Master"
    commit id: "Rilis Sandbox Stabil"
```

### Perintah Praktis Percabangan:
```bash
# 1. Membuat branch baru sekaligus pindah ke branch tersebut:
git checkout -b fitur-diskon-baru

# 2. Bekerja dan commit di branch tersebut dengan aman:
git add .
git commit -m "Uji coba perhitungan diskon"

# 3. Jika eksperimen gagal total dan ingin dibuang:
git checkout master
git branch -D fitur-diskon-baru

# 4. Jika eksperimen sukses dan ingin digabung ke master:
git checkout master
git merge fitur-diskon-baru
```

---

## 8. Standar Penulisan Pesan Commit (Commit Convention)

Agar catatan sejarah mudah dibaca di kemudian hari, gunakan pola prefiks standar industri:

| Prefiks | Kapan Digunakan | Contoh Pesan Commit |
|---|---|---|
| `[FEAT]` | Menambah fitur atau controller baru | `[FEAT] Pasang CronTray Multi-Table Aggregator` |
| `[FIX]` | Memperbaiki bug atau query yang salah | `[FIX] Koreksi join payment_source di cabang SAN` |
| `[REFACTOR]` | Merapikan struktur kode tanpa mengubah fungsi | `[REFACTOR] Rampingkan _tray.php dari 1200ln ke 66ln` |
| `[CONFIG]` | Mengubah setelan konfigurasi server/database | `[CONFIG] Ubah hostname DB sandbox ke 192.168.5.14` |
| `[CHORE]` | Pekerjaan rutin (hapus file sampah, update doc) | `[CHORE] Tambahkan template .gitignore CI3` |

---

## 9. Tabel Perintah Sakti (Cheat Sheet)

Simpan tabel ini sebagai contekan cepat:

| Kebutuhan | Perintah Terminal | Penjelasan |
|---|---|---|
| **Cek status** | `git status` | Melihat file mana yang diubah, ditambah, atau dihapus. |
| **Cek perbedaan** | `git diff` | Menampilkan baris yang berubah sebelum di-add. |
| **Bungkus file** | `git add <nama_file>` | Memasukkan file ke keranjang staging. |
| **Bungkus semua** | `git add .` | Memasukkan seluruh perubahan saat ini ke staging. |
| **Simpan snapshot** | `git commit -m "catatan"` | Menyimpan checkpoint permanen dengan pesan. |
| **Lihat riwayat** | `git log --oneline -n 10` | Menampilkan 10 commit terakhir secara ringkas 1 baris. |
| **Batalkan file edit** | `git checkout -- <file>` | Membuang perubahan di file dan kembali ke commit terakhir. |
| **Lihat daftar branch**| `git branch` | Melihat branch yang sedang aktif (*warna hijau). |
| **Buat branch baru** | `git checkout -b <nama>` | Membuat sekaligus berpindah ke cabang baru. |
| **Pindah branch** | `git checkout <nama>` | Berpindah ke cabang lain. |

---

## 10. Pantangan Keras (Common Pitfalls & Anti-Patterns)

1. ❌ **Jangan Pernah Meng-commit File Dump SQL Raksasa (> 50 MB)**  
   *Alasan:* Git bukan database server. File biner/dump besar akan membuat folder `.git` membengkak dan lambat saat di-clone. Masukkan file `*.sql` ke `.gitignore`.
2. ❌ **Jangan Pernah Meng-commit Folder Log atau Session**  
   *Alasan:* File log bertambah setiap detik. Git akan terus-menerus mendeteksi perubahan semu yang mengotori status kerja Anda.
3. ❌ **Hindari Pesan Commit yang Tidak Bermakna**  
   *Contoh Buruk:* `git commit -m "update"` atau `git commit -m "fix error"`  
   *Contoh Baik:* `git commit -m "[FIX] Perbaiki parameter goto di auth/Login.php"`
4. ❌ **Jangan Lakukan `git reset --hard` Tanpa Sadar Penuh**  
   *Alasan:* Perintah `--hard` akan menghapus seluruh kode yang belum di-commit secara permanen dan tidak bisa dikembalikan.

---

*Dokumen ini dibuat pada 03 September 2026 sebagai panduan resmi standar pengembangan lingkungan sandbox client.*
