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 |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β WORKFLOW GIT UNTUK DEVELOPER β β β β ββββββββββββ add ββββββββββββ commit βββββββββββββββ β β β Working β ββββββββΊ β Staging β βββββββββΊ β Local Repo β β β β Directoryβ β Area β β (.git/) β β β ββββββββββββ ββββββββββββ ββββββββ¬βββββββ β β β² β β β β checkout β push β β β βΌ β β ββββββββββββ ββββββββββββ βββββββββββββββ β β β Merge β βββββββββ β Pull β βββββββββ β Remote β β β β Conflictβ β Request β β (GitHub) β β β ββββββββββββ ββββββββββββ βββββββββββββββ β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
2. Git Init & Clone
Sebelum menggunakan Git, pastikan sudah terinstal di sistem Anda. Git tersedia untuk semua platform β Windows, macOS, dan Linux.
Instalasi Git
# Di Ubuntu / Debian sudo apt update && sudo apt install git -y # Di Fedora / CentOS sudo dnf install git -y # Di macOS (via Homebrew) brew install git # Di Windows β download installer dari https://git-scm.com # Atau via winget: winget install Git.Git # Verifikasi instalasi git --version # Output: git version 2.45.0
Konfigurasi Awal Git
Setelah instalasi, atur identitas Anda. Ini penting karena setiap commit akan mencatat siapa yang membuat perubahan:
# Konfigurasi nama dan email (global β berlaku untuk semua repo) git config --global user.name "Nama Anda" git config --global user.email "email@anda.com" # Set default branch name ke 'main' git config --global init.defaultBranch main # Set editor default (opsional) git config --global core.editor "code --wait" # VS Code # git config --global core.editor "nano" # Nano # Lihat semua konfigurasi git config --list
Gunakan --global untuk konfigurasi yang berlaku di semua repositori. Jika ingin konfigurasi berbeda per proyek (misal email kantor vs pribadi), jalankan perintah yang sama tanpa --global di dalam folder proyek tersebut.
2.1 β git init: Membuat Repositori Baru
Perintah git init mengubah folder biasa menjadi repositori Git. Perintah ini membuat folder tersembunyi .git/ yang menyimpan seluruh riwayat dan konfigurasi repositori.
# Buat folder proyek baru mkdir iot-smart-home && cd iot-smart-home # Inisialisasi repositori Git git init # Output: Initialized empty Git repository in /home/user/iot-smart-home/.git/ # Cek status git status # Output: On branch main # No commits yet # nothing to commit (create files and use "git add" to track) # Buat file pertama echo "# IoT Smart Home" > README.md # Lihat folder .git yang tersembunyi ls -la .git/ # HEAD, config, description, hooks/, info/, objects/, refs/
2.2 β git clone: Mengambil Salinan Repositori
Jika proyek sudah ada di GitHub atau platform lain, Anda tidak perlu membuat dari nol. Gunakan git clone untuk mengunduh salinan lengkap beserta seluruh riwayat:
# Clone repositori dari GitHub (HTTPS) git clone https://github.com/Beebane25/iot-smart-home.git # Masuk ke folder hasil clone cd iot-smart-home # Clone ke folder dengan nama berbeda git clone https://github.com/Beebane25/iot-smart-home.git my-project # Clone dengan SSH (lebih aman, butuh SSH key) git clone git@github.com:Beebane25/iot-smart-home.git # Clone branch tertentu saja git clone -b develop https://github.com/Beebane25/iot-smart-home.git # Clone dengan kedalaman terbatas (hemat bandwidth, tanpa full history) git clone --depth 1 https://github.com/Beebane25/iot-smart-home.git
git clone --depth 1 hanya mengambil commit terakhir β cocok untuk deployment cepat, tetapi Anda tidak bisa melihat riwayat atau membuat branch dari commit lama. Hindari untuk pengembangan aktif.
3. Staging & Committing
Git memiliki konsep unik bernama staging area (atau index). Ini adalah "ruang tunggu" antara perubahan di working directory Anda dan commit yang tercatat permanen di riwayat. Konsep ini memungkinkan Anda memilih secara presisi perubahan mana yang ingin dimasukkan ke dalam satu commit.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β SIKLUS KERJA GIT β β β β 1. Edit file di Working Directory β β ββββββββββββββββββββββββ β β β main.py (modified) β β β β sensor.py (new) β β β β .env (new) β β file rahasia! β β ββββββββββββ¬ββββββββββββ β β β β β 2. git add main.py sensor.py (pilih file) β β βΌ β β ββββββββββββββββββββββββ β β β STAGING AREA β β β β β main.py β β β β β sensor.py β β β β β .env (diabaikan) β β β ββββββββββββ¬ββββββββββββ β β β β β 3. git commit -m "tambah sensor baru" β β βΌ β β ββββββββββββββββββββββββ β β β LOCAL REPO (.git) β β β β Commit: a3f7b2c β β β β Author: Anda β β β β Message: "tambah β β β β sensor baru" β β β ββββββββββββββββββββββββ β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
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
main: AβββBβββCβββββββββββββββF (merge)
\ /
feature/suhu: DβββEβββββββ
A = Inisialisasi proyek
B = Tambah konfigurasi WiFi
C = Tambah publish MQTT
D = Buat branch feature/suhu
E = Tambah pembacaan sensor suhu
F = Merge feature/suhu ke main
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
Developer A (PC Kantor) GitHub Developer B (Rumah)
ββββββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββ
β Local Repo β push β β pull β Local Repo β
β ββββββββββΊβ Remote Repo ββββββββββΊβ β
β main β β (origin) β β main β
β feature/abc β β β β feature/xyz β
ββββββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββ
β β² β
β pull request β code review β
ββββββββββββββββββββββββββββββ΄βββββββββββββββββββββββββββ
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: