git worktree memungkinkan satu repositori memiliki beberapa direktori kerja sekaligus, masing-masing terikat pada branch berbeda, tanpa cloning ulang dan tanpa memindahkan perubahan yang belum di-commit. Pada git 2.43.0, perintah ini punya delapan subperintah: add, list, lock, move, prune, remove, repair, dan unlock. Artinya seluruh siklus hidup direktori kerja tambahan bisa dikelola dari satu perintah, termasuk mengunci direktori agar tidak dibersihkan dan memperbaiki tautan yang rusak setelah direktori dipindahkan.
Artikel ini membahas kapan worktree lebih tepat daripada stash atau clone kedua, cara membuat dan membersihkannya, serta jebakan yang muncul ketika direktori dipindahkan atau dihapus tanpa prosedur.
TL;DR
- Satu repositori bisa punya banyak direktori kerja, masing-masing pada branch berbeda.
- git 2.43.0 menyediakan delapan subperintah: add, list, lock, move, prune, remove, repair, unlock.
- Subperintah add menerima --detach, --orphan, -b untuk branch baru, dan --lock dengan alasan.
- Direktori yang dipindahkan atau dihapus manual meninggalkan catatan usang; repair dan prune yang merapikannya.
- Worktree berbagi objek dan ref dengan repositori induk, jadi commit di satu direktori langsung terlihat di direktori lain.
Apa masalah yang diselesaikan git worktree?
Masalahnya adalah satu direktori kerja hanya bisa menampilkan satu branch pada satu waktu. Ketika pekerjaan mendesak datang di tengah pekerjaan lain, pilihan yang tersedia tanpa worktree adalah menyimpan perubahan sementara, memindahkan branch, lalu mengembalikan keadaan semula; atau mengunduh clone baru yang memakan ruang dan memutus akses ke branch lokal yang belum di-push.
Worktree memotong seluruh rangkaian itu. Direktori kedua dibuat dalam hitungan detik karena objek yang sudah ada di repositori dipakai bersama, bukan disalin. Pekerjaan di direktori pertama tetap utuh, termasuk berkas yang belum di-commit, sementara direktori kedua bisa dipakai untuk memperbaiki bug, menjalankan pengujian pada branch lain, atau membandingkan perilaku dua versi kode secara berdampingan.
Karena objek dan ref dibagi, commit yang dibuat di satu worktree langsung terlihat dari worktree lain melalui perintah git log atau git branch. Yang tidak dibagi adalah berkas kerja dan indeks, sehingga dua direktori tidak saling menimpa perubahan yang sedang berjalan.
Bagaimana membuat dan memeriksa worktree?
Buat dengan git worktree add diikuti jalur direktori dan branch yang diinginkan; bila branch belum ada, tambahkan -b diikuti nama branch baru. Periksa daftarnya dengan git worktree list, dan tambahkan --porcelain bila hasilnya akan dibaca skrip karena format itu lebih mudah diurai.
git worktree add ../proyek-perbaikan -b perbaikan-cepat
git worktree add ../proyek-review origin/main
git worktree list --porcelain
Dua bentuk di atas menunjukkan perbedaan penting. Bentuk pertama membuat branch baru di direktori baru, sedangkan bentuk kedua memeriksa branch yang sudah ada. Untuk keperluan inspeksi tanpa niat menulis, tambahkan --detach agar direktori tersebut tidak terikat pada branch mana pun, sehingga tidak ada risiko commit nyasar ke branch yang salah.
Subperintah add juga menerima --orphan untuk membuat direktori kerja pada branch tanpa riwayat, --checkout untuk mengatur perilaku pengisian berkas, dan --lock bila direktori tersebut tidak boleh dibersihkan oleh proses lain. Seluruh daftar opsi beserta artinya ada di dokumentasi git-worktree di git-scm.com.
Kapan memakai worktree, kapan cukup stash atau clone?
Worktree menang ketika dua pekerjaan harus hidup berdampingan dalam waktu lama. Stash lebih tepat untuk perpindahan singkat beberapa menit, dan clone terpisah lebih tepat ketika yang dibutuhkan adalah repositori yang benar-benar mandiri, misalnya untuk menguji konfigurasi remote yang berbeda.
| Pendekatan | Kelebihan | Keterbatasan |
|---|---|---|
| git worktree | Berkas kerja terpisah, objek dipakai bersama, commit langsung terlihat | Semua worktree berbagi repositori, sehingga branch tidak bisa dipakai ganda |
| git stash | Cepat untuk perpindahan singkat | Hanya satu keadaan kerja pada satu waktu, mudah lupa dipulihkan |
| Clone kedua | Sepenuhnya mandiri, termasuk konfigurasi dan remote | Memakan ruang dan waktu unduh, branch lokal harus disinkronkan manual |
| Pindah branch | Tanpa direktori tambahan | Perubahan yang belum di-commit harus disimpan dulu |
Pembanding yang sering dipakai adalah git stash, yang caranya dijelaskan di dokumentasi git-stash. Perbedaan filosofisnya sederhana: stash menyembunyikan pekerjaan agar direktori bisa dipakai ulang, sedangkan worktree memberi direktori baru sehingga pekerjaan lama tidak perlu disembunyikan.
Apa fungsi lock dan prune?
lock menandai sebuah worktree agar tidak dihapus oleh operasi pembersihan, dan alasannya bisa dicatat lewat --reason. Ini berguna untuk direktori yang berada di perangkat lepas, pada sistem berkas yang sementara tidak terpasang, atau pada mesin lain yang sedang tidak aktif: tanpa penanda, operasi pembersihan bisa menganggap direktori itu sudah hilang.
prune melakukan kebalikannya, yaitu membersihkan catatan worktree yang direktorinya sudah tidak ada. Opsi -n menampilkan apa yang akan dibersihkan tanpa benar-benar menghapus, -v memberi keluaran lebih rinci, dan --expire menentukan batas waktu. Kebiasaan yang aman adalah menjalankan prune dengan -n lebih dulu, membaca daftarnya, baru menjalankan tanpa -n.
Menghapus direktori worktree secara manual dengan perintah penghapus berkas bukan cara yang dianjurkan, karena catatan administratif di repositori induk tidak ikut terhapus. Subperintah remove disediakan untuk itu, dengan opsi -f bila ada perubahan yang memang ingin dibuang. Perbedaan keduanya terlihat saat git worktree list masih menampilkan direktori yang sebenarnya sudah tidak ada.
Bagaimana memperbaiki worktree yang rusak?
Gunakan repair ketika direktori dipindahkan tanpa melalui move. Tautan administratif di repositori induk menyimpan jalur absolut, sehingga pemindahan manual membuat jalur itu menunjuk ke tempat yang salah; repair menulis ulang tautan tersebut berdasarkan lokasi yang baru.
Subperintah move melakukan hal serupa dengan rapi, yaitu memindahkan direktori sekaligus memperbarui catatannya. Selisih kecil ini menjelaskan mengapa dua perintah terlihat mirip: move mencegah masalah, sedangkan repair memperbaikinya setelah terjadi. Pada repositori yang dikerjakan beberapa orang di satu mesin, keduanya sama-sama perlu diketahui agar tidak ada direktori yang tertinggal menunjuk jalur lama.
Untuk pemakaian sehari-hari, alur kerja yang paling sedikit mengejutkan adalah: buat worktree untuk satu tujuan, beri nama direktori yang menjelaskan tujuan itu, kunci bila direktorinya berada di media lepas, dan hapus dengan remove ketika selesai. Alur itu menjaga jumlah direktori tetap kecil dan membuat git worktree list tetap bisa dibaca sebagai daftar pekerjaan yang sedang berjalan.
Kapan worktree bukan pilihan tepat?
Worktree bukan pilihan tepat ketika yang dibutuhkan adalah isolasi penuh, misalnya menguji proses build yang membaca konfigurasi global atau menjalankan alat yang menulis ke direktori di luar repositori. Dalam kondisi itu, clone terpisah atau wadah terisolasi lebih jujur daripada worktree yang tetap berbagi repositori dan berbagi berkas konfigurasi pengguna.
Pilihan ini juga kurang cocok untuk tim yang alat bantunya mengandalkan asumsi satu direktori per repositori. Beberapa alat pengembangan menyimpan status berdasarkan jalur repositori dan menjadi bingung ketika ada beberapa direktori kerja yang menunjuk repositori sama. Sebelum mengadopsinya secara luas, uji dulu alat yang dipakai sehari-hari: penyunting kode, alat pengujian, dan skrip build.
Untuk pemakaian yang lebih luas, termasuk alur kerja branch pada umumnya, rujukan yang enak dipakai adalah bagian alur kerja branch di buku Pro Git. Buku itu menjelaskan pola branch jangka panjang yang menjadi alasan utama orang membutuhkan lebih dari satu direktori kerja.
Bagaimana worktree berinteraksi dengan branch yang diperiksa?
Git menolak memeriksa branch yang sama di dua worktree sekaligus, dan penolakan itu bukan pembatasan sepele: dua direktori yang menulis ke branch yang sama akan menghasilkan riwayat yang saling bertabrakan tanpa peringatan. Karena itu, direktori kedua biasanya dipakai untuk branch berbeda, dan untuk keperluan inspeksi dipakai mode detach agar tidak ada branch yang terikat.
Konsekuensi lain yang perlu dipahami adalah status branch bersifat global. Menghapus branch yang masih diperiksa di salah satu worktree akan ditolak, dan pemindahan branch dari satu direktori ke direktori lain harus dilakukan dengan sadar. Perilaku ini justru membantu: kesalahan yang tidak mungkin terjadi lebih baik daripada kesalahan yang terjadi diam-diam.
Kesalahan umum yang membuat worktree membingungkan
Sebagian besar kebingungan berasal dari perawatan, bukan dari perintahnya. Catatan berikut merangkum pola yang paling sering muncul saat direktori kerja tambahan dipakai dalam jangka panjang.
- Menghapus direktori dengan perintah penghapus berkas, lalu bingung karena daftar worktree masih menampilkannya.
- Memindahkan direktori tanpa move sehingga tautan absolut di repositori induk menunjuk jalur lama.
- Membuat worktree untuk pekerjaan sekali pakai, lalu meninggalkannya berbulan-bulan sampai daftar sulit dibaca.
- Mengunci direktori tanpa mencatat alasan, sehingga tidak ada yang berani membersihkannya.
- Mengasumsikan berkas konfigurasi lokal di direktori pertama otomatis ada di direktori kedua.
Semua butir di atas selesai dengan satu kebiasaan: perlakukan direktori kerja tambahan sebagai sumber daya yang punya siklus hidup, sama seperti branch. Buat dengan tujuan jelas, kunci hanya bila alasannya nyata, dan tutup dengan remove ketika tujuannya selesai.
FAQ
Apakah worktree menduplikasi seluruh riwayat repositori?
Tidak. Semua worktree berbagi objek dan ref dengan repositori induk, sehingga tidak ada salinan riwayat tambahan. Yang dibuat baru hanyalah direktori kerja, indeks, dan berkas administratif kecil yang menautkannya ke repositori.
Bisakah dua worktree memakai branch yang sama?
Tidak. Satu branch hanya boleh diperiksa di satu worktree pada satu waktu, karena dua direktori yang menulis ke branch sama akan saling menimpa. Untuk keperluan inspeksi, gunakan --detach agar direktori kedua tidak terikat pada branch.
Mengapa git worktree list masih menampilkan direktori yang sudah dihapus?
Karena catatan administratif di repositori induk tidak ikut terhapus saat direktori dihapus manual. Jalankan prune dengan opsi -n untuk melihat daftar yang akan dibersihkan, lalu jalankan tanpa -n untuk membersihkannya.
Apakah subperintah repair bisa memperbaiki semua kasus?
Tidak. repair menulis ulang tautan berdasarkan lokasi direktori yang baru, sehingga berguna untuk direktori yang dipindahkan. Bila direktori benar-benar hilang, yang dibutuhkan adalah prune untuk membersihkan catatan, bukan repair.
Apakah worktree aman dipakai di server produksi?
Bisa, dengan catatan direktori kerja tambahan tetap diperlakukan sebagai tempat menulis biasa. Kunci direktori yang tidak boleh dibersihkan, dan hindari menghapus direktori secara manual agar catatan administrasi tetap konsisten dengan keadaan sebenarnya.
💬 Komentar (0)
Belum ada komentar. Jadilah yang pertama! 💬