git worktree — bir vaqtda bir nechta branch bilan ishlash

~15 daq · Git · Ilg'or Git

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 clone qilish — 2 GB, alohida fetch, 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 .git ni 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 log da 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_modules ham 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 branch
  • git worktree add -b yangi ../papka main — yangi branch
  • --detach v2.3.0 — teg yoki commit ni ko'rish uchun
  • git 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