git worktree — bir vaqtda bir nechta branch bilan ishlash
Muammodan boshlaylik
Siz feature/katta-refaktoring da ishlayapsiz. 30 ta fayl o'zgargan, dev server ishlayapti, testlar 15 daqiqa davom etadi. Shu payt:
"Hamkasbning PR ini ko'rib chiqib, lokalda sinab ko'ra olasanmi?"
Variantlar:
git stash(18-dars) → switch → sinash → switch →stash pop→npm install(bog'liqliklar farq qilgan bo'lsa) → dev serverni qayta ishga tushirish. Va 15 daqiqalik testlar to'xtaydi- Repozitoriyni ikkinchi marta
cloneqilish — 2 GB, alohidafetch, alohida sozlamalar
Yaxshiroq yo'l — git worktree: bitta repozitoriy, bir nechta ishchi papka, har birida boshqa branch.
Worktree nima?
~/loyihalar/
├── dokon/ ← asosiy ishchi papka
│ ├── .git/ ← yagona repozitoriy (tarix, obyektlar)
│ └── ... (feature/katta-refaktoring)
├── dokon-review/ ← qo'shimcha worktree
│ └── ... (feature/hamkasb-pr)
└── dokon-hotfix/ ← yana biri
└── ... (hotfix/login)
- Barcha worktree lar bitta
.gitni ishlatadi — tarix, commitlar, branch lar umumiy - Har birining o'z ishchi papkasi, o'z staging i, o'z HEAD i
- Bir worktree da commit qilsangiz — boshqasida darhol
git logda ko'rinadi (fetch kerak emas) - Disk sarfi — faqat fayllar, tarix takrorlanmaydi
14-darsda aytilganidek: Git bitta papkada branch larni almashtiradi — worktree esa ularni yonma-yon qo'yadi.
Worktree yaratish
cd ~/loyihalar/dokon
git worktree add ../dokon-review feature/hamkasb-pr
Preparing worktree (checking out 'feature/hamkasb-pr')
HEAD is now at e5f6a7b Savat: miqdor tugmalari
cd ../dokon-review
npm install
npm run dev -- --port 5174 # boshqa portda — asosiy dev server ham ishlayveradi
Asosiy papkadagi ishingiz, dev server va testlar — tegilmagan.
Yangi branch bilan
git worktree add -b hotfix/login ../dokon-hotfix main
main dan yangi hotfix/login branch ni yaratib, uni yangi papkada ochadi.
Branch siz — vaqtinchalik
git worktree add --detach ../dokon-v2 v2.3.0
Eski versiyani ko'rish yoki solishtirish uchun (detached HEAD).
Worktree lar ro'yxati
git worktree list
/home/otabek/loyihalar/dokon a3f9c2b [feature/katta-refaktoring]
/home/otabek/loyihalar/dokon-review e5f6a7b [feature/hamkasb-pr]
/home/otabek/loyihalar/dokon-hotfix 9f8e7d6 [hotfix/login]
Cheklov: bitta branch — bitta joy
git worktree add ../dokon-ikkinchi main
fatal: 'main' is already checked out at '/home/otabek/loyihalar/dokon'
Bitta branch bir vaqtda faqat bitta worktree da ochiq bo'lishi mumkin — aks holda ikki joyda bir branch ga commit qilib, chalkashlik yaratish mumkin edi. Yechim: yangi branch (-b) yoki --detach.
O'chirish
Ish tugadi:
git worktree remove ../dokon-review
Saqlanmagan o'zgarishlar bo'lsa — Git rad etadi (--force bilan majburan). Papkani qo'lda (rm -rf) o'chirgan bo'lsangiz — Git hali uni "eslaydi":
git worktree prune # mavjud bo'lmagan worktree yozuvlarini tozalash
Branch o'chmaydi — faqat ishchi papka. Kerak bo'lmasa: git branch -d feature/hamkasb-pr.
Tipik foydalanish holatlari
| Vaziyat | Worktree |
|---|---|
| PR ni review qilish, joriy ishni to'xtatmasdan | git worktree add ../review pr-branch |
| Shoshilinch hotfix | git worktree add -b hotfix/x ../hotfix main |
| Uzoq testlar / build bir branch da, ish — boshqasida | Har biri o'z papkasida |
| Ikki versiyani yonma-yon solishtirish | --detach v1.0 va --detach v2.0 |
| Bir nechta AI agent yoki skriptni turli branch larda parallel ishlatish | Har biriga alohida worktree |
Tartibli tuzilma
Ko'p dasturchilar worktree larni bitta papkada saqlaydi:
git worktree add ../dokon.worktrees/review feature/hamkasb-pr
git worktree add ../dokon.worktrees/hotfix -b hotfix/login main
[!TIP] Har bir worktree — alohida papka, shuning uchun
node_modulesham alohida o'rnatiladi. Katta loyihalarda bu disk joyini oladi — pnpm global kesh bilan bunday holatlarda juda tejamkor. Ishingiz tugashi bilan worktree ni o'chirishni odat qiling.
Nima uchun shunday?
Nima uchun ikkinchi clone emas, worktree — natija bir xil emasmi?
Tashqaridan o'xshash, lekin ichkaridan farq katta. Ikki clone — ikki mustaqil repozitoriy: bittasida qilgan commitingiz ikkinchisida ko'rinmaydi (push + fetch kerak), har biri o'z .git ini to'liq saqlaydi (katta loyihada gigabaytlar), sozlamalar va remote lar takrorlanadi. Worktree lar esa bitta repozitoriyning ko'rinishlari: commit bir joyda — darhol hamma joyda, tarix bir marta saqlanadi, fetch bir marta qilinadi. Bu Git modelining tabiiy davomi: repozitoriy (.git) va ishchi papka — ikki alohida narsa (6-dars), va bitta repozitoriyga bir nechta ishchi papka ulanishi mumkin.
Xulosa
Eslab qoling:
- Worktree — bitta repozitoriy, bir nechta ishchi papka, har birida o'z branch
git worktree add ../papka branch— mavjud branchgit worktree add -b yangi ../papka main— yangi branch--detach v2.3.0— teg yoki commit ni ko'rish uchungit worktree list,remove,prune- Bitta branch — bir vaqtda faqat bitta worktree da
- Har biri — o'z
node_modules, o'z dev server porti - Stash va ikkinchi clone ga nisbatan — tez va tejamkor
Keyingi dars
47-dars: git hook — commit, push oldidan avtomatik ishlar bajarish