Panduan

git worktree: cara bekerja di beberapa branch sekaligus

Diperbarui: · Skillaria.Top

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 kerjaDipakai bersama
HEAD (branch atau commit aktif)Objek dan seluruh riwayat
Index (git add)Branch lokal dan remote, tag
Merge, rebase, cherry-pick yang belum selesaiStash (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 ./hotfix membuat 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, jalankan git worktree repair di folder baru.
  • Folder di disk eksternal hilang. Agar prune tidak 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 --init dan periksa hasilnya.

Contekan git worktree

TugasPerintah
Membuka branch yang ada di folder barugit worktree add ../dir branch
Membuat branch dan foldergit worktree add -b branch-baru ../dir main
Folder tanpa branch (tag, commit)git worktree add --detach ../dir v1.0
Daftar folder kerjagit worktree list
Menghapus folder kerjagit worktree remove ../dir
Membersihkan catatan folder yang hilanggit worktree prune
Memindahkan folder kerjagit worktree move ../dir ../dir-baru
Memperbaiki tautan setelah pemindahangit worktree repair
Melindungi dari prunegit worktree lock ../dir

git worktree, stash, atau klon kedua

Kriteriastashworktreeklon kedua
Kecepatan berpindahCepat, tetapi tetap berpindah branchSeketika — cukup pindah folderSeketika
Ruang diskMinimalHanya berkas kerjaSalinan riwayat penuh
SinkronisasiTidak perluTidak perlu, riwayat bersamaLewat push dan fetch
Bekerja bersamaanTidakYaYa

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.

Pelajari topik ini lewat video

Topik ini dibahas mendalam dengan praktik di kursus “Git dari Nol hingga Pengembang Percaya Diri”.

Ke kursus