Branch di Git: git branch, membuat, berpindah, dan menghapus
Branch di Git adalah penunjuk ringan ke sebuah commit, dan HEAD menunjukkan branch mana yang sedang aktif. git branch menampilkan, membuat, mengganti nama, dan menghapus branch, sedangkan git switch berpindah di antara branch; git switch -c nama membuat branch sekaligus langsung berpindah ke sana.
Apa itu branch di Git
Branch di Git bukan salinan proyek, melainkan berkas kecil berisi hash satu commit. Membuat branch hanya butuh sepersekian detik dan hampir tidak memakan ruang, karena Git tidak menggandakan apa pun: semua branch merujuk ke objek yang sama di dalam basis data repositori. Saat Anda membuat commit, penunjuk branch aktif cukup dipindahkan ke commit baru.
Hal ini mengubah cara pandang terhadap branch. Tidak perlu takut atau berhemat dalam membuatnya: satu branch untuk setiap tugas, perbaikan, atau eksperimen adalah praktik yang wajar. Jika eksperimen gagal, branch-nya dihapus dan riwayat utama tetap bersih.
Anda bisa melihat sendiri bahwa branch adalah sebuah berkas:
$ cat .git/refs/heads/main
8b7d4e2a9f1c0d3e5b6a7c8d9e0f1a2b3c4d5e6f
(Di repositori besar sebagian referensi dikemas ke dalam .git/packed-refs, sehingga berkasnya mungkin tidak ada. Intinya tetap sama.)
HEAD di Git: Anda sedang berada di mana
HEAD adalah penunjuk ke apa yang sedang «di-checkout» di direktori kerja. Biasanya HEAD tidak menunjuk langsung ke commit, melainkan ke branch:
$ cat .git/HEAD
ref: refs/heads/main
Rantainya: HEAD → main → commit. Commit baru akan memiliki commit yang ditunjuk HEAD sebagai induknya, lalu Git menggeser branch yang ditunjuk HEAD. Itulah sebabnya commit «masuk» ke branch aktif.
Jika Anda berpindah langsung ke sebuah commit atau tag (git switch --detach v1.0 atau git checkout 3f2a1c9), HEAD akan menunjuk langsung ke commit itu. Keadaan ini disebut detached HEAD. Melihat kode di dalamnya aman, tetapi commit baru tidak terikat ke branch mana pun, sehingga mudah hilang setelah Anda berpindah. Jika Anda sudah mulai mengubah sesuatu, buat branch di tempat itu juga: git switch -c fix-from-old-version.
Dalam ekspresi, HEAD berguna sebagai titik acuan: HEAD~1 adalah commit sebelumnya, HEAD~3 adalah tiga commit ke belakang, dan HEAD^2 adalah induk kedua dari commit merge.
Melihat branch: git branch
git branch # branch lokal, branch aktif diberi tanda *
git branch -v # ditambah commit terakhir di tiap branch
git branch -vv # ditambah upstream dan selisih ketertinggalan/kemajuan
git branch -r # branch remote (origin/...)
git branch -a # semua branch
git branch --show-current # hanya nama branch aktif
Contoh keluaran git branch -vv:
feature/login 4c1e2d7 [origin/feature/login: ahead 2] Form login
* main 8b7d4e2 [origin/main] Perbarui README
old-spike 1a9b3c0 Eksperimen dengan cache
Dari keluaran ini terlihat bahwa feature/login memiliki dua commit yang belum dikirim, main sama dengan server, dan old-spike sama sekali tidak punya pasangan di server.
Untuk menyaring branch, gunakan git branch --merged (sudah digabung ke branch aktif, kandidat untuk dihapus), git branch --no-merged (belum digabung), dan git branch --list 'feature/*' (berdasarkan pola).
Cara membuat branch
Ada dua cara. git branch membuat branch tetapi Anda tetap berada di branch yang sekarang:
git branch feature/login # dari commit saat ini
git branch hotfix v1.2.0 # dari tag
git branch review 3f2a1c9 # dari commit tertentu
Lebih sering Anda ingin membuat branch dan langsung berpindah ke sana. Untuk itu ada git switch -c (tersedia sejak Git 2.23) atau padanan lamanya git checkout -b:
git switch -c feature/login
git switch -c hotfix origin/main # branch baru dari kondisi terbaru di server
Kebiasaan yang baik: sebelum membuat branch untuk tugas baru, perbarui dasarnya lebih dulu dengan git fetch, lalu jalankan git switch -c feature/x origin/main. Dengan begitu branch dimulai dari kode yang paling baru, bukan dari main lokal yang sudah lama tidak diperbarui.
Cara memberi nama branch
Dalam tim, konvensi yang umum adalah awalan sesuai jenis pekerjaan dan deskripsi singkat dengan tanda hubung: feature/user-avatar, fix/login-timeout, chore/update-deps, kadang dengan nomor tugas: feature/SHOP-142-cart. Nama branch tidak boleh berisi spasi, karakter ~ ^ : ? * [, dua titik berurutan, atau berakhiran .lock.
Berpindah ke branch: git switch
git switch main # pindah ke branch yang sudah ada
git switch - # kembali ke branch sebelumnya
git switch feature/login # jika branch lokal belum ada tetapi origin/feature/login ada,
# Git akan membuat branch lokal dan menghubungkannya dengan remote
Saat berpindah, Git mengganti berkas di direktori kerja dengan versi dari branch tujuan. Perubahan yang belum di-commit ikut terbawa selama tidak bertabrakan dengan branch tujuan. Jika bertabrakan, Git akan menolak:
error: Your local changes to the following files would be overwritten by checkout:
app.js
Please commit your changes or stash them before you switch branches.
Solusinya: commit perubahan, simpan sementara dengan git stash (dikembalikan nanti dengan git stash pop), atau bawa perubahan itu dengan sadar sambil mencoba menggabungkannya: git switch -m main. Opsi --discard-changes membuang perubahan; gunakan hanya jika Anda yakin perubahan itu tidak diperlukan.
Mengapa git switch dan bukan checkout? Checkout bisa berpindah branch, menimpa berkas, dan karena itu mudah salah. Switch hanya melakukan satu hal, yaitu bekerja dengan branch, sehingga lebih aman. Perbandingan lengkap antara checkout, switch, dan restore ada di artikel terpisah.
Mengganti nama branch
git branch -m new-name # ganti nama branch aktif
git branch -m old-name new-name # ganti nama branch mana pun
git branch -M main # sama, tetapi menimpa branch yang sudah ada
Jika branch sudah ada di server, penggantian nama hanya berlaku secara lokal. Kirim branch baru dan hapus yang lama:
git push -u origin new-name
git push origin --delete old-name
Menghapus branch
git branch -d feature/login # hanya berhasil jika branch sudah digabung
git branch -D old-spike # dipaksa hapus
git push origin --delete feature/login # hapus di server
-d melindungi Anda dari kehilangan pekerjaan: jika branch memiliki commit yang tidak ada di branch aktif (atau di upstream-nya), Git menolak dengan pesan «The branch 'x' is not fully merged». -D menghapus tanpa bertanya. Branch yang sedang aktif tidak bisa dihapus, jadi berpindahlah ke branch lain dulu.
Terlanjur menghapus branch yang masih dibutuhkan? Commit-nya tidak langsung hilang. Cari hash commit terakhir branch itu di git reflog, lalu buat ulang branch-nya: git branch old-spike 1a9b3c0.
Penanda branch remote yang sudah tidak ada di server dibersihkan dengan git fetch --prune.
Menghubungkan branch lokal dengan remote
Branch lokal bisa memiliki upstream, yaitu branch remote yang dijadikan pembanding dan tempat sinkronisasi. Dengan upstream, git push dan git pull bisa dijalankan tanpa argumen, dan git status menampilkan keterangan «ahead/behind».
git push -u origin feature/login # saat pertama kali dikirim
git branch --set-upstream-to=origin/main main # untuk branch yang sudah ada
git branch --unset-upstream # hapus hubungan
Menggabungkan branch: sekilas
Branch dibuat untuk kemudian digabungkan. Setelah pekerjaan selesai, pindah ke branch tujuan lalu gabungkan branch Anda ke sana:
git switch main
git merge feature/login
Jika main tidak bergerak maju sejak branch dibuat, Git melakukan fast-forward: penunjuk main cukup dipindahkan ke commit terakhir branch tersebut, tanpa commit merge. Jika kedua branch sama-sama mendapat commit baru, terjadi three-way merge: Git mencari leluhur bersama, membandingkan kedua sisi, dan membuat commit merge dengan dua induk. Dalam tim, penggabungan biasanya dilakukan lewat pull request di server, sedangkan secara lokal Anda hanya menarik main yang terbaru.
Contekan branch
| Tugas | Perintah |
|---|---|
| Daftar branch | git branch -vv |
| Membuat branch | git branch nama |
| Membuat dan langsung pindah | git switch -c nama |
| Berpindah | git switch nama |
| Kembali ke sebelumnya | git switch - |
| Mengganti nama | git branch -m lama baru |
| Menghapus branch yang sudah digabung | git branch -d nama |
| Menghapus paksa | git branch -D nama |
| Menghapus di server | git push origin --delete nama |
| Branch yang bisa dihapus | git branch --merged |
| Memulihkan branch yang terhapus | git reflog, lalu git branch nama hash |
Kesalahan yang sering dilakukan pemula
- Bekerja langsung di main. Jika commit sudah terlanjur dibuat tetapi belum dikirim, buat branch dari posisi saat ini (
git branch feature/x), lalu kembalikanmainke server dengangit reset --hard origin/main(pastikan semuanya sudah di-commit terlebih dahulu). - Branch dari main yang sudah usang. Jalankan
git fetchdulu, lalu buat branch dariorigin/main. - Commit di detached HEAD. Sebelum berpindah, buat branch; jika sudah terlanjur berpindah, cari commit-nya di
git reflog. - Branch yang hidup terlalu lama. Semakin lama branch berjalan sendiri, semakin sulit penggabungannya. Rutin tarik
maindan gabungkan pekerjaan dalam porsi kecil.
Branch dalam kerja tim
Proses di setiap tim berbeda-beda, tetapi hampir selalu ada salah satu dari dua pola. Dalam GitHub Flow ada satu branch main yang selalu siap dirilis, dan branch fitur pendek yang digabung lewat pull request setelah review dan pemeriksaan CI. Dalam Git Flow ditambahkan develop, branch rilis, dan branch hotfix; pola ini lebih berat dan cocok untuk produk dengan rilis berversi yang jarang.
Apa pun polanya, aturan dasarnya sama: satu branch untuk satu tugas, branch hidup dalam hitungan hari, bukan bulan, sebelum pull request branch sudah diperbarui dengan main terbaru, dan setelah digabung, branch dihapus baik secara lokal maupun di server. Branch utama dilindungi lewat pengaturan repositori: push langsung dan force push tidak diizinkan, penggabungan hanya lewat review.
Melihat riwayat branch
Cara termudah memahami hubungan antar-branch adalah dari grafnya: git log --oneline --graph --all menggambar semua branch beserta titik percabangannya langsung di terminal. Untuk melihat commit yang ada di branch tetapi belum masuk ke main, gunakan git log main..feature/login, dan untuk perbedaan isi berkas gunakan git diff main...feature/login (tiga titik membandingkan dengan leluhur bersama, sehingga hanya menampilkan perubahan milik branch itu sendiri).
Ringkasan
Branch di Git adalah penunjuk commit yang murah, dan HEAD adalah penunjuk ke branch aktif. git branch mengelola branch (daftar, membuat, mengganti nama, menghapus), git switch berpindah di antara branch, dan git switch -c melakukan keduanya sekaligus. Branch, HEAD, fast-forward, dan three-way merge dibahas dengan contoh nyata dalam kursus Git.
Pertanyaan umum
Berapa banyak branch yang boleh dibuat di Git?
Hampir tanpa batas. Setiap branch hanya berupa referensi berukuran beberapa puluh byte, jadi tidak ada batasan ukuran yang berarti.
Apakah commit ikut terhapus saat branch dihapus?
Tidak langsung. Commit yang tidak lagi dirujuk tetap tersimpan untuk sementara dan bisa diakses lewat git reflog, sampai dibersihkan oleh garbage collector (secara default tidak lebih cepat dari 30 hari untuk entri reflog yang tidak terjangkau).
Bagaimana cara mengetahui branch mana yang menjadi asal branch aktif?
Git tidak menyimpan informasi itu: branch hanya mengingat commit-nya sendiri. Leluhur bersama dengan main bisa dicari dengan git merge-base HEAD main.
Apa bedanya branch dengan tag?
Branch bergerak maju setiap ada commit baru, sedangkan tag terpaku permanen pada satu commit dan biasanya dipakai untuk menandai rilis.
Mengapa main, bukan master?
Itu hanya nama branch default. Banyak layanan sudah beralih ke main; nama default untuk repositori baru bisa diatur dengan git config --global init.defaultBranch main.
Topik ini dibahas mendalam dengan praktik di kursus “Git dari Nol hingga Pengembang Percaya Diri”.
Ke kursus