Worktree

Membuka beberapa working tree dari satu repository dengan git worktree.

Daftar isi

Perintah git worktree membuka beberapa working tree dari satu repository, sehingga dua pekerjaan dapat berjalan berdampingan tanpa salinan repository dan tanpa stash. Topik ini membahas cara menambah, mencatat, dan menghapus worktree, interaksinya dengan branch, dan keadaan yang paling sering menyelamatkannya, yaitu perbaikan mendesak di tengah pekerjaan fitur yang belum selesai.

Satu repository, beberapa working tree#

Setiap worktree adalah folder kerja tersendiri dengan keadaan HEAD-nya sendiri, sementara basis data objek dan seluruh riwayat tetap milik satu repository yang sama. Kerja pada dua folder itu tidak saling mengganggu, dan commit dari salah satunya langsung terlihat oleh yang lain karena berbagi basis data. Pola ini mengisi celah yang tidak dapat dijawab branch saja, karena working directory hanya ada satu dan branch yang sama tidak boleh dipakai dua tempat.

Aturan Git pada hal ini tegas: sebuah branch hanya boleh dipakai (checked out) oleh satu worktree pada satu waktu. Aturan ini melindungi pengguna dari dua posisi kerja yang saling menimpa, dan pesan penolakannya menyebut worktree yang sedang memegang branch tersebut.

Menambah dan mencatat worktree#

Siapkan repository dengan dua branch, yaitu main yang aktif dan rilis yang menunggu perbaikan, lalu buka branch rilis pada folder terpisah.

bash
# tanggal commit ditetapkan agar keluaran contoh dapat direproduksi secara persis
export GIT_AUTHOR_DATE="2026-11-01T09:00:00+07:00"
export GIT_COMMITTER_DATE="2026-11-01T09:00:00+07:00"
bash
rm -rf /tmp/lab-worktree /tmp/lab-wt-rilis
mkdir /tmp/lab-worktree
cd /tmp/lab-worktree
git init -b main
git config user.name "Budi"
git config user.email "[email protected]"
printf "Aplikasi versi rilis.\n" > app.txt
git add app.txt
git commit -m "Versi rilis"
git branch rilis
printf "Aplikasi versi rilis.\nFitur baru dalam pengerjaan.\n" > app.txt
git commit -am "Fitur baru"
git worktree add /tmp/lab-wt-rilis rilis
git worktree list
text Keluaran
Initialized empty Git repository in /tmp/lab-worktree/.git/
[main (root-commit) d90f1c1] Versi rilis
 1 file changed, 1 insertion(+)
 create mode 100644 app.txt
[main 18de075] Fitur baru
 1 file changed, 1 insertion(+)
Preparing worktree (checking out 'rilis')
HEAD is now at d90f1c1 Versi rilis
/tmp/lab-worktree  18de075 [main]
/tmp/lab-wt-rilis  d90f1c1 [rilis]

Folder baru menampilkan keadaan branch rilis, dan git worktree list mencatat keduanya beserta hash dan branchnya. Pemeriksaan cepat menunjukkan keadaan dua folder itu berbeda, sedangkan repository-nya satu.

Bekerja di dalam worktree#

Pekerjaan di dalam worktree berjalan sebagaimana biasa, dan commit-nya bergerak pada branch yang dipakai folder itu.

bash
cd /tmp/lab-wt-rilis
printf "Aplikasi versi rilis.\nPerbaikan kebocoran memori.\n" > app.txt
git commit -am "Perbaiki kebocoran memori"
cd /tmp/lab-worktree
git log --oneline rilis -1
text Keluaran
[rilis c2e303e] Perbaiki kebocoran memori
 1 file changed, 1 insertion(+)
c2e303e Perbaiki kebocoran memori

Dari folder utama, commit perbaikan itu sudah terlihat pada branch rilis, meskipun folder fitur tidak pernah pindah ke mana pun. Setelah perbaikan selesai digabungkan, worktree dilepas agar tidak menjadi folder yang terlupakan.

bash
git worktree remove /tmp/lab-wt-rilis
git worktree list
text Keluaran
/tmp/lab-worktree  18de075 [main]

Rincian yang jarang terlihat#

Worktree menyimpan daftar anggotanya pada folder .git/worktrees/ di repository utama, dan setiap entri berisi penunjuk HEAD, berkas yang menghubungkannya, dan jalurnya. Pemeriksaan ini menjelaskan perilaku yang terasa ajaib: folder worktree hanya berisi berkas .git yang berupa satu baris teks penunjuk, bukan repository utuh, sehingga ukuran dua folder kerja tidak menggandakan basis data.

Satu keterbatasan yang lazim terjadi pada pembersihan manual adalah folder worktree yang dihapus lewat pengelola berkas tanpa perintah remove. Git tetap mencatatnya, dan git worktree prune membersihkan catatan untuk folder yang sudah tidak ada. Perintah ini aman dijalankan kapan saja, karena hanya menghapus entri yang jalurnya kosong.

Worktree juga bersifat lokal pada repository tempat ia dibuat, dan tidak ikut terkirim ataupun ter-clone. Struktur folder pada repository remote tetap berupa satu working tree, sehingga kebiasaan ber-worktree adalah kebiasaan mesin kerja masing-masing, bukan bagian dari struktur proyek yang dibagikan.

Kapan worktree dipilih#

Worktree paling berguna pada dua keadaan, dan keduanya membagi sifat yang sama, yaitu dua pekerjaan yang harus hidup pada saat bersamaan. Keadaan pertama adalah perbaikan mendesak di tengah fitur yang belum selesai: tanpa worktree, pilihan yang ada adalah commit setengah jadi, menyimpan melalui stash, atau mengubah keadaan editor dan terminal secara manual. Dengan worktree, folder utama tetap utuh dan perbaikan berlangsung di folder lain.

Keadaan kedua adalah menjalankan dua versi secara berdampingan, misalnya membandingkan perilaku dua branch atau menjalankan pengujian lama dan baru secara bergantian. Pada kedua keadaan, biaya tambahannya nyaris nol karena basis datanya dipakai bersama, dan pembersihannya selesai dengan satu perintah remove.

Ringkasan#

  • git worktree add folder branch membuka working tree kedua dari repository yang sama, dan list serta remove mengelolanya.
  • Satu branch hanya boleh dipakai satu worktree, dan basis data objeknya dipakai bersama sehingga commit langsung terlihat antar folder.
  • Worktree menjawab dua keadaan utama, yaitu perbaikan mendesak di tengah fitur dan perbandingan dua versi berdampingan.
  • Worktree yang selesai tugasnya dilepas dengan git worktree remove agar folder kerja tidak menumpuk.

Referensi#