Git

Belum masuk. Progresmu tidak tersimpan.

Masuk
  • Bab 6 dari 8
  • 35 menit
  • 4 soal kuis

Branch, Merge, Rebase, dan Merge Conflict

Di bab ini (10 bagian)
  1. Tujuan
  2. Branch itu cuma penunjuk
  3. Membuat dan berpindah branch
  4. Merge: fast-forward vs merge commit
  5. Rebase: riwayat yang lurus
  6. Kapan merge, kapan rebase?
  7. Merge conflict
  8. Kesalahan umum
  9. Coba sendiri
  10. Rangkuman

Tujuan bab ini

  • Menjelaskan branch sebagai penunjuk ringan dan HEAD sebagai penanda posisi kamu sekarang.
  • Membuat dan berpindah branch dengan git branch dan git switch -c.
  • Membedakan fast-forward merge, merge commit, dan rebase, serta tahu kapan memakai masing-masing.
  • Menyelesaikan merge conflict, atau membatalkannya dengan git merge --abort.

Branch itu cuma penunjuk

Branch sering dibayangkan sebagai salinan seluruh proyek. Kenyataannya jauh lebih ringan: branch hanyalah penunjuk ke satu commit. Isinya cuma hash 40 karakter. Coba intip:

$ cat .git/HEAD
ref: refs/heads/main
$ cat .git/refs/heads/main
db292be8a86c29b4b6bc4205610e2a753ed14e5b

Setiap kali kamu commit, penunjuk branch yang aktif ikut maju ke commit baru. Karena itu membuat branch terasa instan, bahkan di proyek raksasa.

HEAD adalah penunjuk ke branch yang sedang aktif. Di git log kamu melihatnya sebagai (HEAD -> main), yang artinya "kamu sedang di branch main". Pindah branch berarti memindahkan HEAD, lalu Git menyesuaikan isi working directory dengan commit yang ditunjuk branch tersebut.

Beberapa istilah yang akan sering kamu dengar:

  • main (dulu sering bernama master): branch utama yang berisi kode stabil.
  • feature branch: branch untuk mengerjakan satu fitur, misalnya feature/login.
  • merge: menyatukan dua branch.

Pakai awalan yang konsisten seperti feature/, bugfix/, hotfix/, atau release/ supaya seluruh tim langsung paham isi setiap branch.

Membuat dan berpindah branch

git branch                    # daftar branch lokal, * = yang aktif
git branch feature/login      # buat branch (belum pindah)
git switch feature/login      # pindah ke branch itu
git switch -c feature/daftar  # buat + pindah sekaligus
git branch -d feature/login   # hapus branch yang sudah di-merge
$ git branch
  feature/login
* main

git switch hadir sejak Git 2.23 untuk menggantikan peran git checkout yang terlalu banyak tugas. git checkout -b feature/login masih berfungsi dan hasilnya setara dengan git switch -c, jadi jangan kaget kalau menemukannya di tutorial lama.

Pastikan working directory bersih (sudah di-commit) sebelum pindah branch. Kalau perubahanmu bentrok dengan branch tujuan, Git akan menolak pindah demi melindungi editanmu.

Merge: fast-forward vs merge commit

Selesai mengerjakan fitur? Pindah ke branch tujuan, lalu merge:

git switch main
git merge feature/login

Ada dua kemungkinan hasil.

1. Fast-forward. Kalau main tidak bertambah commit sejak feature/login dibuat, Git cukup menggeser penunjuk main ke depan. Tidak ada commit baru yang dibuat:

Updating e67d43d..a89c589
Fast-forward
 login.html | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 login.html

2. Merge commit. Kalau kedua branch sama-sama punya commit baru, Git membuat satu merge commit dengan dua induk:

$ git merge feature/daftar
Merge made by the 'ort' strategy.
 daftar.html | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 daftar.html

$ git log --oneline --graph
*   db292be (HEAD -> main) Merge branch 'feature/daftar'
|\
| * 53911ae Form daftar
* | d24acff Tambah footer
|/
* a89c589 Form login

Grafiknya menunjukkan dua jalur yang bertemu kembali. Riwayat asli tetap utuh dan jujur: kamu bisa melihat kapan fitur dikerjakan terpisah.

Rebase: riwayat yang lurus

git rebase memindahkan commit branch-mu supaya seolah dibuat di atas commit terbaru branch lain:

git switch feature/profil
git rebase main

Sebelum rebase, feature/profil bercabang dari commit lama. Sesudahnya:

* 24dbcc8 (HEAD -> feature/profil) Halaman profil
* 4191493 (main) Tambah gaya.css

Commit "Halaman profil" sekarang duduk tepat di atas main, dan hash-nya berubah (sebelumnya 92ab476). Merge ke main setelah itu menjadi fast-forward, sehingga riwayatnya lurus tanpa merge commit.

Hash yang berubah itulah sumber bahayanya. Rebase menulis ulang commit. Kalau commit tersebut sudah di-push dan dipakai orang lain, riwayat mereka dan riwayatmu jadi tidak cocok.

Kapan merge, kapan rebase?

mergerebase
Riwayatasli, bercabanglurus, ditulis ulang
Commit tambahanmerge committidak ada
Aman untuk branch bersamayatidak

Aturan praktis yang dipegang banyak tim:

  • Pakai rebase untuk merapikan branch lokal milikmu sendiri sebelum dibagikan, misalnya untuk mengejar main terbaru.
  • Pakai merge untuk menyatukan branch ke main atau branch yang dipakai bersama.
  • Jangan pernah rebase branch publik yang sudah di-push dan dipakai orang lain.

Merge conflict

Conflict terjadi kalau dua branch mengubah baris yang sama di berkas yang sama. Git tidak bisa menebak versi mana yang benar, jadi keputusannya diserahkan ke kamu. Ini normal dan bukan tanda kamu berbuat salah.

$ git merge feature/judul
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

Buka berkasnya dan kamu akan menemukan penanda konflik:

<<<<<<< HEAD
<h1>Selamat Datang di Ruang Materi</h1>
=======
<h1>Halo Dunia</h1>
>>>>>>> feature/judul
  • Di antara <<<<<<< HEAD dan ======= ada versi branch aktif (yang sedang menerima merge).
  • Di antara ======= dan >>>>>>> feature/judul ada versi dari branch yang digabung.

Empat langkah menyelesaikannya:

  1. Identifikasi: git status menampilkan both modified: index.html (atau UU di git status -s).
  2. Perbaiki: edit berkas, pilih salah satu versi atau gabungkan keduanya, lalu hapus semua penanda <<<<<<<, =======, dan >>>>>>>.
  3. Tandai selesai: git add index.html.
  4. Tutup merge: git commit (atau git rebase --continue kalau konflik muncul saat rebase).

Belum siap memutuskan? git merge --abort membatalkan merge dan mengembalikan semuanya ke kondisi sebelum merge. Ada juga git mergetool yang membuka alat bantu visual, dan editor seperti VS Code menyediakan tombol "Accept Current / Incoming / Both" untuk hal yang sama.

Kesalahan umum

  • Commit di branch yang salah. Selalu cek git status atau git branch sebelum mulai bekerja.
  • Merge dari arah terbalik. git merge X menarik X ke branch aktif. Pindah dulu ke branch tujuan.
  • Penanda konflik ikut ter-commit. Cari <<<<<<< di berkas sebelum git add.
  • Rebase branch yang sudah di-push bersama, lalu force push. Rekan setim akan menemukan commit ganda dan konflik aneh.
  • Menimbun branch selama berminggu-minggu. Makin lama terpisah, makin besar konfliknya. Merge atau rebase dari main secara rutin.

Coba sendiri

Buat konflik dengan sengaja, lalu selesaikan:

mkdir latihan-branch && cd latihan-branch && git init
echo "<h1>Selamat Datang</h1>" > index.html
git add . && git commit -m "Halaman awal"
git switch -c feature/judul
echo "<h1>Halo Dunia</h1>" > index.html
git commit -am "Ganti judul"
git switch main
echo "<h1>Selamat Datang di Ruang Materi</h1>" > index.html
git commit -am "Perjelas judul"
git log --oneline --graph --all
* c259e2b (feature/judul) Ganti judul
| * df3688f (HEAD -> main) Perjelas judul
|/
* 4152a15 Halaman awal
git merge feature/judul
git status -s
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
UU index.html

Coba git merge --abort dulu, lalu cek bahwa git status -s bersih. Jalankan merge lagi, kemudian selesaikan konfliknya:

echo "<h1>Halo, Selamat Datang di Ruang Materi</h1>" > index.html
git add index.html
git commit --no-edit
git log --oneline --graph
*   121921b (HEAD -> main) Merge branch 'feature/judul'
|\
| * c259e2b (feature/judul) Ganti judul
* | df3688f Perjelas judul
|/
* 4152a15 Halaman awal

Rangkuman

  • Branch adalah penunjuk ringan ke sebuah commit, dan HEAD menunjuk ke branch yang aktif.
  • git switch -c membuat sekaligus pindah branch, dan git merge menyatukan branch lain ke branch aktif, lewat fast-forward atau merge commit.
  • Rebase membuat riwayat lurus dengan menulis ulang commit, jadi pakai hanya di branch lokal, jangan di branch publik.
  • Conflict diselesaikan dengan mengedit berkas, menghapus penanda, git add, lalu git commit, atau dibatalkan dengan git merge --abort.

Selesaikan bab ini

  1. 1. Baca materi
  2. 2. Kuis (4 soal)

Cek pemahaman

  1. 1Secara teknis, branch di Git adalah...

  2. 2Setelah perintah berikut, branch mana yang aktif?

    git switch -c fitur/a
    git switch -c fitur/b
    git branch
  3. 3Rebase aman dipakai pada branch publik yang sudah di-push dan dipakai banyak orang.

  4. 4main tidak bertambah commit sejak branch fitur dibuat. Apa yang dilakukan git merge?

    git switch -c fitur
    echo b >> a.txt
    git commit -am "Ubah a"
    git switch main
    git merge fitur