VERSION-CONTROL DOCS

FUNDAMENTAL

Apa itu Version Control?
Description: Sistem yang merekam perubahan pada file dari waktu ke waktu sehingga Anda dapat memanggil kembali versi tertentu nanti.
Example:
Menyimpan setiap perubahan kode sebagai 'commit' sehingga bisa kembali ke versi sebelumnya jika terjadi bug.
Output: Sejarah proyek terlacak sepenuhnya.
Manfaat Version Control
Description: Kolaborasi tim, lacak perubahan, eksperimen aman (branch), backup, dan audit trail.
Example:
Dua developer mengerjakan fitur berbeda di branch masing-masing lalu digabungkan tanpa saling menimpa.
Output: Proses pengembangan paralel yang aman.
Centralized vs Distributed
Description: Centralized (CVS, SVN): satu server pusat. Distributed (Git): setiap klien memiliki salinan repositori penuh.
Example:
Git memungkinkan bekerja offline dan commit lokal sebelum push ke remote.
Output: Lebih cepat, offline-capable, dan aman karena setiap klien adalah backup.
Git Tiga Status
Description: Modified (working directory) → Staged (staging area) → Committed (local repository).
Example:
git add memindahkan perubahan dari working directory ke staging area. git commit memindahkan dari staging ke repository.
Output: Alur kerja dua langkah yang fleksibel.

SETUP-KONFIGURASI

git config --global user.name
Description: Mengatur nama pengguna yang akan digunakan pada setiap commit di semua repositori.
Example:
git config --global user.name "Ridho Akbar"
Output: Nama tersimpan di ~/.gitconfig
git config --global user.email
Description: Mengatur email pengguna untuk commit.
Example:
git config --global user.email "ridho@example.com"
Output: Email tersimpan, digunakan untuk identifikasi commit.
git config --global core.editor
Description: Menentukan editor teks default untuk menulis pesan commit (misal VS Code).
Example:
git config --global core.editor "code --wait"
Output: Editor terbuka saat git commit tanpa -m.
git config --global init.defaultBranch
Description: Mengatur nama branch default saat git init (misal 'main' sebagai ganti 'master').
Example:
git config --global init.defaultBranch main
Output: Repo baru akan langsung menggunakan branch 'main'.
git init
Description: Membuat repositori Git baru di direktori yang ada. Membuat folder .git tersembunyi.
Example:
git init my-project
Output: Initialized empty Git repository in my-project/.git/
git clone <url>
Description: Menduplikasi repositori remote (GitHub, GitLab) ke lokal beserta seluruh sejarah commit.
Example:
git clone https://github.com/user/repo.git
Output: Folder repo lengkap dengan riwayat commit.
git clone --branch <name> <url>
Description: Clone langsung ke branch tertentu.
Example:
git clone --branch develop https://github.com/user/repo.git
Output: Branch develop yang ter-checkout, bukan main.

DASAR-PERUBAHAN

git status
Description: Menampilkan status working directory dan staging area: file mana yang berubah, baru, atau siap di-commit.
Example:
git status
Output: On branch main Changes not staged for commit: modified: index.js
git add <file>
Description: Menambahkan perubahan pada file tertentu ke staging area (index).
Example:
git add index.html style.css
Output: File siap di-commit.
git add .
Description: Menambahkan semua perubahan (modifikasi, file baru, penghapusan) di direktori saat ini dan subdirektori ke staging.
Example:
git add .
Output: Semua perubahan masuk staging.
git add -p
Description: Menambahkan perubahan secara interaktif (patch) – memilih bagian (hunk) mana yang akan di-stage.
Example:
git add -p
Output: Prompt untuk setiap hunk: Stage this hunk [y,n,q,a,d,e,?]?
git commit -m "<pesan>"
Description: Merekam perubahan yang sudah di-staging ke repositori lokal dengan pesan singkat.
Example:
git commit -m "feat: tambahkan halaman login"
Output: [main a1b2c3d] feat: tambahkan halaman login
git commit -am "<pesan>"
Description: Langsung menambahkan perubahan yang sudah terlacak (modified) ke staging dan melakukan commit. Tidak untuk file baru.
Example:
git commit -am "fix: perbaiki typo"
Output: Commit dengan add otomatis untuk file yang sudah ada.
git diff
Description: Menunjukkan perbedaan antara working directory dan staging area (perubahan yang belum di-add).
Example:
git diff
Output: diff --git a/index.js b/index.js --- a/index.js +++ b/index.js @@ -1,4 +1,4 @@ - console.log('lama') + console.log('baru')
git diff --staged
Description: Menunjukkan perbedaan antara staging area dan commit terakhir (apa yang akan di-commit).
Example:
git diff --staged
Output: Perubahan yang sudah di-add akan ditampilkan.
git log
Description: Menampilkan riwayat commit di branch saat ini.
Example:
git log --oneline --graph --all
Output: * a1b2c3d feat: halaman login * e5f6g7h fix: bug navbar

BRANCH-PENGGABUNGAN

git branch
Description: Menampilkan daftar branch lokal. Tanda * menunjukkan branch yang sedang aktif.
Example:
git branch
Output: * main feature-login
git branch <nama>
Description: Membuat branch baru berdasarkan commit terakhir branch saat ini.
Example:
git branch feature/keranjang
Output: Branch baru dibuat, tetapi Anda tetap di branch sebelumnya.
git switch <nama>
Description: Berpindah ke branch yang sudah ada (perintah modern, lebih intuitif).
Example:
git switch feature/keranjang
Output: Switched to branch 'feature/keranjang'
git switch -c <nama>
Description: Membuat branch baru dan langsung berpindah ke branch tersebut.
Example:
git switch -c feature/pencarian
Output: Switched to a new branch 'feature/pencarian'
git checkout <nama>
Description: Cara lama untuk pindah branch atau membuat branch baru dengan -b.
Example:
git checkout -b feature/baru
Output: Switched to a new branch 'feature/baru'
git merge <branch>
Description: Menggabungkan branch lain ke branch saat ini. Buat merge commit baru jika tidak fast-forward.
Example:
git merge feature/login
Output: Merge made by the 'ort' strategy.
git rebase <branch>
Description: Memindahkan seluruh commit branch saat ini ke ujung branch lain, menghasilkan sejarah linear.
Example:
git switch feature
 git rebase main
Output: Sejarah menjadi bersih, seolah feature dimulai dari ujung main.
git branch -d <nama>
Description: Menghapus branch yang sudah di-merge dengan aman.
Example:
git branch -d feature/lama
Output: Deleted branch feature/lama (was a1b2c3d).
git branch -D <nama>
Description: Memaksa menghapus branch meskipun belum di-merge (hati-hati!).
Example:
git branch -D eksperimen-gagal
Output: Deleted branch eksperimen-gagal.

REMOTE-KOLABORASI

git remote -v
Description: Menampilkan daftar remote repository beserta URL fetch dan push.
Example:
git remote -v
Output: origin https://github.com/user/repo.git (fetch) origin https://github.com/user/repo.git (push)
git push origin <branch>
Description: Mengirim commit lokal ke branch remote yang sesuai di server.
Example:
git push origin main
Output: Commit terkirim ke GitHub/GitLab.
git push -u origin <branch>
Description: Mengirim branch dan menetapkan upstream sehingga ke depan cukup git push.
Example:
git push -u origin feature/login
Output: Branch 'feature/login' set up to track 'origin/feature/login'.
git fetch
Description: Mengambil commit dan branch dari remote tanpa langsung menggabungkannya ke working directory.
Example:
git fetch origin
Output: Remote-tracking branches diperbarui (origin/main, origin/feature, dll).
git pull
Description: Mengambil perubahan dari remote (fetch) lalu langsung menggabungkannya (merge) ke branch lokal.
Example:
git pull origin main
Output: Perubahan dari remote masuk ke branch lokal (merge commit mungkin dibuat).
git pull --rebase
Description: Alternatif pull dengan rebase agar sejarah linear, tidak membuat merge commit yang tidak perlu.
Example:
git pull --rebase origin main
Output: Commit lokal diapply ulang di atas commit remote.
git push --force-with-lease
Description: Push paksa yang lebih aman: hanya menimpa remote jika tidak ada commit baru yang belum Anda fetch.
Example:
git push --force-with-lease origin feature/login
Output: Remote branch ditimpa hanya jika tidak ada pekerjaan orang lain.

UNDO

git reset HEAD <file>
Description: Menghapus file dari staging area (unstage), tetapi perubahan tetap di working directory.
Example:
git reset HEAD index.html
Output: Unstaged changes after reset: M index.html
git reset --soft HEAD~1
Description: Membatalkan commit terakhir dan menyimpan perubahannya di staging area.
Example:
git reset --soft HEAD~1
Output: Commit terakhir hilang, perubahan siap di-commit ulang.
git reset --mixed HEAD~1
Description: Membatalkan commit terakhir dan mengembalikan perubahannya ke working directory (default).
Example:
git reset HEAD~1
Output: Commit terakhir hilang, perubahan masih ada sebagai modified.
git reset --hard HEAD~1
Description: Membatalkan commit terakhir dan menghapus perubahannya secara permanen. Gunakan dengan hati-hati!
Example:
git reset --hard HEAD~1
Output: Commit dan perubahan hilang total.
git revert <commit-hash>
Description: Membuat commit baru yang membalikkan perubahan dari commit tertentu. Aman untuk branch yang sudah di-push.
Example:
git revert a1b2c3d
Output: Commit revert baru dibuat, sejarah tetap aman.
git checkout -- <file>
Description: Mengembalikan file di working directory ke versi commit terakhir (buang perubahan lokal).
Example:
git checkout -- index.html
Output: Semua modifikasi yang belum di-add hilang.
git reflog
Description: Menampilkan log semua pergerakan HEAD (penyelamat commit yang 'hilang' setelah reset).
Example:
git reflog
Output: a1b2c3d HEAD@{0}: commit: pesan ... Anda bisa checkout ke HEAD@{n} untuk mengembalikan.

STASH

git stash
Description: Menyimpan perubahan yang belum di-commit ke dalam tumpukan sementara, membersihkan working directory.
Example:
git stash
Output: Saved working directory and index state WIP on main: a1b2c3d ...
git stash pop
Description: Menerapkan stash terakhir dan menghapusnya dari tumpukan.
Example:
git stash pop
Output: Perubahan kembali, stash terhapus.
git stash list
Description: Menampilkan daftar stash yang tersimpan.
Example:
git stash list
Output: stash@{0}: WIP on main: a1b2c3d ... stash@{1}: WIP on feature: ...
git stash apply stash@{n}
Description: Menerapkan stash tertentu tanpa menghapusnya dari tumpukan.
Example:
git stash apply stash@{1}
Output: Perubahan dari stash ke-1 diterapkan, stash tetap ada.
git stash drop stash@{n}
Description: Menghapus stash tertentu dari tumpukan.
Example:
git stash drop stash@{0}
Output: Dropped stash@{0}...

TAG

git tag
Description: Menampilkan daftar tag yang ada (biasanya untuk menandai rilis).
Example:
git tag
Output: v1.0.0 v1.1.0
git tag -a <nama> -m "pesan"
Description: Membuat annotated tag (disarankan) yang menyimpan metadata pembuat, tanggal, dan pesan.
Example:
git tag -a v2.0.0 -m "Rilis versi 2.0.0 dengan fitur X"
Output: Tag v2.0.0 tersimpan lengkap dengan informasi.
git push origin <tagname>
Description: Mengirim tag tertentu ke remote repository.
Example:
git push origin v2.0.0
Output: Tag muncul di GitHub/GitLab.
git push --tags
Description: Mengirim semua tag lokal ke remote sekaligus.
Example:
git push --tags
Output: Semua tag lokal terkirim.

GITHUB-GITLAB

Pull Request (PR) / Merge Request (MR)
Description: Permintaan untuk menggabungkan branch ke branch utama. Tempat code review dan diskusi sebelum merge.
Example:
Buka GitHub → Pull requests → New pull request → pilih branch → Create pull request.
Output: PR tersedia untuk direview oleh tim.
Issues
Description: Fitur untuk melacak tugas, bug, atau permintaan fitur. Bisa dikaitkan dengan commit dan PR.
Example:
Klik Issues → New issue → tulis judul dan deskripsi bug/fitur.
Output: Issue #45: Perbaiki validasi email
GitHub Actions (CI/CD)
Description: Fitur otomatisasi yang berjalan di cloud GitHub, dikonfigurasi dengan file YAML di .github/workflows.
Example:
name: CI
on: push
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm test
Output: Setiap push menjalankan test otomatis.
Fork & Clone
Description: Fork menyalin repositori orang lain ke akun GitHub Anda; lalu clone untuk mengerjakannya secara lokal.
Example:
Klik Fork di GitHub → git clone https://github.com/username-anda/repo.git
Output: Repositori siap dimodifikasi dan bisa di-PR-kan kembali.

BEST-PRACTICES

Conventional Commits
Description: Format penamaan commit: <type>(<scope>): <description>. Contoh: feat(auth): add login.
Example:
feat: tambah fitur pencarian
fix: perbaiki bug pagination
chore: update dependensi
Output: Riwayat commit terstruktur, mudah membuat changelog otomatis.
Git Flow / Trunk-Based Development
Description: Git Flow: branch main, develop, feature/*, hotfix/*. Trunk-Based: langsung ke main dengan feature flag.
Example:
Git Flow: buat branch feature/login dari develop, merge kembali ke develop.
Trunk-Based: commit langsung ke main di balik feature flag.
Output: Strategi branching sesuai skala tim dan frekuensi rilis.
Pull Request Kecil & Sering
Description: Setiap PR sebaiknya hanya berisi 1 perubahan logis (fitur, perbaikan) agar mudah direview.
Example:
PR #1: Tambah model User. PR #2: Tambah endpoint register.
Output: Proses review cepat, risiko konflik rendah.
Periksa Sebelum Push (Pre-commit Hooks)
Description: Gunakan Husky atau pre-commit untuk menjalankan linter dan formatter sebelum commit.
Example:
npx husky add .husky/pre-commit "npm run lint && npm run format"
Output: Kode selalu rapi dan sesuai standar sebelum dikirim.
Commit yang Atomik
Description: Satu commit hanya mengerjakan satu hal. Jangan campur aduk perbaikan bug dan penambahan fitur.
Example:
Commit 1: perbaiki bug validasi
Commit 2: tambahkan field baru pada form
Output: Memudahkan revert, review, dan pemahaman riwayat.
README dan Dokumentasi
Description: Setiap repositori sebaiknya memiliki README.md yang menjelaskan cara setup, penggunaan, dan kontribusi.
Example:
README berisi judul proyek, badge CI, instruksi instalasi, contoh penggunaan, lisensi.
Output: Orang baru langsung bisa menjalankan proyek.