Ketika mengerjakan proyek dengan Git, ada situasi yang hampir selalu mengganggu ritme: Anda sedang mengembangkan fitur baru, lalu tiba-tiba harus memperbaiki bug di branch lain. Cara yang umum adalah menjalankan git stash, berpindah branch, menyelesaikan hotfix, lalu mengembalikan perubahan sebelumnya. Masalahnya, stash mudah menumpuk dan kadang membuat kita lupa perubahan mana yang harus dipulihkan.
Git memiliki fitur yang lebih nyaman untuk kasus seperti ini: git worktree. Fitur ini memungkinkan satu repository memiliki beberapa folder kerja sekaligus. Setiap folder dapat memakai branch berbeda, tetapi tetap berbagi objek repository yang sama. Sederhananya, Anda bisa memiliki folder fitur-pembayaran dan hotfix-login yang aktif bersamaan tanpa harus terus-menerus checkout.
Apa sebenarnya Git worktree?
Dalam penggunaan Git biasa, satu repository umumnya memiliki satu folder kerja. Saat menjalankan git switch atau git checkout, isi folder tersebut berubah mengikuti branch yang dipilih.
Dengan worktree, satu repository dapat memiliki satu folder utama dan beberapa folder tambahan yang terhubung ke repository tersebut. Masing-masing worktree memiliki HEAD dan index sendiri, sehingga perubahan di satu folder tidak otomatis mengacaukan pekerjaan di folder lain. Data Git yang berat tetap dibagi, jadi Anda tidak perlu melakukan clone penuh berulang kali.
Fitur ini berbeda dari menyalin folder proyek secara manual. Salinan biasa tidak memiliki hubungan administratif yang benar dengan repository utama dan bisa menimbulkan kebingungan ketika digunakan untuk commit atau berpindah branch.
Membuat worktree pertama
Misalnya Anda sedang berada di repository toko-online dan ingin membuat folder khusus untuk hotfix.
git worktree add ../toko-online-hotfix hotfix/loginPerintah tersebut membuat folder ../toko-online-hotfix dan membuka branch hotfix/login di dalamnya. Jika branch itu sudah tersedia secara lokal, Git akan menggunakannya. Anda dapat masuk ke folder tersebut lalu bekerja seperti biasa:
cd ../toko-online-hotfix
git status
# lakukan perubahan
git add .
git commit -m "Perbaiki validasi login"Sementara itu, folder repository utama tetap berada pada branch sebelumnya. Anda dapat kembali mengerjakan fitur tanpa harus melakukan stash.
Membuat branch baru sekaligus
Jika branch untuk pekerjaan baru belum ada, gunakan opsi -b:
git worktree add -b fitur-pembayaran ../toko-online-pembayaran mainPerintah ini membuat branch baru bernama fitur-pembayaran berdasarkan main, lalu menempatkannya di folder ../toko-online-pembayaran.
Nama folder bebas, tetapi sebaiknya dibuat mudah dikenali. Contoh pola yang sederhana:
../project-mainuntuk pekerjaan utama.../project-hotfixuntuk perbaikan mendesak.../project-reviewuntuk memeriksa pull request.
Melihat dan menghapus worktree
Untuk melihat semua worktree yang terhubung ke repository, jalankan:
git worktree listGit akan menampilkan lokasi folder, commit yang sedang digunakan, dan branch aktif. Ini berguna ketika Anda sudah memiliki beberapa folder dan mulai lupa mana yang digunakan untuk pekerjaan tertentu.
Setelah pekerjaan selesai dan folder tidak lagi dibutuhkan, hapus worktree dengan:
git worktree remove ../toko-online-hotfixPerintah tersebut menghapus folder worktree dan metadata terkait. Branch yang sudah Anda commit tidak otomatis dihapus. Jika folder pernah dihapus secara manual melalui file manager, metadata lama bisa tertinggal. Dalam situasi seperti itu, gunakan:
git worktree prunePerintah prune membersihkan catatan worktree yang sudah tidak memiliki folder tujuan.
Aturan penting yang sering mengejutkan
Secara umum, satu branch tidak boleh aktif di dua worktree pada waktu yang sama. Ini adalah perlindungan agar dua folder tidak menulis perubahan ke branch yang sama secara bersamaan dan menghasilkan keadaan yang sulit dilacak.
Misalnya branch main sedang aktif di folder utama. Git biasanya akan menolak ketika Anda mencoba membuka branch main lagi di worktree lain. Solusinya bukan memaksa, melainkan memakai branch berbeda sesuai tujuan pekerjaan.
Karena worktree berbagi sebagian besar data repository, jangan menganggapnya sebagai dua proyek yang sepenuhnya terisolasi. Konfigurasi tertentu masih dapat dibagi, terutama jika Anda mengubah pengaturan Git pada tingkat repository. Untuk kebutuhan yang memang harus berbeda per folder, Git menyediakan konfigurasi khusus worktree melalui pengaturan extensions.worktreeConfig.
Perhatikan dependency dan service lokal
Worktree memisahkan file sumber, tetapi tidak otomatis memisahkan semua hal di luar Git. Jika proyek memakai dependency lokal, database, container, atau file konfigurasi yang menunjuk ke port tertentu, dua worktree bisa saja saling bertabrakan.
Contohnya, dua folder Node.js mungkin sama-sama menggunakan file .env dengan port database yang sama. Dua proses aplikasi kemudian berebut port atau menulis ke database yang sama. Untuk menghindarinya, gunakan database pengujian terpisah, port berbeda, atau file konfigurasi lokal yang disiapkan khusus untuk masing-masing worktree.
Hal yang sama berlaku untuk folder hasil build, cache, dan file yang tidak dilacak Git. Pastikan proses build tidak menulis ke lokasi bersama yang seharusnya hanya digunakan oleh satu pekerjaan.
Kapan worktree paling berguna?
- Hotfix mendadak: pekerjaan fitur tetap terbuka, sementara perbaikan bug dikerjakan di folder lain.
- Code review: Anda dapat checkout branch rekan kerja tanpa mengganggu perubahan lokal.
- Perbandingan versi: dua branch dapat dijalankan atau diuji berdampingan.
- Proyek dengan build lama: Anda tidak perlu menunggu proses checkout dan instalasi ulang setiap kali berpindah konteks.
- Eksperimen sementara: buat worktree terpisah, lalu hapus setelah hasilnya tidak diperlukan.
Yang bisa dilakukan sekarang
Jika Anda sering memakai git stash hanya karena harus berpindah tugas, cobalah alur sederhana ini:
- Pastikan perubahan yang sedang dikerjakan sudah memiliki commit yang jelas, atau setidaknya tersimpan dengan aman.
- Buat worktree baru untuk branch hotfix atau branch review.
- Gunakan folder berbeda untuk setiap konteks kerja.
- Periksa daftar worktree dengan
git worktree listsecara berkala. - Hapus worktree yang sudah selesai dengan
git worktree remove.
Git worktree bukan pengganti branch, stash, atau clone dalam semua situasi. Namun untuk developer yang sering berpindah konteks, fitur ini mengurangi pekerjaan administratif yang tidak perlu. Anda dapat meninggalkan satu folder dalam keadaan siap dilanjutkan, sementara folder lain dipakai untuk menyelesaikan kebutuhan yang lebih mendesak.
Dokumentasi resmi Git menjelaskan bahwa worktree tambahan berbagi sebagian besar data repository, tetapi memiliki metadata per-worktree seperti HEAD dan index sendiri. Detail lengkap mengenai perintah add, list, remove, lock, dan prune tersedia di dokumentasi git-worktree.
Sumber & bacaan lebih lanjut
– Rio Yotto @rioyotto
