05 · Git & Version Control
Fase: 2 · Estimasi: 1 minggu · Prasyarat: tidak ada
Kenapa ini penting
Hampir semua developer bisa commit dan push, tapi panik saat terjadi rebase conflict, detached HEAD, atau commit yang hilang. Begitu object model Git dipahami, tidak ada lagi perintah yang terasa menakutkan.
Peta konsep
Dasar
-
init,add,commit,status,log,diff - Branch, merge, conflict resolution
- Remote:
clone,fetch,pull,push - VCS hosting: GitHub, GitLab, Bitbucket; pull request / merge request
Menengah
-
rebasevsmerge, interactive rebase,--fixup+--autosquash -
reset(soft/mixed/hard) vsrevertvsrestore -
refloguntuk menyelamatkan commit yang "hilang" -
stash,cherry-pick,bisect - Konvensi: Conventional Commits, trunk-based vs Git Flow
Deep dive
- Object model: blob, tree, commit, tag; content-addressable storage
- Ref, HEAD, index (staging area) sebagai file
- Packfile dan delta compression
- Merge strategy (
ort) dan three-way merge
Cara belajar
- Buat repo kosong, lalu jalankan
find .git -type fsetelah setiap perintah untuk melihat apa yang berubah. - Gunakan
git cat-file -p <hash>untuk menelusuri commit → tree → blob secara manual. - Latihan
bisectpada repo yang sengaja diberi bug di commit ke-37 dari 50. - Selamatkan commit setelah
reset --harddenganreflog.
Uji pemahaman
- Apa yang sebenarnya disimpan sebuah commit? Kenapa mengubah satu file mengubah hash semua commit sesudahnya saat rebase?
- Kenapa "jangan rebase branch yang sudah di-push bersama" adalah aturan yang masuk akal?
- Apa beda
git reset --soft HEAD~1dengangit revert HEAD? - Bagaimana Git tahu sebuah file di-rename padahal yang disimpan hanya snapshot?
Proyek latihan
| Tingkat | Proyek | Yang dilatih |
|---|---|---|
| Dasar | Kontribusi PR ke repo open source (dokumentasi pun boleh) | Workflow PR |
| Menengah | Setup repo dengan Conventional Commits + commitlint + changelog otomatis | Konvensi, tooling |
| Deep | Tulis mini Git: init, hash-object, cat-file, write-tree, commit-tree | Object model |
Sumber primer
Toolkit terkait
- Repo ini sendiri memakai changesets untuk versioning package