git worktree: cara bekerja di beberapa branch sekaligus
git worktree menghubungkan beberapa direktori kerja ke satu repositori, dan di tiap direktori dibuka branch yang berbeda. Perintah git worktree add ../hotfix main membuat folder dengan branch main di sebelah proyek; riwayat dan objeknya bersama, sehingga tidak perlu mengklon ulang.
Apa yang dilakukan git worktree
git worktree menghubungkan beberapa direktori kerja ke satu repositori. Di folder utama Anda membuka branch fitur, sementara di folder sebelahnya ada main untuk perbaikan darurat, dan keduanya ada bersamaan. Objek, commit, dan branch dipakai bersama: commit yang dibuat di satu folder langsung terlihat dari folder lain tanpa push dan fetch.
Tanpa worktree, berpindah konteks dilakukan seperti ini: git stash, git switch main, memperbaiki, git switch kembali, lalu git stash pop. Jika proyek memiliki build yang lama atau node_modules yang besar, setiap perpindahan branch juga membatalkan cache. Alternatifnya adalah mengklon ulang repositori, tetapi Anda kemudian memiliki dua salinan riwayat yang berdiri sendiri dan harus disinkronkan lewat server.
Worktree memberi yang terbaik dari kedua pendekatan: folder terpisah, tetapi satu basis .git. Ini mungkin karena branch di Git hanyalah penunjuk ke commit, bukan salinan berkas, sehingga tidak ada yang menghalangi beberapa folder kerja menunjuk ke penunjuk yang berbeda.
Cara membuat folder kerja tambahan
Bentuk dasar perintahnya: git worktree add <path> [<branch>]. Berikut varian utamanya.
Membuka branch yang sudah ada
cd ~/projects/shop
git worktree add ../shop-main main
Preparing worktree (checking out 'main')
HEAD is now at 3f2c1ab Perbarui README
Di sebelah proyek akan muncul folder shop-main dengan branch main. Masuk ke sana dengan cd dan bekerjalah seperti di repositori biasa.
Membuat branch baru sekaligus dengan folder kerjanya
git worktree add -b hotfix/payment-timeout ../shop-hotfix main
Flag -b membuat branch hotfix/payment-timeout dari main dan membukanya di folder baru. Flag -B melakukan hal yang sama, tetapi jika branch sudah ada, branch itu di-reset ke commit yang ditentukan; gunakan dengan hati-hati.
Bentuk singkat
git worktree add ../experiment
Jika branch tidak disebutkan, Git membuat branch baru dengan nama komponen terakhir dari path (di sini experiment) dari HEAD saat ini. Jika branch dengan nama itu sudah ada, branch tersebut yang dibuka.
Folder kerja tanpa branch
git worktree add --detach ../shop-v1.4 v1.4.0
Mode detached HEAD berguna untuk membangun atau memeriksa rilis lama berdasarkan tag, tanpa membuat branch tambahan.
Branch dari server
git fetch origin
git worktree add ../review-auth feature/auth
Jika branch lokal feature/auth belum ada, tetapi ada tepat satu branch remote origin/feature/auth, Git akan membuat branch lokal yang terhubung dengannya, seperti pada git switch feature/auth. Cara ini nyaman untuk meninjau pull request orang lain tanpa mengganggu pekerjaan Anda sendiri.
Cara melihat dan menghapus folder kerja
git worktree list
/home/anna/projects/shop a1b2c3d [feature/cart]
/home/anna/projects/shop-hotfix 7e8f9a0 [hotfix/payment-timeout]
/home/anna/projects/shop-v1.4 5d6e7f8 (detached HEAD)
Baris pertama adalah folder kerja utama (main worktree), sisanya adalah folder tertaut (linked). Untuk skrip tersedia keluaran yang mudah diproses mesin: git worktree list --porcelain.
Setelah perbaikan darurat digabung, hapus folder kerjanya:
git worktree remove ../shop-hotfix
git branch -d hotfix/payment-timeout
git worktree remove menghapus folder beserta catatan layanannya. Jika di folder itu ada perubahan yang belum di-commit atau berkas yang tidak dilacak, perintah akan menolak; tambahkan --force hanya jika Anda yakin isinya tidak diperlukan. Perlu diingat, branch-nya tidak ikut terhapus; itu dilakukan secara terpisah.
Jika folder dihapus secara manual
Menghapus folder lewat file manager atau rm -rf meninggalkan catatan yatim di .git/worktrees, dan branch tersebut tetap dianggap terpakai. Bersihkan catatan semacam itu dengan:
git worktree prune --verbose
Git juga melakukannya sendiri secara berkala saat garbage collection, tetapi Anda tidak harus menunggu.
Cara kerjanya di dalam
Di folder kerja tertaut, alih-alih folder .git terdapat berkas .git dengan satu baris:
gitdir: /home/anna/projects/shop/.git/worktrees/shop-hotfix
Di folder layanan itu disimpan data yang unik bagi setiap folder kerja: HEAD-nya sendiri, index (staging area) sendiri, dan keadaan merge atau rebase yang sedang berjalan. Selebihnya dipakai bersama: objek, branch, tag, remote, konfigurasi, dan hook.
| Milik setiap folder kerja | Dipakai bersama |
|---|---|
| HEAD (branch atau commit aktif) | Objek dan seluruh riwayat |
Index (git add) | Branch lokal dan remote, tag |
| Merge, rebase, cherry-pick yang belum selesai | Stash (refs/stash bersama) |
| Berkas di direktori kerja | .git/config dan hook |
Dari tabel ini ada satu detail yang tidak langsung terlihat: git stash list di folder mana pun akan menampilkan entri yang sama. Ini malah berguna: Anda bisa menyimpan perubahan di satu folder dan mengambilnya di folder lain.
Batasan utama: satu branch, satu folder kerja
Satu branch tidak boleh dibuka di dua folder kerja. Jika dicoba, Git akan menampilkan error seperti ini:
git worktree add ../shop-copy feature/cart
fatal: 'feature/cart' is already used by worktree at '/home/anna/projects/shop'
(di versi Git lama, pesannya berbunyi «is already checked out at»). Batasan ini melindungi dari situasi ketika commit di satu folder diam-diam mengubah branch yang sedang dipakai folder lain. Solusinya: buat branch baru dari commit yang sama (-b), buka salinan dalam mode --detach, atau jika benar-benar perlu, gunakan --force dengan kesadaran akan akibatnya.
Atas alasan yang sama, Anda tidak bisa menjalankan git switch main di folder utama selama main sedang dibuka di folder tetangga.
Skenario praktis
Perbaikan darurat di tengah fitur
git worktree add -b hotfix/null-price ../shop-hotfix main
cd ../shop-hotfix
# perbaiki, uji
git commit -am "Perbaiki error saat harga kosong"
git push -u origin hotfix/null-price
cd ../shop
git worktree remove ../shop-hotfix
Fitur Anda yang belum selesai tetap seperti semula, tidak ada yang perlu disimpan di stash, dan IDE yang membuka proyek bahkan tidak menyadari adanya perpindahan.
Meninjau pull request sambil menjalankan kodenya
Folder kerja terpisah untuk peninjauan memungkinkan Anda membangun dan menjalankan branch orang lain, menjalankan tes, dan tetap melanjutkan pekerjaan sendiri di jendela editor lain.
Membandingkan perilaku dua versi
Dua salinan dengan tag berbeda bisa dijalankan bersamaan di port yang berbeda, lalu dibandingkan, misalnya kecepatan respons API sebelum dan sesudah optimasi.
Tes dan build yang lama
Jalankan seluruh rangkaian tes di satu folder, dan lanjutkan menulis kode di folder lain. Build tidak akan terganggu oleh perubahan berkas yang Anda lakukan.
Beberapa agen AI yang bekerja paralel
Jika beberapa agen atau proses mengerjakan tugas berbeda, setiap agen bisa diberi folder kerja dengan branch sendiri. Mereka tidak saling mengganggu, dan hasilnya langsung masuk ke repositori bersama.
Menata folder jika worktree dipakai setiap hari
Jika folder kerja tambahan dibutuhkan setiap hari, tentukan strukturnya sejak awal; kalau tidak, direktori di sebelah proyek akan cepat berantakan. Pola yang populer adalah satu folder induk proyek yang berisi repositori bare dan satu folder per branch:
git clone --bare git@example.com:team/shop.git ~/projects/shop/.bare
cd ~/projects/shop
echo "gitdir: ./.bare" > .git
git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
git fetch origin
git worktree add main
git worktree add -b feature/cart feature-cart main
Baris dengan remote.origin.fetch diperlukan karena klon bare secara default tidak mengatur pelacakan branch remote. Hasilnya, di ~/projects/shop ada folder main dan feature-cart, masing-masing dengan branch sendiri, dan tidak ada yang lebih utama dari yang lain.
Kebiasaan baik lainnya adalah menamai folder sama dengan branch (dengan mengganti garis miring menjadi tanda hubung). Dengan begitu, dari keluaran git worktree list maupun path di terminal, selalu jelas Anda berada di mana. Dan hapus folder kerja segera setelah branch digabung: folder lama memakan tempat dan membuat branch terus berstatus terpakai.
Kesalahan dan jebakan yang sering terjadi
- Dependensi dan build tidak ikut. Setiap folder adalah direktori tersendiri, jadi
node_modules, virtualenv Python,.env, dan artefak build harus dibuat ulang. Berkas yang tidak dilacak tidak ikut tersalin ke folder baru. - Folder kerja dibuat di dalam folder utama. Perintah
git worktree add ./hotfixmembuat folder di dalam proyek, dan folder utama akan melihatnya sebagai berkas yang tidak dilacak. Letakkan folder kerja di sebelah (../) atau di direktori terpisah, atau tambahkan path-nya ke.gitignore. - Folder dipindahkan secara manual. Tautannya putus. Pindahkan dengan
git worktree move ../lama ../baru, atau jika sudah terlanjur dipindah, jalankangit worktree repairdi folder baru. - Folder di disk eksternal hilang. Agar
prunetidak menghapus catatan folder di disk yang sedang tidak terhubung, kunci folder tersebut:git worktree lock --reason "disk eksternal" ../shop-usb. - Submodul. Dukungan submodul di folder kerja tambahan terbatas; setelah membuat folder, jalankan
git submodule update --initdan periksa hasilnya.
Contekan git worktree
| Tugas | Perintah |
|---|---|
| Membuka branch yang ada di folder baru | git worktree add ../dir branch |
| Membuat branch dan folder | git worktree add -b branch-baru ../dir main |
| Folder tanpa branch (tag, commit) | git worktree add --detach ../dir v1.0 |
| Daftar folder kerja | git worktree list |
| Menghapus folder kerja | git worktree remove ../dir |
| Membersihkan catatan folder yang hilang | git worktree prune |
| Memindahkan folder kerja | git worktree move ../dir ../dir-baru |
| Memperbaiki tautan setelah pemindahan | git worktree repair |
| Melindungi dari prune | git worktree lock ../dir |
git worktree, stash, atau klon kedua
| Kriteria | stash | worktree | klon kedua |
|---|---|---|---|
| Kecepatan berpindah | Cepat, tetapi tetap berpindah branch | Seketika — cukup pindah folder | Seketika |
| Ruang disk | Minimal | Hanya berkas kerja | Salinan riwayat penuh |
| Sinkronisasi | Tidak perlu | Tidak perlu, riwayat bersama | Lewat push dan fetch |
| Bekerja bersamaan | Tidak | Ya | Ya |
Stash tetap pilihan terbaik untuk jeda singkat beberapa menit. Untuk hal yang lebih lama, atau jika Anda perlu membuka dua versi sekaligus, worktree lebih nyaman.
Ringkasan
git worktree adalah cara sederhana untuk bekerja di beberapa branch sekaligus: add membuat folder, list menampilkannya, remove dan prune membersihkannya. Riwayatnya dipakai bersama, sedangkan HEAD, index, dan berkas setiap folder bersifat terpisah; satu branch tidak bisa dibuka di dua folder sekaligus. Mengapa perpindahan branch bisa seringan itu dibahas dengan praktik dalam kursus Git.
Pertanyaan umum
Sejak versi Git berapa ada git worktree?
Perintah ini muncul di Git 2.5, dan kemudian banyak disempurnakan; remove dan move ditambahkan belakangan. Di versi Git modern semua perintah yang dijelaskan tersedia.
Bisakah commit di satu folder langsung terlihat di folder lain?
Bisa. Riwayatnya bersama, sehingga commit langsung tampak di git log folder mana pun, dan bisa digabung dengan git merge tanpa push maupun fetch.
Apakah IDE mengenali beberapa folder kerja?
Bagi IDE setiap folder adalah direktori proyek biasa, dibuka di jendela terpisah. Banyak editor juga menampilkan daftar folder kerja di antarmuka Git-nya.
Apakah git worktree remove ikut menghapus branch?
Tidak. Yang dihapus hanya folder dan catatan layanannya. Branch dihapus secara terpisah dengan git branch -d.
Bisakah git worktree dipakai dengan repositori bare?
Bisa. Pola yang populer adalah menyimpan klon bare, lalu membuat folder kerja untuk setiap branch darinya; dengan begitu tidak ada folder utama berisi berkas sama sekali.
Topik ini dibahas mendalam dengan praktik di kursus “Git dari Nol hingga Pengembang Percaya Diri”.
Ke kursus