Kenapa ini penting
Bayangkan kamu sedang mengerjakan fitur besar, misalnya halaman galeri, dan baru setengah jadi. Tiba-tiba ada laporan: nomor WhatsApp di halaman kontak salah. Kalau semua pekerjaan ada di satu jalur, kamu harus memperbaiki nomor itu di tengah kode galeri yang masih rusak. Branch menyelesaikan masalah ini. Branch adalah jalur kerja paralel: kamu bisa membuat cabang untuk eksperimen, lalu menggabungkannya kembali (merge) kalau sudah siap, atau membuangnya kalau gagal. Di tim, setiap orang mengerjakan fiturnya di branch sendiri. Inilah dasar dari pull request di GitHub (modul 7).
Konsep inti
Apa itu branch
Secara teknis, branch hanyalah penanda bernama yang menunjuk ke sebuah commit. Membuat branch sangat murah dan cepat. HEAD adalah penanda posisimu sekarang (branch mana yang sedang aktif). Branch utama biasanya bernama main, dan aturan yang umum: main harus selalu dalam keadaan jalan/stabil, kerja baru dilakukan di branch fitur.
Analogi: main adalah naskah final buku. Kalau mau mencoba bab baru, kamu memfotokopi naskah (membuat branch), menulis di fotokopian, dan kalau bagus, menyalin bab baru itu ke naskah final (merge).
Perintah branch
| Perintah | Fungsi |
|---|---|
git branch |
Daftar branch, tanda * untuk yang aktif |
git branch nama |
Membuat branch baru (tanpa pindah) |
git switch nama |
Pindah ke branch |
git switch -c nama |
Membuat branch baru sekaligus pindah ke sana |
git merge nama |
Menggabungkan branch nama ke branch yang sedang aktif |
git branch -d nama |
Menghapus branch yang sudah di-merge |
git log --oneline --graph --all |
Melihat riwayat semua branch sebagai diagram |
Kamu mungkin menemukan tutorial yang memakai git checkout untuk pindah branch. Perintah itu masih jalan, tetapi git switch (dan git restore) dibuat khusus supaya lebih jelas dan lebih aman untuk pemula. Penamaan branch yang umum: fitur-kontak, perbaikan-menu-hp, atau dengan awalan seperti feat/galeri, fix/link-footer.
Dua jenis merge
- Fast-forward: kalau
maintidak berubah sejak branch dibuat, Git cukup menggeser penandamainmaju ke ujung branch. Tidak ada commit tambahan. - Merge commit (three-way merge): kalau
maindan branch sama-sama punya commit baru, Git membuat commit gabungan yang punya dua "orang tua".
Konflik dan cara menyelesaikannya
Merge conflict terjadi kalau dua branch mengubah baris yang sama di file yang sama dengan cara berbeda. Git tidak bisa menebak mana yang benar, jadi ia berhenti dan menandai bagian itu:
<<<<<<< HEAD
<h1>Selamat Datang</h1>
=======
<h1>Halo, Dunia!</h1>
>>>>>>> judul-biru
- Antara
<<<<<<< HEADdan=======adalah versi di branch aktif (di sinimain). - Antara
=======dan>>>>>>> judul-biruadalah versi dari branch yang di-merge.
Langkah menyelesaikan:
- Jangan panik. Jalankan
git statusuntuk melihat file mana yang konflik (ditandaiUUatau "both modified"). - Buka file itu, putuskan isi akhirnya: pakai salah satu versi, atau gabungkan keduanya.
- Hapus semua penanda
<<<<<<<,=======,>>>>>>>. git add filelalugit commituntuk menyelesaikan merge.- Kalau ingin membatalkan seluruh merge dan kembali seperti sebelum merge:
git merge --abort.
VS Code membantu dengan tombol "Accept Current Change", "Accept Incoming Change", dan "Accept Both Changes" di atas area konflik. Konflik itu normal dalam kerja tim, bukan tanda kamu melakukan kesalahan. Cara mengurangi konflik: commit dan merge sesering mungkin, ambil perubahan terbaru dari main sebelum mulai kerja, dan bagi tugas supaya tidak mengedit bagian yang sama bersamaan.
Rebase singkat
git rebase main (dijalankan dari branch fitur) memindahkan commit-commit di branch-mu supaya seolah-olah dimulai dari ujung main terbaru. Hasilnya riwayat lurus tanpa merge commit. Analogi: merge seperti menulis "catatan pertemuan dua jalur", rebase seperti menulis ulang sejarah supaya jalurmu tampak dimulai belakangan.
Aturan emas rebase: jangan me-rebase commit yang sudah dibagikan (di-push) dan dipakai orang lain, karena rebase membuat commit baru dengan hash berbeda dan riwayat rekanmu jadi tidak cocok. Untuk pemula, cukup pakai merge. Rebase boleh dipakai untuk merapikan branch lokalmu sendiri sebelum dibagikan.
Contoh kode
Seluruh sesi ini sudah dijalankan di repo uji, melanjutkan repo portofolio dari modul 5.
# --- A. Branch dan fast-forward merge ---
git switch -c fitur-kontak
# → Switched to a new branch 'fitur-kontak'
echo '<p>Email: halo@contoh.id</p>' >> index.html
git commit -qam "Tambah info kontak" # -q: tanpa output panjang
git switch main
git merge fitur-kontak
# → Updating 4504d1d..b00272c
# → Fast-forward
git branch -d fitur-kontak
# → Deleted branch fitur-kontak (was b00272c).
# --- B. Membuat konflik dengan sengaja ---
git switch -c judul-biru
# (edit baris <h1> menjadi: <h1>Halo, Dunia!</h1>)
git commit -qam "Ubah judul jadi Halo, Dunia"
git switch main
# (edit baris <h1> yang SAMA menjadi: <h1>Selamat Datang</h1>)
git commit -qam "Ubah judul jadi Selamat Datang"
git merge judul-biru
# → Auto-merging index.html
# → CONFLICT (content): Merge conflict in index.html
# → Automatic merge failed; fix conflicts and then commit the result.
git status --short
# → UU index.html
# --- C. Menyelesaikan konflik ---
# Edit index.html: hapus penanda, tulis versi gabungan
printf '<h1>Selamat Datang, Dunia!</h1>\n<p>Email: halo@contoh.id</p>\n' > index.html
git add index.html
git commit -qm "Gabungkan dua versi judul"
git branch -d judul-biru
git log --oneline --graph --all
# → * bd84872 Gabungkan dua versi judul
# → |\
# → | * b9a4d88 Ubah judul jadi Halo, Dunia
# → * | 807c8ac Ubah judul jadi Selamat Datang
# → |/
# → * b00272c Tambah info kontak
# --- D. Rebase branch lokal ke ujung main ---
git switch -c fitur-footer
echo '<footer>2026</footer>' >> index.html
git commit -qam "Tambah footer"
git switch main
echo 'body{}' > style.css && git add style.css && git commit -qm "Tambah style.css"
git switch fitur-footer
git rebase main
# → Successfully rebased and updated refs/heads/fitur-footer.
git log --oneline --graph --all
# → * 8047797 Tambah footer (sekarang di atas style.css, riwayat lurus)
# → * c613a9a Tambah style.css
git switch main && git merge fitur-footer # → fast-forward
Kesalahan umum
- Mengerjakan fitur langsung di
main. Kalau fitur setengah jadi,mainikut rusak. Biasakangit switch -c nama-fitursebelum mulai. - Pindah branch dengan perubahan yang belum di-commit. Git bisa menolak atau membawa perubahan itu ke branch lain. Commit dulu (atau simpan sementara dengan
git stash). - Lupa menghapus penanda konflik. File HTML berisi
<<<<<<< HEADakan tampil aneh di browser, dan kode JavaScript jadi error. Cari tulisan<<<<<<<sebelum commit. - Me-rebase branch yang sudah dipakai orang lain. Riwayat tim jadi berantakan. Rebase hanya untuk branch lokal pribadi.
- Menumpuk branch lama. Hapus branch yang sudah di-merge dengan
git branch -dsupaya daftar branch tetap jelas.
Latihan
- Mudah, Di repo latihanmu, buat branch
fitur-about, tambahkan fileabout.html, commit, lalu merge kemaindan hapus branch-nya. - Sedang, Buat konflik dengan sengaja: ubah baris
<title>yang sama di dua branch dengan isi berbeda, merge, lalu selesaikan konfliknya dengan memilih salah satu versi. - Menantang, Buat branch
eksperimen, buat dua commit di sana, lalu buat satu commit baru dimain. Jalankangit rebase maindari brancheksperimen, dan buktikan dengangit log --oneline --graph --allbahwa riwayatnya lurus. Jelaskan kenapa ini aman karena branch belum di-push.
Lihat solusi
- Solusi:
git switch -c fitur-about
echo '<h1>Tentang saya</h1>' > about.html
git add about.html && git commit -m "Tambah halaman about"
git switch main
git merge fitur-about # → Fast-forward
git branch -d fitur-about
- Solusi:
git switch -c judul-a
# edit <title> menjadi <title>Portofolio A</title>
git commit -am "Ubah title jadi Portofolio A"
git switch main
# edit <title> yang sama menjadi <title>Portofolio B</title>
git commit -am "Ubah title jadi Portofolio B"
git merge judul-a
# → CONFLICT (content): Merge conflict in index.html
# buka index.html, sisakan satu baris: <title>Portofolio A</title>
# hapus <<<<<<<, =======, >>>>>>>
git add index.html
git commit -m "Selesaikan konflik title, pakai versi A"
git branch -d judul-a
- Solusi:
git switch -c eksperimen
echo '/* tema gelap */' > tema.css && git add tema.css && git commit -m "Tambah tema.css"
echo 'body{background:#111}' >> tema.css && git commit -am "Isi warna latar gelap"
git switch main
echo '# Portofolio' > README.md && git add README.md && git commit -m "Tambah README"
git switch eksperimen
git rebase main
git log --oneline --graph --all
# → dua commit eksperimen sekarang berada di atas "Tambah README", tanpa cabang
Aman karena branch eksperimen hanya ada di komputermu. Belum ada orang lain yang memakai commit lamanya, jadi mengganti hash commit tidak merugikan siapa pun.
Ringkasan
- Branch adalah jalur kerja paralel, secara teknis penanda bernama yang menunjuk ke commit.
git switch -cmembuat dan pindah branch;git mergemenggabungkan;git branch -dmenghapus.- Merge bisa fast-forward atau membuat merge commit.
- Konflik terjadi kalau baris yang sama diubah berbeda; selesaikan dengan edit, hapus penanda,
add,commit, atau batalkan dengangit merge --abort. - Rebase membuat riwayat lurus, tetapi jangan pernah rebase commit yang sudah dibagikan.