Workflow Git Worktree untuk Multitasking dengan AI
Pada artikel sebelumnya, kita sudah membahas tentang workflow pengggunaan Git sebagai kontributor project open source dan sebagai maintainer project open source. Di kedua workflow ini, kita berhubungan dengan orang lain di perusahaan, negara, zona waktu berbeda. Sehingga koordinasi menjadi sulit karena perbedaan bahasa, waktu, dan prioritas pekerjaan.
Setelah itu, kita juga membahas workflow untuk diterapkan di dalam perusahaan, dimana orang-orangnya berada di lokasi yang sama, berbicara dalam bahasa yang sama, dan memiliki prioritas yang sama, ditentukan oleh arahan manajemen.
Di kedua situasi di atas (open source dan internal perusahaan), ada satu persamaan utama di semua workflow tersebut, yaitu:
- Membuat branch dulu untuk mengerjakan suatu task, misalnya menambah fitur atau memperbaiki bug.
- Selesaikan task dalam branch. Bisa dalam satu kali commit, atau bisa beberapa kali commit jika ada temuan review, saran perbaikan, atau bug dalam implementasinya.
- Setelah selesai, merge ke branch utama (main atau master)
Intinya adalah, kita membuat branch untuk mengerjakan satu task, dan kemudian melakukan merge ketika task tersebut sudah selesai. Jika ada banyak task yang dikerjakan secara bersamaan, maka banyak pula branch yang akan dibuat. Dan biasanya merge akan menjadi lebih sulit karena potensi conflict akan semakin banyak.
Di jaman dahulu, satu orang biasanya hanya mengerjakan satu atau dua task saja, karena sulitnya membagi fokus, atau bahasa kerennya, context switching. Akan tetapi, di jaman sekarang programmer memiliki asisten AI yang bisa disuruh coding, baik menambah fitur baru, refactoring kode program yang duplikasi, ataupun membuat dokumentasi.
Dengan demikian, kita memiliki kebutuhan untuk membuat banyak branch sekaligus di komputer lokal kita. Yang kemudian kita akan tugaskan asisten AI di masing-masing branch dengan task yang berbeda-beda. Untuk itu, kita akan menggunakan fitur git yang bernama worktree. Berikut cara kerjanya.
Misalnya kita akan mengerjakan project aplikasi-minibank. Kode programnya ada di gitlab dan github. Biasanya, kita akan melakukan clone seperti ini:
cd projects
git clone git@gitlab.com:tazkia.ac.id/aplikasi-minibank.git
Sehingga di folder project kita strukturnya menjadi seperti ini:
tree -L 2
├── aplikasi-keuangan
│ ├── README.md
│ ├── aplikasi-keuangan.iml
│ ├── aplikasi-keuangan.service
│ ├── deploy.sh
│ ├── mvnw
│ ├── mvnw.cmd
│ ├── pom.xml
│ └── src
├── aplikasi-manajemen-virtual-account
│ ├── LICENSE
│ ├── README.md
│ ├── application_design.md
│ ├── docker-compose.yml
│ ├── pom.xml
│ ├── src
│ └── target
└── aplikasi-minibank
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
Biasanya, kemudian kita akan masuk ke project aplikasi-minibank:
cd aplikasi-minibank
Kita bisa lihat strukturnya sebagai berikut
tree -L 3 -I 'target|db-minibank'
├── README.md
├── compose.yaml
├── devops
│ ├── README.md
│ ├── check-remote-build.sh
│ ├── destroy-build-session.sh
│ ├── kill-remote-build.sh
│ ├── list-snapshots.sh
│ ├── spawn-build-server.sh
│ └── start-remote-build.sh
├── mvnw
├── mvnw.cmd
├── pom.xml
├── scripts
│ ├── fix-db-permissions.sql
│ ├── generate-user-manual.sh
│ ├── reset-customer-data.sql
│ └── verify-fix-approval-permissions.sql
└── src
├── main
│ ├── frontend
│ ├── java
│ └── resources
└── test
├── java
└── resources
Kita sudah berada di dalam projectnya. Ini adalah yang biasanya kita lakukan kalau cuma satu task yang kita kerjakan dalam satu waktu. Kalaupun kita ditugaskan untuk mengerjakan beberapa task, biasanya kita akan pindah-pindah branch dalam folder project yang sama.
Akan tetapi, sekarang kita ingin mengerjakan beberapa task secara bersamaan. Misalnya kita akan:
- membuat dokumentasi teknis tentang project ini (skema database, tech stack, arsitektur, dsb)
- membuat user manual untuk pengguna
- menyesuaikan field pendaftaran nasabah agar sama dengan form registrasi di bank
Ini tidak bisa kita lakukan berbarengan hanya dengan satu folder project saja. Kita butuh 3 copy sekaligus, supaya semua task bisa dikerjakan.
Untuk itu, langkah pertama adalah, kita harus buat satu level lagi.
cd ..
mv aplikasi-minibank aplikasi-minibank-main
mkdir aplikasi-minibank
mv aplikasi-minibank-main aplikasi-minibank/
Sehingga hasilnya adalah sebagai berikut
├── aplikasi-manajemen-virtual-account
│ ├── LICENSE
│ ├── README.md
│ ├── application_design.md
│ ├── docker-compose.yml
│ ├── pom.xml
│ ├── src
│ └── target
├── aplikasi-minibank
│ └── aplikasi-minibank-main
├── aplikasi-notifikasi
│ ├── LICENSE
│ ├── README.md
│ ├── docs
│ ├── pom.xml
│ └── src
Perhatikan bahwa sekarang aplikasi-minibank memiliki subfolder aplikasi-minibank-main. Di sini kita akan menyimpan branch main kita.
Selanjutnya, kita bisa membuat worktree untuk masing-masing task. Setiap worktree adalah satu branch dalam git repo lokal kita.
cd aplikasi-minibank/aplikasi-minibank-main
git worktree add ../dokumentasi-teknis
git worktree add ../user-manual
git worktree add ../fix-field-nasabah
Setelah kita lakukan, maka struktur foldernya akan menjadi seperti ini:
└── aplikasi-minibank
├── aplikasi-minibank-main
│ ├── .git
│ │ ├── filter-repo
│ │ ├── hooks
│ │ ├── info
│ │ ├── logs
│ │ ├── objects
│ │ ├── refs
│ │ └── worktrees
│ ├── README.md
│ ├── compose.yaml
│ ├── db-minibank
│ ├── devops
│ ├── docs
│ ├── mvnw
│ ├── mvnw.cmd
│ ├── pom.xml
│ ├── scripts
│ └── src
├── dokumentasi-teknis
│ ├── .git
│ ├── README.md
│ ├── compose.yaml
│ ├── devops
│ ├── docs
│ ├── mvnw
│ ├── mvnw.cmd
│ ├── pom.xml
│ ├── scripts
│ └── src
├── fix-field-nasabah
│ ├── .git
│ ├── README.md
│ ├── compose.yaml
│ ├── devops
│ ├── docs
│ ├── mvnw
│ ├── mvnw.cmd
│ ├── pom.xml
│ ├── scripts
│ └── src
└── user-manual
├── .git
├── README.md
├── compose.yaml
├── devops
├── docs
├── mvnw
├── mvnw.cmd
├── pom.xml
├── scripts
└── src
Kita bisa lihat, sekarang ada 4 folder dengan isi yang identik. Keempat folder ini memiliki branchnya masing-masing. Mari kita cek.
git branch
+ dokumentasi-teknis
+ fix-field-nasabah
* main
+ user-manual
Bila kita perhatikan, folder .git yang menyimpan database history secara lengkap, hanya ada di aplikasi-minibank-main. Di folder worktree, hanya ada file .git yang nantinya akan menghubungkan worktree dengan folder utama.
Sekarang kita bisa langsung buka 3 terminal secara bersamaan, masuk ke folder dokumentasi-teknis, user-manual, dan fix-field-nasabah. Selanjutnya pekerjakan asisten kita di masing-masing folder, kemudian commit seperti biasa. Semua worktree ini filenya tidak saling mengganggu. Tapi semuanya terhubung ke repository git yang sama.
Setelah task selesai dan dicommit dalam masing-masing worktree, kita bisa merge branchnya seperti biasa. Sekalian hapus worktree yang sudah di-merge supaya tidak bikin penuh harddisk dan tidak bikin pusing. Jangan lupa hapus branchnya juga.
cd aplikasi-minibank-main
git merge dokumentasi-teknis
git worktree remove ../dokumentasi-teknis
git branch -d dokumentasi-teknis
Kesimpulan
Dengan menggunakan git worktree, kita bisa memanfaatkan kemampuan asisten AI secara maksimal untuk mengerjakan banyak task secara bersamaan. Setiap worktree memiliki working directory yang terpisah, sehingga perubahan di satu task tidak akan mengganggu task yang lain. Semua worktree tetap terhubung ke repository git yang sama, sehingga kita bisa melakukan merge dengan mudah setelah task selesai.
Workflow ini sangat berguna di era AI seperti sekarang, dimana kita tidak lagi terbatas hanya mengerjakan satu atau dua task dalam satu waktu. Dengan bantuan asisten AI, kita bisa mengerjakan dokumentasi, implementasi fitur, dan perbaikan bug secara paralel, kemudian menggabungkannya ke branch utama satu per satu setelah masing-masing task selesai direview dan diuji.
Referensi
Berikut beberapa referensi yang berguna untuk mempelajari lebih lanjut tentang git worktree:
Dokumentasi Resmi
- Git Worktree Documentation - Dokumentasi resmi dari Git
- Git Worktree Manual Page - Manual lengkap dengan semua opsi dan parameter
Tutorial dan Artikel
- Git Worktree: A Better Way to Work on Multiple Branches - Tutorial lengkap dari GitKraken
- How to Use Git Worktree - Panduan praktis dari OpenSource.com
- Git Worktree: Manage Multiple Working Trees - Tutorial dari Atlassian
Perintah-Perintah Penting
# Membuat worktree baru
git worktree add <path> [<branch>]
# Melihat daftar worktree
git worktree list
# Menghapus worktree
git worktree remove <path>
# Membersihkan worktree yang sudah tidak ada
git worktree prune
# Memindahkan worktree ke lokasi lain
git worktree move <source> <destination>
# Mengunci worktree agar tidak bisa dihapus
git worktree lock <path>
# Membuka kunci worktree
git worktree unlock <path>
Tips dan Trik
- Gunakan nama folder yang deskriptif untuk setiap worktree agar mudah diingat
- Jangan lupa hapus worktree dan branch yang sudah tidak dipakai untuk menghemat disk space
- Gunakan
git worktree listsecara berkala untuk melihat worktree yang masih aktif - Hindari membuat worktree di dalam worktree lain
- Pastikan semua perubahan sudah dicommit sebelum menghapus worktree
Selamat mencoba!