kodingup.camp

Beranda/Bekal Wajib: Cara Kerja Web, Tools, Git & Cara Belajar

Branch & Merge

Modul 6 dari 95 menit bacaBranching and Merging

Isi modul

    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

    1. Fast-forward: kalau main tidak berubah sejak branch dibuat, Git cukup menggeser penanda main maju ke ujung branch. Tidak ada commit tambahan.
    2. Merge commit (three-way merge): kalau main dan 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
    

    Langkah menyelesaikan:

    1. Jangan panik. Jalankan git status untuk melihat file mana yang konflik (ditandai UU atau "both modified").
    2. Buka file itu, putuskan isi akhirnya: pakai salah satu versi, atau gabungkan keduanya.
    3. Hapus semua penanda <<<<<<<, =======, >>>>>>>.
    4. git add file lalu git commit untuk menyelesaikan merge.
    5. 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

    Latihan

    1. Mudah, Di repo latihanmu, buat branch fitur-about, tambahkan file about.html, commit, lalu merge ke main dan hapus branch-nya.
    2. 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.
    3. Menantang, Buat branch eksperimen, buat dua commit di sana, lalu buat satu commit baru di main. Jalankan git rebase main dari branch eksperimen, dan buktikan dengan git log --oneline --graph --all bahwa riwayatnya lurus. Jelaskan kenapa ini aman karena branch belum di-push.
    Lihat solusi
    1. 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
    
    1. 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
    
    1. 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

    Video pendamping

    Kalau penjelasan di atas belum masuk, tonton ini. Video dari kanal YouTube pihak lain.

    #6 GIT BRANCH & MERGEWPU · Bahasa IndonesiaBuka di YouTube

    Kuis pemahaman

    Pilih satu jawaban per soal. Penjelasan muncul setelah kamu menjawab.