IlmHamroh
JavaScript Full-stack/7-qism. Git va GitHub asoslari24/36-dars18 daqiqa
Mundarija (36)

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 add bilan yangi branchni alohida papkada ochib, unda commit qila olasiz.
  • Worktree'lar nimasi bilan umumiy va nimasi bilan alohida ekanini tushuntira olasiz.
  • git worktree list, remove va prune bilan 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:

bash
git status -s
text
 M assets/css/asosiy.css
 M index.html

Repoda .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:

bash
git worktree list
text
C:/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

bash
git worktree add -b fix/telefon ../bahor-tuzatish main
text
Preparing worktree (new branch 'fix/telefon')
HEAD is now at cfc3636 Git: node_modules ni chetlab o't

Buyruqni bo'laklaymiz:

  • -b fix/telefon — yangi branch yarat (xuddi git switch -c dagi kabi).
  • ../bahor-tuzatish — yangi papka qayerda bo'lsin. .. — bir qavat yuqori, ya'ni kurs/ 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.

bash
git worktree list
git status -s
text
C:/Users/.../kurs/bahor          52d06ad [feature/yangi-dizayn]
C:/Users/.../kurs/bahor-tuzatish cfc3636 [fix/telefon]
 M assets/css/asosiy.css
 M index.html

Endi 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 va git add . uni tarixga tortib ketishi mumkin. Kursda qoida: worktree — repo yonida, kurs/bahor-... shaklida.

3.2 Ikkinchi papka ichida

bash
cd ../bahor-tuzatish
ls -a
text
.
..
.git
.gitignore
aloqa
assets
bron
index.html
menyu

Oddiy repoga o'xshaydi. Lekin .git bu yerda — papka emas, fayl:

bash
cat .git
text
gitdir: C:/Users/.../kurs/bahor/.git/worktrees/bahor-tuzatish

Bu 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.

bash
git status
git branch
text
On branch fix/telefon
nothing to commit, working tree clean
+ feature/yangi-dizayn
* fix/telefon
  main

Papka toza, biz yangi branchdamiz. git branch da yangi belgi — +. + — "bu branch boshqa worktree'da ochiq". * — shu papkadagi joriy branch.

3.3 node_modules qani?

bash
ls node_modules
text
ls: cannot access 'node_modules': No such file or directory

Yangi 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):

bash
git add bron/index.html
git commit -m "Bron: telefon raqamini tuzat"
git log --oneline -2
text
04323d8 (HEAD -> fix/telefon) Bron: telefon raqamini tuzat
cfc3636 (main) Git: node_modules ni chetlab o't

Endi asosiy papkaga qaytib qaraymiz:

bash
cd ../bahor
git log --oneline -1 fix/telefon
git branch -v
text
04323d8 (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't

Ikkinchi 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"] --> G

Nimaga 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-tuzatish da yangi commit qildi. Asosiy bahor papkasidagi 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:

bash
git worktree add ../bahor-ikki feature/yangi-dizayn
text
Preparing 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:

bash
cd ../bahor-tuzatish
git switch main
git merge fix/telefon
text
Switched 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:

text
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:

bash
cd ../bahor
git worktree remove ../bahor-tuzatish
text
fatal: '../bahor-tuzatish' contains modified or untracked files, use --force to delete it

Tarjimasi: "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:

bash
git worktree remove ../bahor-tuzatish
git worktree list
text
C:/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.

bash
git worktree add --detach ../bahor-eski b09fa2a
text
Preparing 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:

bash
git worktree list -v
text
C:/Users/.../kurs/bahor      52d06ad [feature/yangi-dizayn]
C:/Users/.../kurs/bahor-eski b09fa2a (detached HEAD)
	prunable: gitdir file points to non-existent location

Git 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:

bash
git worktree prune -v
git worktree list
text
Removing 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 prune bilan 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-tuzatish dan keyin fix/telefon branchi 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:

bash
git stash push -m "dizayn: h1 rangi"
git worktree add ../bahor-menyu -b feature/menyu-somsa
cd ../bahor-menyu
git stash list
text
Saved 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:

bash
git config --worktree user.email "sinov@example.com"
text
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 details

Tarjimasi: "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:

bash
git config extensions.worktreeConfig true
git config --worktree core.editor "notepad"
git config --show-origin --get core.editor
text
file:.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:

text
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:

bash
git worktree add -b feature/agent-menyu ../bahor-agent-menyu main
git worktree add -b feature/agent-bron ../bahor-agent-bron main
text
Preparing 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 tuzat

Har papkada o'z ishi bo'ldi: birinchisida menyuga somsa narxi, ikkinchisida bron formasiga ism maydoni qo'shilib, commit qilindi. Natija:

bash
git worktree list
git log --oneline --graph --all -6
text
C:/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't

Uch 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-bron

Nimaga 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

bash
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-bron
text
Updating 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 install har worktree'da alohida — node_modules/ umumiy emas («node_modules qani?» bo'limi). Katta loyihada bu disk joyini oladi.
  • Dev server portlari. Ikki worktree'da npm run dev bir 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'lar git worktree list da to'planib qoladi.

9. Ko'p uchraydigan xatolar

9.1 "Already used by worktree"

text
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:

  1. git log main natijasi
  2. index.html faylining hozirgi mazmuni
  3. git stash list
  4. node_modules/ papkasi
  5. Joriy branch (git branch dagi *)
Yechim
  1. Umumiy — branchlar va commitlar bitta .git da.
  2. Alohida — har worktree'ning o'z fayllari.
  3. Umumiy — stash .git ichida.
  4. Alohida — ignored fayllar yangi worktree'ga chiqmaydi.
  5. 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:

bash
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 list

Ishora: papka qo'shadigan va xavfsiz yopadigan buyruqlar — «git worktree add» va «Worktree'ni yopish» bo'limlarida.

Yechim
bash
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 list

Oxirgi 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.

  1. bahor/ ichida: git switch fix/telefon
  2. bahor/ ichida: git worktree add ../bahor-v1 main
  3. bahor-tuzatish/ papkasini Explorer'da o'chirib, keyin git worktree list
  4. bahor/ ichida: git worktree add --detach ../bahor-eski dab5bff

Ishora: «Bitta branch — bitta joyda», «Papkani qo'lda o'chirsangiz» bo'limlari va --detach.

Yechim
  1. Xato: 'fix/telefon' is already used by worktree at '...bahor-tuzatish'. Branch boshqa papkada ochiq.
  2. Xato: xuddi shu sabab — main asosiy papkada ochiq.
  3. Ro'yxatda bahor-tuzatish hali ko'rinadi, prunable belgisi bilan. git worktree prune uni tozalaydi. Papkada commit qilinmagan ish bo'lgan bo'lsa — u yo'qoldi, shuning uchun remove xavfsizroq.
  4. 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.

  1. tajriba branchini ../portfolio-tajriba papkasida oching (-b kerak emas — branch bor).
  2. git worktree list bilan ikkala papkani ko'ring. Ikkalasini VS Code'ning alohida oynalarida oching (code ../portfolio-tajriba).
  3. Tajriba papkasida bosh sahifaga bir qator qo'shib, commit qiling. Asosiy papkada git log --oneline -1 tajriba va cat sayt/index.html — commit ko'rinadimi, fayl o'zgardimi?
  4. Tajriba papkasini git worktree remove bilan yoping.
Yechim
bash
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 list

Biz qisqa portfolio nusxasida sinadik:

text
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. --detach bilan 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
Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Git worktree: bitta repoda bir nechta branchda parallel ishlash — IlmHamroh