Kodeloka
  1. Kodeloka
  2. Kelas Git & CI/CD
  3. Materi

Git Fundamentals ยท Modul 2 dari 20

Branching & Merging - Fast-Forward vs Three-Way

Membuat dan memindahkan branch, memahami perbedaan fast-forward dan three-way merge, serta kapan memakai --no-ff.

1. Branch Itu Murah

# Membuat dan langsung berpindah
git switch -c fitur/keranjang-belanja

# Bentuk lama yang masih sangat umum
git checkout -b fitur/keranjang-belanja

# Berpindah antar branch
git switch main
git switch -                 # kembali ke branch sebelumnya

# Melihat daftar branch
git branch                   # lokal
git branch -a                # termasuk remote
git branch -v                # dengan commit terakhir tiap branch
git branch --merged main     # yang sudah tergabung ke main
git branch --no-merged main  # yang BELUM tergabung

# Menghapus branch
git branch -d fitur/lama     # aman: menolak bila belum di-merge
git branch -D fitur/lama     # paksa, meski belum di-merge
๐Ÿ’ก Konvensi penamaan branch
fitur/nama-fitur          atau  feature/โ€ฆ
perbaikan/nama-bug        atau  fix/โ€ฆ
hotfix/masalah-produksi
rilis/2.4.0
eksperimen/coba-grpc

Menyertakan nomor tiket sangat membantu penelusuran: fitur/PROJ-142-checkout-cepat.

2. Fast-Forward Merge

Terjadi bila branch tujuan tidak bergerak sama sekali sejak percabangan dibuat. Git tinggal memajukan penunjuk โ€” tidak ada commit baru yang dibuat.

Sebelum:
main     Aโ”€โ”€โ”€B
                \
fitur            Cโ”€โ”€โ”€D

Setelah git switch main && git merge fitur:
main     Aโ”€โ”€โ”€Bโ”€โ”€โ”€Cโ”€โ”€โ”€D
                     โ†‘
                   fitur juga di sini

3. Three-Way Merge

Terjadi bila kedua branch sama-sama bergerak. Git mencari commit leluhur bersama, lalu menggabungkan kedua sisi dengan leluhur itu sebagai titik acuan.

Sebelum:
main     Aโ”€โ”€โ”€Bโ”€โ”€โ”€Eโ”€โ”€โ”€F
                \
fitur            Cโ”€โ”€โ”€D

Setelah merge:
main     Aโ”€โ”€โ”€Bโ”€โ”€โ”€Eโ”€โ”€โ”€Fโ”€โ”€โ”€M      <-- M punya DUA induk: F dan D
                \           /
fitur            Cโ”€โ”€โ”€Dโ”€โ”€โ”€โ”€/
# Mencari leluhur bersama secara manual
git merge-base main fitur

# Melakukan merge
git switch main
git merge fitur

# Memaksa merge commit meski sebenarnya bisa fast-forward
git merge --no-ff fitur

# Menggabungkan seluruh fitur menjadi SATU commit tanpa merge commit
git merge --squash fitur
git commit -m "feat: tambahkan keranjang belanja"
๐Ÿ“Œ Kapan memakai --no-ff

Dengan fast-forward, commit-commit fitur bercampur ke main dan Anda kehilangan informasi "commit-commit ini datang dari satu fitur yang sama". Dengan --no-ff, selalu ada merge commit yang menandai batas fitur, sehingga membatalkan seluruh fitur cukup dengan git revert -m 1 <merge-commit>. Banyak tim menjadikan ini kebijakan wajib untuk main.

4. Tiga Cara Menggabungkan, Tiga Bentuk Riwayat

CaraBentuk riwayatCocok untuk
Merge commit (--no-ff)Bercabang, jejak fitur terlihat jelasTim besar, audit, fitur berumur panjang
SquashLurus, satu commit per pull requestRiwayat main yang sangat bersih; commit WIP dibuang
Rebase lalu fast-forwardLurus, semua commit asli terjagaTim yang disiplin menulis commit atomik

5. Melihat Bentuk Riwayat

git log --oneline --graph --decorate --all

# Commit yang ada di fitur tapi belum ada di main
git log main..fitur

# Perbedaan dua arah sekaligus
git log --left-right --oneline main...fitur

# Siapa yang mengubah baris tertentu
git blame -L 40,60 src/pembayaran.js

# Melacak sebuah fungsi lintas perubahan nama berkas
git log --follow -p -- src/pembayaran.js

6. Branch Lokal dan Remote

# Mendorong branch lokal sekaligus menyetel pelacakannya
git push -u origin fitur/keranjang-belanja

# Melihat hubungan lokal-remote
git branch -vv

# Mengambil perubahan remote TANPA menggabungkan
git fetch origin

# Membersihkan referensi remote yang sudah dihapus di server
git fetch --prune

# Menghapus branch di server
git push origin --delete fitur/lama
โš ๏ธ git pull itu dua perintah sekaligus

git pull setara dengan git fetch lalu git merge, dan sering menghasilkan merge commit "Merge branch main ofโ€ฆ" yang mengotori riwayat. Banyak tim menyetel git config --global pull.rebase true agar pull melakukan rebase. Kalau ragu, biasakan git fetch dulu, lihat apa yang datang, baru putuskan sendiri.