1. Apa Itu Version Control?
Bayangkan Anda sedang mengerjakan proyek firmware ESP32 untuk sistem monitoring suhu di pabrik. Hari ini Anda menambahkan fitur MQTT, besok Anda mengubah format data sensor, lusa Anda menemukan bug dan ingin kembali ke kode minggu lalu. Tanpa version control, Anda mungkin membuat salinan folder seperti firmware_v1, firmware_v2_final, firmware_v2_final_beneran โ sebuah mimpi buruk yang tidak terkelola.
Version Control System (VCS) adalah alat yang mencatat setiap perubahan pada kode sumber seiring waktu. Dengan VCS, Anda bisa melihat siapa yang mengubah apa, kapan perubahan terjadi, dan mengapa โ semuanya tersimpan dalam satu repositori terpusat. Lebih penting lagi, Anda bisa kembali ke versi mana pun kapan saja.
Mengapa Developer IoT Butuh Git?
| Keunggulan | Penjelasan |
|---|---|
| Riwayat Lengkap | Setiap perubahan kode tercatat โ bisa kembali ke versi sebelumnya kapan saja |
| Kolaborasi Tim | Banyak orang bisa bekerja pada proyek yang sama tanpa saling menimpa kode |
| Branching | Buat fitur baru di branch terpisah tanpa mengganggu kode utama yang sudah stabil |
| Backup Otomatis | Repositori remote (GitHub) menjadi cadangan cloud untuk semua kode Anda |
| Code Review | Pull request memungkinkan tim meninjau kode sebelum digabung ke produksi |
| CI/CD Integration | GitHub Actions bisa otomatis build, test, dan deploy firmware IoT |
Git vs Sistem Version Control Lain
Ada banyak VCS yang pernah populer โ CVS, Subversion (SVN), Mercurial โ tapi Git kini mendominasi. Git diciptakan oleh Linus Torvalds pada 2005 untuk mengelola kode kernel Linux. Fitur utamanya adalah distributed version control: setiap developer memiliki salinan penuh repositori di komputernya sendiri, termasuk seluruh riwayat.
| Aspek | Git (Distributed) | SVN (Centralized) |
|---|---|---|
| Model | Setiap developer punya clone penuh | Satu server pusat, client hanya punya snapshot |
| Kecepatan | Sangat cepat (operasi lokal) | Tergantung koneksi ke server |
| Branching | Ringan dan cepat | Berat dan lambat |
| Offline | Bisa commit, log, diff tanpa internet | Butuh koneksi ke server |
| Platform populer | GitHub, GitLab, Bitbucket | Apache Subversion, Assembla |
| Adopsi industri | ~95% developer global | Legacy / perusahaan lama |
2. Git Init & Clone
Sebelum menggunakan Git, pastikan sudah terinstal di sistem Anda. Git tersedia untuk semua platform โ Windows, macOS, dan Linux.
Instalasi Git
3.1 โ Menambahkan File ke Staging
# Cek status โ lihat file apa saja yang berubah
git status
# Tambahkan satu file ke staging
git add main.py
# Tambahkan beberapa file sekaligus
git add sensor.py config.py
# Tambahkan semua file di direktori saat ini
git add .
# Tambahkan semua file .py saja
git add *.py
# Batalkan staging (unstage) tanpa mengubah isi file
git reset HEAD main.py
# Tambahkan hanya sebagian perubahan dalam satu file (interactive)
git add -p main.py
# Git akan menampilkan setiap chunk perubahan, Anda pilih y/n
3.2 โ Membuat Commit
Commit adalah "foto" dari isi staging area pada waktu tertentu. Setiap commit memiliki hash unik (SHA-1), pesan deskripsi, dan informasi penulis.
# Commit dengan pesan
git commit -m "feat: tambah pembacaan sensor DHT22"
# Commit semua file yang sudah ter-track (sudah pernah di-add)
git commit -am "fix: perbaiki format data suhu"
# Catatan: -am TIDAK berlaku untuk file baru yang belum pernah di-add
# Commit dengan pesan panjang (buka editor)
git commit
# Amend โ ubah commit terakhir (pesan atau isi)
git commit --amend -m "feat: tambah pembacaan sensor DHT22 + BME280"
3.3 โ Menulis Pesan Commit yang Baik
Pesan commit yang jelas adalah investasi untuk masa depan โ termasuk untuk diri Anda sendiri 6 bulan ke depan saat lupa apa yang sudah diubah. Berikut konvensi yang umum digunakan:
| Prefix | Kegunaan | Contoh |
|---|---|---|
feat: | Fitur baru | feat: tambah monitoring suhu via MQTT |
fix: | Perbaikan bug | fix: handle error koneksi broker putus |
docs: | Dokumentasi | docs: update README dengan cara instalasi |
refactor: | Restruktur kode tanpa ubah fungsi | refactor: pisah modul sensor ke folder tersendiri |
chore: | Tugas pemeliharaan | chore: update dependencies ke versi terbaru |
test: | Tambah atau ubah test | test: unit test untuk fungsi baca suhu |
3.4 โ Melihat Riwayat Commit
# Lihat log commit
git log
# Log ringkas satu baris per commit
git log --oneline
# a3f7b2c feat: tambah pembacaan sensor DHT22
# 1e4d8a9 fix: perbaiki format data suhu
# c0ffee1 docs: update README
# Log dengan graf branch
git log --oneline --graph --all
# Lihat perubahan di commit tertentu
git show a3f7b2c
# Lihat perubahan yang belum di-commit
git diff
# Lihat perubahan yang sudah di-staging tapi belum di-commit
git diff --staged
4. Branching & Merging
Branching adalah salah satu fitur terkuat Git. Bayangkan Anda sedang mengembangkan firmware v2 untuk ESP32, tapi v1 masih berjalan di produksi. Dengan branch, Anda bisa mengembangkan v2 tanpa mengganggu kode v1 โ keduanya hidup berdampingan di repositori yang sama.
Konsep Branch
4.1 โ Membuat & Berpindah Branch
# Lihat semua branch lokal
git branch
# * main (tanda * = branch aktif)
# Buat branch baru
git branch feature/suhu-dht22
# Pindah ke branch baru
git checkout feature/suhu-dht22
# Shortcut: buat + pindah sekaligus
git checkout -b feature/suhu-dht22
# Git modern (2.23+): gunakan 'git switch'
git switch -c feature/suhu-dht22 # buat baru + pindah
git switch main # kembali ke main
# Lihat semua branch (termasuk remote)
git branch -a
# * main
# feature/suhu-dht22
# remotes/origin/main
# remotes/origin/develop
# Rename branch
git branch -m feature/suhu-dht22 feature/dht22-sensor
# Hapus branch lokal yang sudah selesai
git branch -d feature/dht22-sensor
4.2 โ Merge: Menggabungkan Branch
# 1. Pastikan di branch tujuan
git switch main
# 2. Gabungkan branch feature ke main
git merge feature/suhu-dht22
# Output: Merge made by the 'ort' strategy.
# 3. Jika ada konflik, Git akan berhenti dan minta resolusi manual:
# Auto-merging main.py
# CONFLICT (content): Merge conflict in main.py
# Automatic merge failed; fix conflicts and then commit the result.
4.3 โ Menyelesaikan Merge Conflict
Konflik terjadi saat dua branch mengubah baris yang sama di file yang sama. Git tidak tahu mana yang benar โ Anda harus memutuskan secara manual.
# <<<<<<< HEAD (kode dari branch saat ini)
BROKER_HOST = "192.168.1.100"
BROKER_PORT = 1883
# ======== (pemisah)
BROKER_HOST = "mqtt.beebanlabs.id"
BROKER_PORT = 8883
# >>>>>>> feature/suhu-dht22 (kode dari branch yang di-merge)
# 1. Edit file, hapus marker konflik (<<<, ===, >>>)
# Pilih kode yang benar atau gabungkan keduanya
# 2. Setelah selesai edit, tambahkan ke staging
git add main.py
# 3. Commit hasil merge
git commit -m "merge: gabung feature/suhu-dht22, selesaikan konflik broker"
# Alternatif: batalkan merge jika terlalu rumit
git merge --abort
Untuk proyek IoT dengan banyak kontributor, usahakan setiap perubahan fitur berada di branch terpisah dan sering-sering merge ke main. Semakin lama branch terpisah, semakin besar kemungkinan konflik. Praktik ini disebut trunk-based development.
5. Remote Repositories
Repositori lokal di komputer Anda hanya bisa diakses oleh Anda. Untuk berkolaborasi dengan orang lain atau membuat cadangan cloud, Anda membutuhkan remote repository. GitHub adalah platform paling populer untuk ini, tapi GitLab dan Bitbucket juga merupakan alternatif yang baik.
5.1 โ Menghubungkan ke Remote
# Lihat remote yang sudah terhubung
git remote -v
# Tambahkan remote baru (setelah buat repo di GitHub)
git remote add origin https://github.com/username/iot-smart-home.git
# Ganti URL remote (misal dari HTTPS ke SSH)
git remote set-url origin git@github.com:username/iot-smart-home.git
# Hapus remote
git remote remove origin
5.2 โ Push: Mengirim ke Remote
# Push pertama kali (set upstream ke origin/main)
git push -u origin main
# Push selanjutnya (upstream sudah terset)
git push
# Push branch baru ke remote
git push origin feature/suhu-dht22
# Force push (hati-hati โ menimpa riwayat remote!)
git push --force origin main
# Hapus branch di remote
git push origin --delete feature/suhu-dht22
Jangan pernah git push --force ke branch yang digunakan banyak orang (misal main atau develop) tanpa koordinasi. Force push menimpa riwayat dan bisa menghapus commit orang lain. Gunakan git push --force-with-lease sebagai alternatif yang lebih aman โ ia hanya force push jika tidak ada commit baru di remote yang belum Anda pull.
5.3 โ Pull: Mengambil dari Remote
# Pull = fetch + merge โ ambil perubahan terbaru dan gabungkan
git pull
# Pull dari branch tertentu
git pull origin develop
# Fetch saja (lihat perubahan tanpa merge)
git fetch
git log origin/main --oneline
# Pull dengan rebase (riwayat lebih rapi)
git pull --rebase origin main
5.4 โ Workflow Git Push/Pull
6. Pull Requests di GitHub
Pull Request (PR) adalah mekanisme inti kolaborasi di GitHub. PR memberitahu tim: "Saya sudah selesai mengerjakan fitur X di branch terpisah, tolong review kode saya sebelum digabung ke main." PR bukan sekadar tombol merge โ ia adalah ruang diskusi, code review, dan quality gate.
6.1 โ Alur Kerja Pull Request
# 1. Buat branch baru dari main
git checkout -b feature/relay-control
# 2. Lakukan perubahan dan commit
git add relay.py
git commit -m "feat: tambah kontrol relay via MQTT"
git add tests/test_relay.py
git commit -m "test: unit test untuk relay control"
# 3. Push branch ke GitHub
git push -u origin feature/relay-control
# 4. Buka GitHub โ akan muncul tombol "Compare & pull request"
# Klik tombol tersebut, isi deskripsi PR, lalu buat PR
# Alternatif: buat PR via GitHub CLI (jika sudah instal gh)
gh pr create --title "feat: kontrol relay via MQTT" \
--body "Menambahkan modul kontrol relay dengan command on/off via MQTT topic home/actuator/relay"
6.2 โ Best Practices Pull Request
| Praktik | Penjelasan |
|---|---|
| PR kecil & fokus | Satu PR = satu fitur/perbaikan. Jangan campur fitur baru dengan refactor besar |
| Deskripsi jelas | Jelaskan apa yang diubah, mengapa, dan cara test-nya |
| Self-review dulu | Review kode sendiri sebelum minta orang lain โ perbaiki typo, komentar berlebihan |
| Link ke issue | Gunakan "Closes #12" di deskripsi PR agar issue otomatis tertutup saat merge |
| Tests harus lolos | Pastikan CI/CD pipeline hijau sebelum minta review |
| Rebase sebelum review | Pastikan branch Anda up-to-date dengan main sebelum merge |
6.3 โ Code Review
Sebagai reviewer, tugas Anda adalah mengecek:
- โ Apakah kode melakukan apa yang diklaim di deskripsi PR?
- โ Apakah ada edge case yang belum ditangani?
- โ Apakah penamaan variabel dan fungsi sudah jelas?
- โ Apakah ada perubahan yang bisa merusak kompatibilitas backward?
- โ Apakah dokumentasi perlu diupdate?
- โ Apakah credential/password terekspos di kode?
7. File .gitignore
Tidak semua file pantas masuk ke repositori. File sementara, cache, environment variable, dan secret key harus diabaikan. File .gitignore memberitahu Git file dan folder mana yang boleh di-skip.
7.1 โ Membuat .gitignore
# Buat file .gitignore di root repositori
touch .gitignore
7.2 โ Template .gitignore untuk Proyek IoT/Python
# ========== PYTHON ==========
__pycache__/
*.py[cod]
*.pyo
*.egg-info/
dist/
build/
*.egg
.eggs/
# ========== VIRTUAL ENVIRONMENT ==========
venv/
.venv/
env/
ENV/
# ========== ENVIRONMENT & SECRETS ==========
.env
.env.local
.env.production
*.pem
*.key
secrets.json
credentials.json
# ========== IDE & EDITOR ==========
.vscode/
.idea/
*.swp
*.swo
*~
.DS_Store
Thumbs.db
# ========== LOGS & DATA ==========
*.log
logs/
data/*.csv
data/*.db
# ========== HARDWARE/EMBEDDED ==========
*.bin
*.hex
*.elf
build_output/
.pio/
.platformio/
Jika file sudah pernah di-track oleh Git (sudah pernah di-commit), menambahkannya ke .gitignore saja tidak cukup. Anda harus menghapus file dari tracking terlebih dahulu: git rm --cached namafile. Untuk folder: git rm -r --cached folder/.
7.3 โ Pola Umum .gitignore
| Pola | Arti | Contoh Cocok |
|---|---|---|
*.log | Semua file ekstensi .log | debug.log, error.log |
build/ | Seluruh isi folder build | build/output.bin |
**/*.pyc | File .pyc di semua subfolder | src/__pycache__/main.pyc |
!.env.example | Pengecualian โ file ini TIDAK diabaikan | .env.example (template) |
data/*.csv | CSV di folder data saja | data/sensor_log.csv |
8. Kolaborasi di GitHub
GitHub lebih dari sekadar hosting Git โ ia adalah platform kolaborasi lengkap dengan fitur Issues, Projects, Actions, Discussions, dan banyak lagi. Bagi tim developer IoT, GitHub menjadi pusat koordinasi dari kode firmware sampai deployment ke perangkat.
8.1 โ Fork & Contribute
Fork adalah cara berkontribusi ke proyek orang lain tanpa harus diundang sebagai collaborator. Anda membuat salinan repositori di akun GitHub sendiri, lalu mengirim Pull Request dari fork Anda ke repositori asli.
# 1. Fork repositori di GitHub (klik tombol "Fork")
# 2. Clone fork Anda
git clone https://github.com/username/iot-smart-home.git
cd iot-smart-home
# 3. Tambahkan repositori asli sebagai "upstream"
git remote add upstream https://github.com/original-owner/iot-smart-home.git
# 4. Buat branch untuk kontribusi
git checkout -b fix/typo-readme
# 5. Lakukan perubahan & commit
git add README.md
git commit -m "docs: perbaiki typo di README"
# 6. Push ke fork Anda
git push origin fix/typo-readme
# 7. Buka GitHub โ buat Pull Request dari fork ke repositori asli
# 8. Untuk tetap up-to-date dengan repositori asli:
git fetch upstream
git merge upstream/main
8.2 โ GitHub Issues & Projects
Issues adalah cara terstruktur untuk melacak bug, fitur baru, dan tugas. Untuk proyek IoT, Issues sangat berguna untuk:
| Kegunaan Issue | Contoh |
|---|---|
| Bug Report | "Sensor DHT22 mengembalikan NaN saat suhu > 50ยฐC" |
| Feature Request | "Tambahkan support untuk sensor BME680" |
| Task / Todo | "Setup CI/CD pipeline untuk auto-deploy firmware" |
| Diskusi Teknis | "MQTT vs HTTP untuk komunikasi sensor โ mana yang lebih efisien?" |
# Buat issue baru via GitHub CLI
gh issue create --title "feat: support sensor BME680" \
--body "Tambahkan pembacaan data dari sensor BME680 via I2C"
# Lihat daftar issue
gh issue list
# Tutup issue dari commit
git commit -m "feat: tambah support BME680
Closes #15"
8.3 โ GitHub Actions (CI/CD)
GitHub Actions memungkinkan Anda menjalankan otomatisasi โ build, test, deploy โ setiap kali ada push atau pull request. Untuk proyek IoT, ini bisa digunakan untuk:
- ๐จ Build firmware โ kompilasi kode Arduino/PlatformIO setiap push
- ๐งช Run tests โ jalankan unit test Python sebelum merge PR
- ๐ฆ Deploy OTA โ otomatis upload firmware ke server update
- ๐ Lint code โ cek style dan format kode (pylint, flake8)
- ๐ท๏ธ Auto release โ buat GitHub Release dengan binary saat tag baru
name: Run Tests
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install pytest
- name: Run tests
run: pytest tests/ -v
8.4 โ SSH Key untuk GitHub
SSH key menghilangkan kebutuhan memasukkan password setiap kali push. Ini lebih aman dan nyaman:
# 1. Generate SSH key
ssh-keygen -t ed25519 -C "email@anda.com"
# Tekan Enter untuk semua prompt (gunakan default)
# 2. Tambahkan key ke SSH agent
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
# 3. Copy public key
cat ~/.ssh/id_ed25519.pub
# Salin output-nya
# 4. Buka GitHub โ Settings โ SSH and GPG keys โ New SSH key
# Paste public key di sana
# 5. Test koneksi
ssh -T git@github.com
# Hi username! You've successfully authenticated...
9. Quiz: Uji Pemahamanmu!
Setelah membaca tutorial di atas, jawablah 5 pertanyaan berikut untuk menguji pemahamanmu tentang Git dan GitHub: