Di project beneran, kamu jarang cuma punya satu branch. Fitur login dikerjakan di satu branch, fitur pencarian di branch lain, dan semuanya mulai dari main. Bayangin satu meja kerja dan beberapa map. Meja itu folder project-mu, tiap map satu branch, dan dalam satu waktu cuma satu map yang terbuka di meja (itu yang ditunjuk HEAD). Pindah branch artinya menutup satu map dan membuka map lain, jadi kertas di meja diganti isi map itu. Kertas lepas yang belum dimasukkan ke map (perubahan yang belum di-commit) ikut terbawa, kecuali map tujuan punya versi lain dari kertas yang sama. Kalau begitu, Git berhenti supaya kertasmu gak tertimpa.
🧪 Tebakan cepat: kamu di
feature-bdan sudah mengubahapp.js, tapi belum di-commit. Difeature-a, isiapp.jsbeda. Kamu menjalankangit switch feature-a. Yang terjadi: perubahanmu hilang, ikut pindah, atau Git menolak? Tebak dulu, jawabannya ada di bagian "Pindah branch saat ada perubahan yang belum di-commit".
Satu branch per pekerjaan
Mulai dari repo dengan satu file, app.js, lalu buat tiga branch dari main:
$ git init
$ git add .
$ git commit -m "initial"
$ git branch feature-a
$ git branch feature-b
$ git branch feature-c
$ git branch
feature-a
feature-b
feature-c
* main
git branch namamembuat branch baru di commit tempat HEAD berada, tapi kamu gak ikut pindah. Makanya tanda*masih dimain.- Keempat branch menunjuk ke commit yang sama, "initial". Branch baru cuma label baru, gak ada file yang disalin.
git branchmengurutkan nama berdasarkan abjad, jadimainmuncul paling bawah.
Pindah branch: git switch dan git checkout
$ git switch feature-a # pindah ke branch yang sudah ada
Switched to branch 'feature-a'
$ git switch -c fix-navbar # buat branch baru, lalu langsung pindah ke sana
Switched to a new branch 'fix-navbar'
git switch namapindah ke branch yang sudah ada.git switch -c nama(c dari create, bentuk panjangnya--create) membuat branch sekaligus pindah.- Perintah lamanya
git checkout namadangit checkout -b nama, hasilnya sama.switchada sejak Git 2.23 dan khusus untuk pindah branch.checkoutjuga dipakai untuk hal lain, misalnya mengembalikan isi file, jadi lebih gampang salah pakai. Dua-duanya masih jalan. - Pindah branch mengganti isi folder project dengan isi commit di ujung branch tujuan.
Bergantian kerja di beberapa branch
$ git switch feature-a
$ echo "login()" >> app.js
$ git add .
$ git commit -m "add login"
$ git switch feature-b
$ echo "search()" >> app.js
$ git add .
$ git commit -m "add search"
$ git switch main
| Sesudah | main |
feature-a |
feature-b |
HEAD |
|---|---|---|---|---|
tiga kali git branch |
initial | initial | initial | main |
| commit "add login" | initial | add login | initial | feature-a |
| commit "add search" | initial | add login | add search | feature-b |
git switch main |
initial | add login | add search | main |
o add login <- feature-a
/
o initial <- main, feature-c
\
o add search <- feature-b
- Commit cuma menggeser branch tempat kamu berada.
maintetap di "initial", jadi tiap fitur bisa diuji dan di-merge sendiri-sendiri. - Waktu pindah ke
feature-b, barislogin()hilang dariapp.js. Gak hilang beneran: dia aman di commit "add login", dan muncul lagi kalau kamu pindah kefeature-a.
Pindah branch saat ada perubahan yang belum di-commit
Git gak pernah membuang perubahan yang belum di-commit diam-diam. Ada dua kemungkinan:
- Ikut pindah. Kalau file yang kamu ubah isinya sama di kedua branch, perubahannya dibawa ke branch tujuan, tetap belum di-commit.
- Ditolak. Kalau isi file itu beda di branch tujuan, pindah akan menimpa perubahanmu, jadi Git berhenti:
$ git switch feature-a
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.
Aborting
Itu jawaban tebakannya: perubahanmu gak hilang. Karena app.js beda di feature-a, Git menolak (kalau isinya sama, perubahannya ikut pindah). Pilihannya dua: commit dulu, atau simpan sementara dengan git stash.
$ git stash # simpan perubahan, folder kembali bersih
$ git switch feature-a
$ git switch feature-b
$ git stash pop # kembalikan perubahan yang tadi disimpan
git stash dibahas lengkap di materi Stash & .gitignore.
Nama branch yang rapi
feature/nama-fituruntuk fitur baru, misalnyafeature/login.fix/nama-buguntuk perbaikan bug, misalnyafix/tombol-login.hotfix/namauntuk perbaikan darurat di aplikasi yang sedang dipakai orang.- Pakai huruf kecil dan tanda hubung. Spasi gak boleh ada di nama branch.
- Mulai branch baru dari
mainyang terbaru, dan merge sesering mungkin supaya conflict-nya kecil.
⚠️ Jebakan yang sering ketemu
- Lupa kembali ke
main.git branch namamembuat branch dari tempat HEAD berada. Kalau kamu sedang difeature-ayang sudah punya commit, branch barunya ikut membawa commit itu. Latihannya juga mengecek posisi akhirmu dimain. - Salah ketik nama.
feature_aataufeatur-aitu branch lain, dan pengecekannya mencari nama yang persis. - Commit di branch yang salah. Sebelum commit, cek baris pertama
git status("On branch ...") atau tanda*digit branch. - Panik waktu pindah branch ditolak. Pesan "would be overwritten" justru melindungi perubahanmu. Commit atau
git stashdulu, lalu pindah lagi.
TL;DR: Tiap pekerjaan dapat branch sendiri yang mulai dari main. git branch nama membuat branch tanpa pindah, git switch nama pindah, git switch -c nama membuat sekaligus pindah (versi lamanya git checkout nama dan git checkout -b nama). Commit cuma menggeser branch tempat kamu berada. Perubahan yang belum di-commit ikut pindah kalau file-nya sama di kedua branch, dan ditolak kalau beda: commit dulu atau git stash, lalu git stash pop buat mengembalikannya. Kasih nama yang jelas, misalnya feature/login atau fix/tombol-login.