Multiple Branches — Git

Dalam project nyata, kamu sering bekerja dengan beberapa branch sekaligus. Contoh workflow tim: main ──────●──────────────●──M──M \ / / feature-a…

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-b dan sudah mengubah app.js, tapi belum di-commit. Di feature-a, isi app.js beda. Kamu menjalankan git 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

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'

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

Pindah branch saat ada perubahan yang belum di-commit

Git gak pernah membuang perubahan yang belum di-commit diam-diam. Ada dua kemungkinan:

$ 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

⚠️ Jebakan yang sering ketemu

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.

Yang akan kamu pelajari