Mundarija (36)
- Bu darsda
- 1. Nega bu kerak?
- 2. Boshlang'ich holat
- 3. git worktree add — ikkinchi stol
- 3.1 Yangi papka, yangi branch
- 3.2 Ikkinchi papka ichida
- 3.3 node_modules qani?
- 3.4 Tuzatish va commit
- 4. Asosiy qoida: bitta branch — bitta joyda
- 4.1 Bir branchni ikki marta ochib bo'lmaydi
- 4.2 Tuzatishni main ga qo'shish
- 5. Worktree'ni yopish
- 5.1 git worktree remove
- 5.2 Papkani qo'lda o'chirsangiz — prune
- 6. Nima umumiy, nima alohida?
- 6.1 Stash umumiy
- 6.2 Jadval
- 7. Worktree darajasidagi sozlama
- 8. AI agentlar bilan parallel ishlash
- 8.1 Muammo
- 8.2 Yechim: har agentga o'z worktree'si
- 8.3 Birlashtirish va tozalash
- 8.4 Agentlar uchun qoidalar
- 9. Ko'p uchraydigan xatolar
- 9.1 "Already used by worktree"
- 9.2 Worktree ichida worktree
- 9.3 Papka yo'q, lekin ro'yxatda bor
- 9.4 Stash va worktree'ni aralashtirish
- 10. Mashqlar
- 1-mashq (oson): Umumiymi yoki alohida?
- 2-mashq (o'rta): Bo'sh joylarni to'ldiring
- 3-mashq (qiyin): Nima bo'ladi?
- 4-mashq: Portfolio qadami — tajriba yonma-yon
- 11. Real ishda
- Xulosa
- Manbalar
Git worktree: bitta repoda bir nechta branchda parallel ishlash
Qisqacha:
git worktree add ../papka <branch>bitta repoga ikkinchi ishchi papka qo'shadi — unda boshqa branch ochiq turadi. Tarix, branchlar va stash umumiy, lekin har papkaning o'z fayllari va o'z branchi bor. Yarim ishni stash qilmasdan shoshilinch tuzatish qilish, eski versiyani yonma-yon ko'rish yoki bir nechta AI agentni bir vaqtda ishlatish uchun qulay. Bitta branch bir vaqtda faqat bitta worktree'da ochiladi; ish tugagach —git worktree remove.
Bu darsda
git worktree addbilan yangi branchni alohida papkada ochib, unda commit qila olasiz.- Worktree'lar nimasi bilan umumiy va nimasi bilan alohida ekanini tushuntira olasiz.
git worktree list,removevaprunebilan ularni boshqarasiz.- Worktree'ga xos sozlamani (
git config --worktree) qo'ya olasiz. - Bir nechta AI agentni bir repoda xavfsiz, parallel ishlatish sxemasini tuza olasiz.
Oldin bilishingiz kerak: Branch nima: arzon ko'rsatkich, Stash: yarim ishni vaqtincha chetga olish, Git'ni o'rnatish va birinchi sozlash.
1. Nega bu kerak?
Stash darsida Aziz yarim ishni javonga qo'yib, shoshilinch tuzatish qildi. Bu ishladi, lekin noqulay tomonlari bor edi: untracked fayllarni unutmaslik uchun -u, qaytishda conflict ehtimoli, javonda unutilgan stashlar. Va eng muhimi — bitta papka bor ekan, bir vaqtda faqat bitta branchni ko'ra olasiz.
Choyxona oshxonasini tasavvur qiling. Bitta oshpaz, bitta stol. Shoshilinch buyurtma kelsa, stolni bo'shatish kerak — xamirni chetga olib, yopib qo'yish (stash aynan shu). Katta oshxonada esa ikkinchi stol bor. Xamir birinchi stolda qoladi, shoshilinch taom ikkinchisida tayyorlanadi. Omborxona, ziravorlar, retseptlar daftari — umumiy.
Worktree (working tree, ishchi daraxt) — Git'dagi "ikkinchi stol": bitta repoga ulangan qo'shimcha ishchi papka. Uch hudud darsida "working tree" so'zini birinchi marta ko'rgansiz — fayllaringiz turgan papka. Oddiy repoda u bitta. git worktree esa ularni bir nechta qilish imkonini beradi.
2. Boshlang'ich holat
«Bahor» reposida Aziz feature/yangi-dizayn branchida ishlayapti. Bitta commit qildi, keyingisi yarim yo'lda:
git status -s M assets/css/asosiy.css
M index.htmlRepoda .gitignore bor va unda node_modules/ yozilgan (Birinchi repo darsidagi portfolio kabi). Papkada node_modules/ ham bor — buni keyinroq eslaymiz.
Hozir nechta ishchi papka borligini ko'ramiz:
git worktree listC:/Users/.../kurs/bahor 52d06ad [feature/yangi-dizayn]Bitta: yo'l, joriy commit va qavs ichida branch. Yo'lning o'rtasini ... bilan qisqartirdik — sizda to'liq yo'l chiqadi. Bu papka asosiy worktree deyiladi — .git papkasi aynan shu yerda.
Shu payt Jasur aka qo'ng'iroq qiladi: bron sahifasidagi telefon raqami xato.
3. git worktree add — ikkinchi stol
3.1 Yangi papka, yangi branch
git worktree add -b fix/telefon ../bahor-tuzatish mainPreparing worktree (new branch 'fix/telefon')
HEAD is now at cfc3636 Git: node_modules ni chetlab o'tBuyruqni bo'laklaymiz:
-b fix/telefon— yangi branch yarat (xuddigit switch -cdagi kabi).../bahor-tuzatish— yangi papka qayerda bo'lsin...— bir qavat yuqori, ya'nikurs/ichida,bahor/ning yonida.main— yangi branch qaysi commitdan boshlansin.
Tarjimasi: "worktree tayyorlanmoqda (yangi branch fix/telefon). HEAD endi cfc3636 da." Git yangi papka yaratdi va unga main dagi fayllarni chiqardi.
git worktree list
git status -sC:/Users/.../kurs/bahor 52d06ad [feature/yangi-dizayn]
C:/Users/.../kurs/bahor-tuzatish cfc3636 [fix/telefon]
M assets/css/asosiy.css
M index.htmlEndi ikkita ishchi papka. Asosiy papkadagi yarim ish esa joyida — hech narsaga tegilmadi, stash kerak bo'lmadi.
Diqqat: Worktree papkasini repo ichida yaratmang (masalan
bahor/tuzatish/). Unda asosiy repo uni untracked papka deb ko'radi vagit add .uni tarixga tortib ketishi mumkin. Kursda qoida: worktree — repo yonida,kurs/bahor-...shaklida.
3.2 Ikkinchi papka ichida
cd ../bahor-tuzatish
ls -a.
..
.git
.gitignore
aloqa
assets
bron
index.html
menyuOddiy repoga o'xshaydi. Lekin .git bu yerda — papka emas, fayl:
cat .gitgitdir: C:/Users/.../kurs/bahor/.git/worktrees/bahor-tuzatishBu fayl bitta qator: "Git ma'lumotlari u yerda". Tarix, obyektlar va branchlar asosiy repoda, .git/worktrees/bahor-tuzatish/ da esa faqat shu papkaning o'z HEAD'i va qutisi (index) saqlanadi. Shuning uchun yangi worktree juda tez yaratiladi va diskda kam joy oladi — tarix nusxalanmaydi.
git status
git branchOn branch fix/telefon
nothing to commit, working tree clean
+ feature/yangi-dizayn
* fix/telefon
mainPapka toza, biz yangi branchdamiz. git branch da yangi belgi — +. + — "bu branch boshqa worktree'da ochiq". * — shu papkadagi joriy branch.
3.3 node_modules qani?
ls node_modulesls: cannot access 'node_modules': No such file or directoryYangi worktree'ga faqat tracked fayllar chiqadi. .gitignore dagi node_modules/, .env va boshqa untracked fayllar asosiy papkada qoladi. Loyihada npm paketlari bo'lsa, yangi worktree'da ham npm install qilish kerak bo'ladi. .env kabi maxfiy sozlamalarni esa qo'lda nusxalaysiz. Bu worktree'ning eng ko'p unutiladigan tomoni.
3.4 Tuzatish va commit
Telefonni VS Code'da tuzatamiz. Ikkinchi papkani alohida oynada ochish qulay — code ../bahor-tuzatish (VS Code bilan tanishuv darsidagi code buyrug'i):
git add bron/index.html
git commit -m "Bron: telefon raqamini tuzat"
git log --oneline -204323d8 (HEAD -> fix/telefon) Bron: telefon raqamini tuzat
cfc3636 (main) Git: node_modules ni chetlab o'tEndi asosiy papkaga qaytib qaraymiz:
cd ../bahor
git log --oneline -1 fix/telefon
git branch -v04323d8 (fix/telefon) Bron: telefon raqamini tuzat
* feature/yangi-dizayn 52d06ad Dizayn: yashil rangni qo'sh
+ fix/telefon 04323d8 Bron: telefon raqamini tuzat
main cfc3636 Git: node_modules ni chetlab o'tIkkinchi papkada qilingan commit bu yerda darhol ko'rinadi. Chunki tarix bitta — ikkala papka bitta .git dan foydalanadi.
flowchart TD
G[("bahor/.git<br/>tarix, branchlar, stash")]
A["bahor/<br/>feature/yangi-dizayn"] --> G
B["bahor-tuzatish/<br/>fix/telefon"] --> GNimaga qarang: ikkita "stol", bitta "omborxona". Har papkaning o'z fayllari, o'z branchi va o'z qutisi bor. Commitlar, branchlar va stash — umumiy.
Tekshirib ko'ring: Aziz
bahor-tuzatishda yangi commit qildi. Asosiybahorpapkasidagi fayllar o'zgaradimi?
Javob
Yo'q. Commit umumiy tarixga yozildi, lekin asosiy papka feature/yangi-dizayn branchida turibdi va uning fayllari o'sha branchniki. git log fix/telefon yangi commitni ko'rsatadi, lekin papkadagi bron/index.html o'zgarmaydi — xuddi boshqa branchdagi commit kabi.
4. Asosiy qoida: bitta branch — bitta joyda
4.1 Bir branchni ikki marta ochib bo'lmaydi
Aziz feature/yangi-dizayn ni ikkinchi papkada ham ochmoqchi bo'ldi:
git worktree add ../bahor-ikki feature/yangi-dizaynPreparing worktree (checking out 'feature/yangi-dizayn')
fatal: 'feature/yangi-dizayn' is already used by worktree at 'C:/Users/.../kurs/bahor'Tarjimasi: "feature/yangi-dizayn allaqachon quyidagi worktree'da ishlatilmoqda: ...". Git ruxsat bermadi. bahor-tuzatish ichida git switch feature/yangi-dizayn qilsangiz ham aynan shu xato chiqadi.
Nega? Tasavvur qiling: ikki papkada bitta branch ochiq. Birida commit qilsangiz, branch oldinga suriladi. Ikkinchi papkaning fayllari esa eski holatda qoladi — branch bilan mos kelmaydi. Keyingi commit u yerdan qilinsa, birinchi papkadagi o'zgarishlar "bekor qilinganday" ko'rinadi. Git bu chalkashlikning oldini oladi.
4.2 Tuzatishni main ga qo'shish
main hozir hech qayerda ochiq emas. Tuzatish papkasining o'zida main ga o'tib, merge qilamiz:
cd ../bahor-tuzatish
git switch main
git merge fix/telefonSwitched to branch 'main'
Updating cfc3636..04323d8
Fast-forward
bron/index.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)Fast-forward — main shunchaki oldinga surildi. Endi main bu papkada ochiq. Asosiy papkada unga o'tishga urinsangiz:
fatal: 'main' is already used by worktree at 'C:/Users/.../kurs/bahor-tuzatish'Qoida ikki tomonlama ishlaydi.
5. Worktree'ni yopish
5.1 git worktree remove
Tuzatish tugadi — ikkinchi stolni yig'ishtiramiz. Aziz u yerda eslatma.txt faylini qoldirgan edi:
cd ../bahor
git worktree remove ../bahor-tuzatishfatal: '../bahor-tuzatish' contains modified or untracked files, use --force to delete itTarjimasi: "papkada o'zgargan yoki kuzatilmaydigan fayllar bor, o'chirish uchun --force ishlating". Git sizning saqlanmagan ishingizni himoya qilyapti. --force darhol yozmang: avval papkaga kirib, git status bilan nima qolganini ko'ring. Kerakli narsa bo'lsa — commit qiling. Aziz eslatmani o'chirdi va qaytadan urindi:
git worktree remove ../bahor-tuzatish
git worktree listC:/Users/.../kurs/bahor 52d06ad [feature/yangi-dizayn]Papka diskdan o'chdi, ro'yxatda yana bitta worktree. fix/telefon branchi va uning commiti esa joyida — remove faqat papkani olib tashlaydi, tarixga tegmaydi.
5.2 Papkani qo'lda o'chirsangiz — prune
Worktree papkasini Explorer'da yoki rm -rf bilan o'chirib yuborish mumkin. Sinab ko'rdik: eski versiya uchun worktree ochib, keyin papkasini qo'lda o'chirdik.
git worktree add --detach ../bahor-eski b09fa2aPreparing worktree (detached HEAD b09fa2a)
HEAD is now at b09fa2a Aloqa: sahifa yarat--detach — branch ochmasdan, to'g'ridan-to'g'ri commitga (detached HEAD). Eski versiyani ko'rish uchun qulay: cat ../bahor-eski/bron/index.html telefon raqami hali yo'q bo'lgan sahifani ko'rsatdi. Tag nomini ham berish mumkin: git worktree add --detach ../bahor-v1 v1.0.0 (Tag va relizlar).
Endi papkani qo'lda o'chiramiz (rm -rf ../bahor-eski) va ro'yxatga qaraymiz:
git worktree list -vC:/Users/.../kurs/bahor 52d06ad [feature/yangi-dizayn]
C:/Users/.../kurs/bahor-eski b09fa2a (detached HEAD)
prunable: gitdir file points to non-existent locationGit hali ham worktree'ni eslab turibdi, lekin belgi qo'ydi: prunable — "kesib tashlasa bo'ladi", "mavjud bo'lmagan joyni ko'rsatyapti". (-v siz ro'yxatda qator oxirida faqat prunable so'zi chiqadi.) Qolgan yozuvni tozalaymiz:
git worktree prune -v
git worktree listRemoving worktrees/bahor-eski: gitdir file points to non-existent location
C:/Users/.../kurs/bahor 52d06ad [feature/yangi-dizayn]Git bu tozalashni vaqti-vaqti bilan o'zi ham qiladi. Lekin to'g'ri yo'l — doim git worktree remove. Shunda saqlanmagan fayllar tekshiriladi va hech narsa tasodifan o'chmaydi.
Maslahat: Worktree tashqi diskda yoki vaqtincha ulanmagan papkada bo'lsa, Git uni
prunebilan tozalab yubormasligi uchun "qulflab" qo'yish mumkin:git worktree lock ../papka --reason "tashqi disk". Ochish —git worktree unlock.
Tekshirib ko'ring:
git worktree remove ../bahor-tuzatishdan keyinfix/telefonbranchi va undagi commit nima bo'ladi?
Javob
Ikkalasi ham qoladi. remove faqat ishchi papkani va uning .git/worktrees/... dagi xizmat yozuvini o'chiradi. Branch va commitlar umumiy tarixda. Branch kerak bo'lmasa, uni odatdagidek git branch -d bilan alohida o'chirasiz.
6. Nima umumiy, nima alohida?
6.1 Stash umumiy
Asosiy papkada stash qilib, yangi worktree'da ro'yxatga qaradik:
git stash push -m "dizayn: h1 rangi"
git worktree add ../bahor-menyu -b feature/menyu-somsa
cd ../bahor-menyu
git stash listSaved working directory and index state On feature/yangi-dizayn: dizayn: h1 rangi
Preparing worktree (new branch 'feature/menyu-somsa')
HEAD is now at 52d06ad Dizayn: yashil rangni qo'sh
stash@{0}: On feature/yangi-dizayn: dizayn: h1 rangi(CRLF ogohlantirishlarini tashlab ketdik.) Stash ikkinchi papkada ham ko'rinadi — u ham umumiy .git da. Bu qulay, lekin ehtiyot bo'ling: bir papkada pop qilingan stash boshqasida ham yo'qoladi.
6.2 Jadval
| Umumiy (hamma worktree'da bitta) | Har worktree'da alohida |
|---|---|
| Commitlar va obyektlar | Fayllar (ishchi papka) |
| Branchlar va taglar | HEAD — joriy branch |
| Stash | Quti (index) |
.git/config sozlamalari |
Untracked va ignored fayllar |
| Reflog'ning branch qismi | HEAD reflogi |
Oxirgi qator Reflog darsiga bog'lanadi: har worktree'ning o'z HEAD kundaligi bor, branchlarning kundaligi esa umumiy.
7. Worktree darajasidagi sozlama
Git'ni sozlash darsida sozlamalarning uch darajasini (system, global, local) o'rgangan edik va yana bitta — worktree darajasi borligini aytgan edik. Endi uni ko'ramiz.
Ba'zan bitta worktree boshqacha sozlama talab qiladi. Masalan, tajriba papkasida boshqa muharrir. Oddiy git config (local) umumiy .git/config ga yozadi — hamma worktree'ga ta'sir qiladi. Aziz --worktree bilan urinib ko'rdi:
git config --worktree user.email "sinov@example.com"fatal: --worktree cannot be used with multiple working trees unless the config
extension worktreeConfig is enabled. Please read "CONFIGURATION FILE"
section in "git help worktree" for detailsTarjimasi: "bir nechta worktree bo'lsa, worktreeConfig kengaytmasi yoqilmaguncha --worktree ishlatib bo'lmaydi. Tafsilotlar — git help worktree ning CONFIGURATION FILE bo'limida". Kengaytmani bir marta yoqamiz, keyin sozlaymiz:
git config extensions.worktreeConfig true
git config --worktree core.editor "notepad"
git config --show-origin --get core.editorfile:.git/config.worktree notepad--show-origin (Git'ni sozlash darsidan tanish) qiymat qayerdan kelganini aytdi: .git/config.worktree — faqat shu worktree'ning fayli. Ikkinchi worktree'da xuddi shu buyruq global qiymatni ko'rsatdi:
file:C:/Users/.../uy/.gitconfig code --wait(Sinov muhitida global sozlama maxsus papkada — sizda C:/Users/<ism>/.gitconfig bo'ladi.) Bu kamdan-kam kerak bo'ladigan imkoniyat. Lekin "nega bu worktree'da sozlama boshqacha?" degan savolga javob — shu fayl.
8. AI agentlar bilan parallel ishlash
8.1 Muammo
Bugun ko'p dasturchilar AI kod yordamchilari bilan ishlaydi. Bunday yordamchi — agent — terminalda buyruqlar bajaradi, fayllarni o'zgartiradi, testlarni ishga tushiradi. Bitta vazifaga bitta agent — sekin. Ikki agentga ikki vazifa berish tabiiy: biri menyuga yangi taom qo'shsin, ikkinchisi bron formasini kengaytirsin.
Lekin ikkala agent bitta papkada ishlasa, xuddi bitta stolda ikki oshpaz bir-birining xamiriga qo'l tiqqanday bo'ladi. Biri git switch qiladi — ikkinchisining fayllari ostidan o'zgarib ketadi. Biri git add . qiladi — ikkinchisining yarim ishi uning commitiga tushadi.
8.2 Yechim: har agentga o'z worktree'si
Worktree bu muammoni to'liq yechadi: har agent o'z papkasida, o'z branchida. Claude Code kabi vositalarning hujjatlarida parallel sessiyalar uchun aynan shu yo'l tavsiya qilinadi, ba'zilari esa worktree'ni o'zi yaratib beradi. Qanday ishlashini qo'lda ko'ramiz. Aziz yarim dizayn ishini commit qilib, main ga o'tdi va ikki "agent" uchun ikki worktree ochdi:
git worktree add -b feature/agent-menyu ../bahor-agent-menyu main
git worktree add -b feature/agent-bron ../bahor-agent-bron mainPreparing worktree (new branch 'feature/agent-menyu')
HEAD is now at 04323d8 Bron: telefon raqamini tuzat
Preparing worktree (new branch 'feature/agent-bron')
HEAD is now at 04323d8 Bron: telefon raqamini tuzatHar papkada o'z ishi bo'ldi: birinchisida menyuga somsa narxi, ikkinchisida bron formasiga ism maydoni qo'shilib, commit qilindi. Natija:
git worktree list
git log --oneline --graph --all -6C:/Users/.../kurs/bahor 04323d8 [main]
C:/Users/.../kurs/bahor-agent-bron b1870a1 [feature/agent-bron]
C:/Users/.../kurs/bahor-agent-menyu 705fd58 [feature/agent-menyu]
* b1870a1 (feature/agent-bron) Bron: ism maydonini qo'sh
| * 705fd58 (feature/agent-menyu) Menyu: somsa narxini qo'sh
|/
* 04323d8 (HEAD -> main, fix/telefon) Bron: telefon raqamini tuzat
| * 9f0a78f (feature/yangi-dizayn) Dizayn: sarlavha rangini qo'sh
| * 52d06ad Dizayn: yashil rangni qo'sh
|/
* cfc3636 Git: node_modules ni chetlab o'tUch parallel ish chizig'i: ikki agent va Aziznikining dizayni. Hech biri boshqasiga xalaqit bermadi.
gitGraph
commit id: "cfc3636"
branch feature/yangi-dizayn
commit id: "dizayn"
checkout main
commit id: "04323d8"
branch feature/agent-menyu
commit id: "somsa"
checkout main
branch feature/agent-bron
commit id: "ism"
checkout main
merge feature/agent-menyu
merge feature/agent-bronNimaga qarang: agentlar branchlari bir nuqtadan ajralib, keyin navbat bilan main ga qo'shildi. Ko'rib chiqish (review) — sizning ishingiz: har branchni git diff main..feature/agent-menyu bilan tekshirib, keyin birlashtirasiz.
8.3 Birlashtirish va tozalash
git merge --no-edit feature/agent-menyu
git merge --no-edit feature/agent-bron
git worktree remove ../bahor-agent-menyu
git worktree remove ../bahor-agent-bron
git branch -d feature/agent-menyu feature/agent-bronUpdating 04323d8..705fd58
Fast-forward
menyu/index.html | 1 +
1 file changed, 1 insertion(+)
Merge made by the 'ort' strategy.
bron/index.html | 1 +
1 file changed, 1 insertion(+)
Deleted branch feature/agent-menyu (was 705fd58).
Deleted branch feature/agent-bron (was b1870a1).Birinchisi — fast-forward, ikkinchisi — merge commit (Merge). Ikki agent turli fayllarda ishlagani uchun conflict bo'lmadi. Bir faylni o'zgartirsa, conflictni odatdagidek yechasiz (Conflictlarni yechish). Shuning uchun agentlarga vazifani iloji boricha turli fayllarga bo'lib bering.
8.4 Agentlar uchun qoidalar
- Bitta agent — bitta worktree — bitta branch. Branch nomi vazifani aytsin.
npm installhar worktree'da alohida —node_modules/umumiy emas («node_modulesqani?» bo'limi). Katta loyihada bu disk joyini oladi.- Dev server portlari. Ikki worktree'da
npm run devbir vaqtda ishlasa, ikkinchisi boshqa portni tanlashi kerak. Buni keyingi qismlarda Vite bilan ishlaganda ko'rasiz. - Tekshirmasdan merge qilmang. Agent yozgan kod — hamkasb yozgan kod kabi review'dan o'tadi.
- Tugagach —
remove. Unutilgan worktree'largit worktree listda to'planib qoladi.
9. Ko'p uchraydigan xatolar
9.1 "Already used by worktree"
fatal: 'main' is already used by worktree at 'C:/Users/.../kurs/bahor-tuzatish'Branch boshqa papkada ochiq. Tuzatish: o'sha papkada boshqa branchga o'ting yoki worktree'ni remove qiling. Qaysi papka ekanini xabarning o'zi aytadi. git worktree list ham ko'rsatadi.
9.2 Worktree ichida worktree
git worktree add tuzatish (../ siz) — papka repo ichida yaratiladi. Asosiy repoda git status uni untracked deb ko'rsatadi. Tuzatish: git worktree remove tuzatish va qaytadan ../ bilan.
9.3 Papka yo'q, lekin ro'yxatda bor
Qo'lda o'chirilgan papka prunable bo'lib qoladi va shu nomdagi yangi worktree yaratishga xalaqit berishi mumkin. Tuzatish: git worktree prune.
9.4 Stash va worktree'ni aralashtirish
Stash umumiy. bahor-tuzatish da git stash pop yozsangiz, asosiy papkada qilingan stash u yerga tushadi — boshqa branchga. Tuzatish: worktree bilan ishlaganda stashdan qoching yoki git stash list dagi branch nomiga qarang (On feature/yangi-dizayn: ...).
10. Mashqlar
1-mashq (oson): Umumiymi yoki alohida?
Har biri uchun "umumiy" yoki "alohida" deb yozing:
git log mainnatijasiindex.htmlfaylining hozirgi mazmunigit stash listnode_modules/papkasi- Joriy branch (
git branchdagi*)
Yechim
- Umumiy — branchlar va commitlar bitta
.gitda. - Alohida — har worktree'ning o'z fayllari.
- Umumiy — stash
.gitichida. - Alohida — ignored fayllar yangi worktree'ga chiqmaydi.
- Alohida — har worktree'ning o'z HEAD'i.
2-mashq (o'rta): Bo'sh joylarni to'ldiring
«Bahor»da feature/yangi-dizayn da yarim ish bor. main dan yangi fix/telefon branchini yonma-yon papkada oching, tuzating va yoping:
git worktree -b fix/telefon ../bahor-tuzatish main
cd ../bahor-tuzatish
git add bron/index.html
git commit -m "Bron: telefon raqamini tuzat"
cd ../bahor
git worktree ../bahor-tuzatish
git worktree listIshora: papka qo'shadigan va xavfsiz yopadigan buyruqlar — «git worktree add» va «Worktree'ni yopish» bo'limlarida.
Yechim
git worktree add -b fix/telefon ../bahor-tuzatish main
cd ../bahor-tuzatish
git add bron/index.html
git commit -m "Bron: telefon raqamini tuzat"
cd ../bahor
git worktree remove ../bahor-tuzatish
git worktree listOxirgi list faqat asosiy papkani ko'rsatadi. fix/telefon branchi va uning commiti qoladi — keyin uni main ga merge qilasiz.
3-mashq (qiyin): Nima bo'ladi?
Har buyruq uchun natijani va sababini ayting. Boshlang'ich holat: asosiy bahor/ da main ochiq, bahor-tuzatish/ da fix/telefon.
bahor/ichida:git switch fix/telefonbahor/ichida:git worktree add ../bahor-v1 mainbahor-tuzatish/papkasini Explorer'da o'chirib, keyingit worktree listbahor/ichida:git worktree add --detach ../bahor-eski dab5bff
Ishora: «Bitta branch — bitta joyda», «Papkani qo'lda o'chirsangiz» bo'limlari va --detach.
Yechim
- Xato:
'fix/telefon' is already used by worktree at '...bahor-tuzatish'. Branch boshqa papkada ochiq. - Xato: xuddi shu sabab —
mainasosiy papkada ochiq. - Ro'yxatda
bahor-tuzatishhali ko'rinadi,prunablebelgisi bilan.git worktree pruneuni tozalaydi. Papkada commit qilinmagan ish bo'lgan bo'lsa — u yo'qoldi, shuning uchunremovexavfsizroq. - Ishlaydi: branch ochilmaydi, papka to'g'ridan-to'g'ri eski commitda (detached HEAD). Bir branch cheklovi bu yerda yo'q, chunki branch ishlatilmayapti.
4-mashq: Portfolio qadami — tajriba yonma-yon
Cherry-pick darsida portfolio'da tajriba branchini ochgan edingiz. Endi uni stash va branch almashtirishsiz, alohida papkada oching va asosiy saytni ham, tajribani ham bir vaqtda ko'ring.
tajribabranchini../portfolio-tajribapapkasida oching (-bkerak emas — branch bor).git worktree listbilan ikkala papkani ko'ring. Ikkalasini VS Code'ning alohida oynalarida oching (code ../portfolio-tajriba).- Tajriba papkasida bosh sahifaga bir qator qo'shib, commit qiling. Asosiy papkada
git log --oneline -1 tajribavacat sayt/index.html— commit ko'rinadimi, fayl o'zgardimi? - Tajriba papkasini
git worktree removebilan yoping.
Yechim
cd ~/kurs/portfolio
git worktree add ../portfolio-tajriba tajriba
git worktree list
cd ../portfolio-tajriba
git add sayt/index.html
git commit -m "Bosh sahifa: tajriba matnini qo'sh"
cd ../portfolio
git log --oneline -1 tajriba
cat sayt/index.html
git worktree remove ../portfolio-tajriba
git worktree listBiz qisqa portfolio nusxasida sinadik:
Preparing worktree (checking out 'tajriba')
HEAD is now at 63190c1 Portfolio: 06-qism oxiridagi holat
C:/Users/.../kurs/portfolio 63190c1 [main]
C:/Users/.../kurs/portfolio-tajriba 63190c1 [tajriba]Commitdan keyin asosiy papkada git log --oneline -1 tajriba — 3535af5 (tajriba) Bosh sahifa: tajriba matnini qo'sh, cat sayt/index.html esa eski mazmunni ko'rsatdi. Commit umumiy, fayllar alohida. Sizda tajriba branchida cherry-pick darsidagi commitlar ham bor va SHA'lar boshqacha. Portfolio'da package.json bo'lsa, tajriba papkasida Prettier yoki Stylelint ishlatish uchun avval npm install kerak bo'ladi.
11. Real ishda
- Shoshilinch tuzatish — worktree'ning klassik ishlatilishi. Katta loyihada branch almashtirish sekin: minglab fayl qayta yoziladi, dev server qayta yig'iladi. Ikkinchi papka bu vaqtni tejaydi.
- Review. Hamkasbning PR'ini alohida papkada ochib, ishga tushirib ko'rasiz — o'z ishingiz yonida kutib turadi. PR bilan keyinroq tanishasiz.
- AI agentlar. 2025–2026 yillarda worktree "unutilgan buyruq"dan kundalik asbobga aylandi: bir nechta AI agentni parallel ishlatish aynan shunga tayanadi.
- Eski versiyani solishtirish.
--detachbilan relizni yonma-yon ochib, ikki versiyani brauzerda birga ko'rish mumkin. - Intervyuda: "stash va worktree farqi?", "nega bitta branchni ikki worktree'da ochib bo'lmaydi?" — bu darsning ikki asosiy savoli.
Xulosa
git worktree add [-b yangi] ../papka <branch>— bitta repoga qo'shimcha ishchi papka; tarix nusxalanmaydi.- Umumiy: commitlar, branchlar, taglar, stash,
.git/config. Alohida: fayllar, HEAD, quti, ignored fayllar (node_modules/). - Bitta branch bir vaqtda faqat bitta worktree'da; eski versiya uchun —
--detach. - Yopish —
git worktree remove(saqlanmagan ishni tekshiradi); qo'lda o'chirilgan papka —git worktree prune. - Worktree darajasidagi sozlama:
extensions.worktreeConfig+git config --worktree. - AI agentlar: har agentga o'z worktree'si va branchi, keyin review va merge.
Keyingi dars: SSH kalit va GitHub autentifikatsiyasi — lokal Git'dan GitHub'ga o'tamiz: kompyuteringizni GitHub'ga parolsiz va xavfsiz ulaymiz.
Manbalar
- Git hujjati: "git-worktree" (CONFIGURATION FILE bo'limi bilan) — git-scm.com/docs/git-worktree
- Pro Git kitobi: "Git Branching" — git-scm.com/book
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!