git worktree: nakala nyingi za kazi kwenye repo moja bila kuclone upya
git worktree huunganisha folda nyingi za kazi kwenye repo moja, na kila folda ina tawi lake lililofunguliwa. Amri git worktree add ../hotfix main huunda folda yenye tawi main kando ya mradi; historia na vitu vyote ni vya pamoja, na hakuna haja ya kuclone upya.
Git worktree inafanya nini
git worktree huunganisha folda kadhaa za kazi kwenye repo moja. Kwenye folda kuu umefungua tawi lenye kipengele, na kwenye folda ya jirani main kwa hotfix ya dharura, na zote mbili zipo kwa wakati mmoja. Vitu, commit na matawi ni vya pamoja: commit iliyofanywa kwenye folda moja inaonekana mara moja kwenye nyingine bila push wala fetch.
Bila worktree, kubadili muktadha kunaonekana hivi: git stash, git switch main, marekebisho, git switch kurudi, git stash pop. Ikiwa mradi una jenzi ndefu au node_modules nzito, kila kubadili tawi pia kunafuta cache. Njia nyingine ni kuclone repo upya, lakini hapo unapata nakala mbili huru za historia zinazohitaji kusawazishwa kupitia seva.
Worktree inatoa faida za zote mbili: folda tofauti, lakini hifadhidata moja ya .git. Hili linawezekana kwa sababu tawi katika Git ni kielekezi tu kwa commit, si nakala ya faili, na hakuna kinachozuia nakala tofauti za kazi kuelekeza kwenye vielekezi tofauti.
Jinsi ya kuunda nakala ya ziada ya kazi
Muundo wa msingi: git worktree add <njia> [<tawi>]. Tuangalie chaguo kuu.
Kufungua tawi lililopo
cd ~/projects/shop
git worktree add ../shop-main main
Preparing worktree (checking out 'main')
HEAD is now at 3f2c1ab Sasisha README
Kando ya mradi itatokea folda shop-main yenye tawi main. Ingia humo kwa cd ya kawaida na fanya kazi kama katika repo nyingine yoyote.
Kuunda tawi jipya pamoja na nakala ya kazi
git worktree add -b hotfix/payment-timeout ../shop-hotfix main
Bendera -b inaunda tawi hotfix/payment-timeout kutoka main na kulifungua kwenye folda mpya. Bendera -B hufanya hivyo hivyo, lakini ikiwa tawi tayari lipo, inaliweka upya kwenye commit iliyotajwa — itumie kwa tahadhari.
Muundo mfupi
git worktree add ../experiment
Usipotaja tawi, Git itaunda tawi jipya lenye jina la sehemu ya mwisho ya njia (hapa experiment) kutoka HEAD ya sasa. Ikiwa tawi lenye jina hilo tayari lipo, ndilo litakalofunguliwa.
Nakala ya kazi bila tawi
git worktree add --detach ../shop-v1.4 v1.4.0
Hali ya detached HEAD ni nzuri kwa kujenga au kukagua release ya zamani kwa tag bila kuunda matawi ya ziada.
Tawi kutoka kwenye seva ya mbali
git fetch origin
git worktree add ../review-auth feature/auth
Ikiwa tawi la ndani feature/auth halipo lakini kuna tawi moja la mbali origin/feature/auth, Git itaunda tawi la ndani lenye ufuatiliaji — kama katika git switch feature/auth. Ni rahisi kwa kukagua pull request ya mtu mwingine bila kugusa kazi yako.
Jinsi ya kuona na kufuta nakala za kazi
git worktree list
/home/anna/projects/shop a1b2c3d [feature/cart]
/home/anna/projects/shop-hotfix 7e8f9a0 [hotfix/payment-timeout]
/home/anna/projects/shop-v1.4 5d6e7f8 (detached HEAD)
Mstari wa kwanza ni nakala kuu ya kazi (main worktree), nyingine ni zilizounganishwa (linked). Kwa hati za otomatiki kuna matokeo yanayosomeka na mashine: git worktree list --porcelain.
Hotfix ikishaunganishwa, futa nakala:
git worktree remove ../shop-hotfix
git branch -d hotfix/payment-timeout
git worktree remove inafuta folda na rekodi za huduma. Ikiwa kwenye nakala kuna mabadiliko ambayo hayajacommitiwa au faili ambazo hazijafuatiliwa, amri itakataa; ongeza --force tu ukiwa na uhakika kwamba hayahitajiki. Tambua kwamba tawi lenyewe halifutwi, linafutwa kando.
Ikiwa folda ilifutwa kwa mkono
Kufuta folda kwa kidhibiti faili au rm -rf kunaacha rekodi iliyoachwa kwenye .git/worktrees, na tawi linaendelea kuonekana kama lililochukuliwa. Safisha rekodi hizo:
git worktree prune --verbose
Git hufanya hivi mara kwa mara yenyewe wakati wa usafishaji wa takataka, lakini si lazima kusubiri.
Jinsi inavyofanya kazi ndani
Kwenye nakala iliyounganishwa, badala ya folda .git kuna faili .git yenye mstari mmoja:
gitdir: /home/anna/projects/shop/.git/worktrees/shop-hotfix
Kwenye folda hiyo ya huduma kuna data inayomhusu nakala hiyo pekee: HEAD yake, index yake (staging area), na hali zake za merge na rebase. Kila kitu kingine ni cha pamoja: vitu, matawi, tag, seva za mbali, usanidi na hooks.
| Cha kila nakala | Cha pamoja kwa wote |
|---|---|
| HEAD (tawi au commit ya sasa) | Vitu na historia nzima |
| Index (git add) | Matawi ya ndani na ya mbali, tag |
| Merge, rebase, cherry-pick ambazo hazijakamilika | Stash (refs/stash ni ya pamoja) |
| Faili kwenye folda ya kazi | .git/config na hooks |
Kutoka kwenye jedwali hili kuna jambo lisilo dhahiri: git stash list katika nakala yoyote itaonyesha ingizo zilezile. Hii ni nzuri — unaweza kuficha mabadiliko kwenye folda moja na kuyachukua kwenye nyingine.
Kikwazo kikuu: tawi moja, nakala moja ya kazi
Huwezi kufungua tawi lilelile kwenye nakala mbili za kazi. Ukijaribu, Git itajibu kwa kosa kama hili:
git worktree add ../shop-copy feature/cart
fatal: 'feature/cart' is already used by worktree at '/home/anna/projects/shop'
(kwenye matoleo ya zamani ujumbe husema «is already checked out at»). Kikwazo hiki kinalinda dhidi ya hali ambapo commit kwenye folda moja inabadilisha tawi kimyakimya chini ya folda nyingine. Suluhisho: unda tawi jipya kutoka commit ileile (-b), fungua nakala kwa --detach, au ikiwa ni lazima kabisa tumia --force ukijua matokeo yake.
Kwa sababu hiyo hiyo, kwenye folda kuu huwezi kutekeleza git switch main wakati main iko wazi kwenye nakala nyingine.
Mifano ya hali halisi
Hotfix ya dharura katikati ya kipengele
git worktree add -b hotfix/null-price ../shop-hotfix main
cd ../shop-hotfix
# rekebisha, jaribu
git commit -am "Rekebisha kuanguka kwa bei tupu"
git push -u origin hotfix/null-price
cd ../shop
git worktree remove ../shop-hotfix
Kipengele chako ambacho hakijakamilika kimebaki kilivyo, hukuhitaji kuficha chochote kwenye stash, na IDE yenye mradi wazi haikuona hata mabadiliko ya tawi.
Kukagua pull request kwa kuendesha msimbo
Nakala tofauti ya ukaguzi inakuwezesha kujenga na kuendesha tawi la mtu mwingine, kuendesha majaribio, na wakati huo huo kuendelea na kazi yako kwenye dirisha jingine la kihariri.
Kulinganisha tabia ya matoleo mawili
Nakala mbili zenye tag tofauti zinaweza kuendeshwa sambamba kwenye bandari tofauti na kulinganishwa, kwa mfano kasi ya majibu ya API kabla na baada ya uboreshaji.
Majaribio marefu na jenzi
Endesha majaribio kamili kwenye nakala moja na uendelee kuandika msimbo kwenye nyingine — jenzi haitavunjika kwa sababu unabadilisha faili.
Mawakala wa AI wanaofanya kazi sambamba
Ikiwa kazi kadhaa zinafanywa na mawakala au michakato kadhaa, kila mmoja anaweza kupewa nakala yake kwenye tawi lake: hawaingiliani, na matokeo yanaingia moja kwa moja kwenye repo ya pamoja.
Kupanga folda ukitumia worktree kila siku
Ikiwa nakala za kazi unazihitaji kila siku, kubaliana na nafsi yako kuhusu muundo, vinginevyo saraka jirani zitageuka dampo. Mpangilio maarufu ni folda moja ya mradi, ndani yake bare-repo na folda moja kwa kila tawi:
git clone --bare git@example.com:team/shop.git ~/projects/shop/.bare
cd ~/projects/shop
echo "gitdir: ./.bare" > .git
git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
git fetch origin
git worktree add main
git worktree add -b feature/cart feature-cart main
Mstari wa remote.origin.fetch unahitajika kwa sababu bare-clone kwa chaguo-msingi haisanidi ufuatiliaji wa matawi ya mbali. Matokeo: ndani ya ~/projects/shop kuna folda main na feature-cart, kila moja na tawi lake, na hakuna inayokuwa "kuu" kuliko nyingine.
Tabia nyingine nzuri ni kuita folda kwa jina sawa na tawi (kubadilisha kufyeka kuwa kistari). Kisha kwenye matokeo ya git worktree list na kwenye njia ya terminal daima inajulikana ulipo. Mwisho, futa nakala mara tu tawi linapounganishwa: nakala za zamani zinachukua nafasi na kuweka matawi kuwa "yamechukuliwa".
Makosa ya kawaida na mitego
- Utegemezi na jenzi si za pamoja. Kila nakala ni folda tofauti, kwa hiyo
node_modules, mazingira ya virtualenv ya Python,.envna matokeo ya jenzi lazima yaundwe upya. Faili ambazo hazijafuatiliwa hazihamishwi kwenda nakala mpya. - Nakala ndani ya folda kuu. Amri
git worktree add ./hotfixitaunda folda ndani ya mradi, na nakala kuu itaiona kama faili ambazo hazijafuatiliwa. Weka nakala karibu (../) au kwenye saraka tofauti, au ongeza njia kwenye.gitignore. - Folda imehamishwa kwa mkono. Uunganisho utavunjika. Hamisha kupitia
git worktree move ../old ../new, na ikiwa tayari umehamisha — endeshagit worktree repairkwenye folda mpya. - Nakala kwenye diski inayoweza kutolewa inapotea. Ili prune isifute rekodi ya nakala kwenye diski iliyotolewa, ifunge:
git worktree lock --reason "diski ya nje" ../shop-usb. - Moduli ndogo. Usaidizi wa submodules kwenye nakala za kazi ni mdogo; baada ya kuunda nakala, endesha
git submodule update --initna uhakiki matokeo.
Karatasi ya haraka ya git worktree
| Kazi | Amri |
|---|---|
| Kufungua tawi lililopo kwenye folda mpya | git worktree add ../dir branch |
| Kuunda tawi na nakala | git worktree add -b new-branch ../dir main |
| Nakala bila tawi (tag, commit) | git worktree add --detach ../dir v1.0 |
| Orodha ya nakala | git worktree list |
| Kufuta nakala | git worktree remove ../dir |
| Kuondoa rekodi za folda zilizofutwa | git worktree prune |
| Kuhamisha nakala | git worktree move ../dir ../new-dir |
| Kurekebisha miunganisho baada ya kuhamisha | git worktree repair |
| Kulinda dhidi ya prune | git worktree lock ../dir |
git worktree, stash au clone ya pili
| Kigezo | stash | worktree | clone ya pili |
|---|---|---|---|
| Kasi ya kubadili | Haraka, lakini inabadilisha tawi | Papo hapo — ni folda nyingine tu | Papo hapo |
| Nafasi kwenye diski | Kidogo zaidi | Faili za kazi tu | Nakala kamili ya historia |
| Usawazishaji | Hauhitajiki | Hauhitajiki, historia ni ya pamoja | Kupitia push/fetch |
| Kazi sambamba | Hapana | Ndiyo | Ndiyo |
Stash bado ni chaguo bora kwa usumbufu mfupi wa dakika chache. Kwa kila kitu kinachodumu zaidi, au pale unapotaka matoleo mawili wazi kwa wakati mmoja, worktree ni rahisi zaidi.
Hitimisho
git worktree ni njia rahisi ya kufanya kazi na matawi kadhaa kwa wakati mmoja: add huunda folda, list huonyesha, remove na prune husafisha. Historia ni ya pamoja, na HEAD, index na faili za kila nakala ni zake; tawi moja haliwezi kufunguliwa kwenye nakala mbili. Jinsi matawi yanavyofanya kazi na kwa nini kubadili kati yake ni jepesi, tunafundisha kwa vitendo katika kozi ya Git.
Maswali ya mara kwa mara
git worktree ilionekana katika toleo gani la Git?
Amri ilionekana katika Git 2.5 na tangu hapo imeboreshwa, kwa mfano remove na move ziliongezwa baadaye. Katika Git yoyote ya kisasa amri zote zilizoelezwa zinapatikana.
Je, ninaweza kucommit kwenye nakala moja na kuiona kwenye nyingine?
Ndiyo, historia ni ya pamoja. Commit inaonekana mara moja kwenye git log katika nakala yoyote, na inaweza kuunganishwa kwa git merge bila push wala fetch.
Je, IDE inaona nakala nyingi za kazi?
Kwa IDE kila nakala ni folda ya kawaida ya mradi, na inafunguliwa kwenye dirisha tofauti. Wahariri wengi pia huonyesha orodha ya nakala za kazi kwenye kiolesura chao cha Git.
Je, git worktree remove hufuta tawi?
Hapana, inafuta folda na rekodi ya huduma pekee. Tawi lifutwe kando kwa git branch -d.
Je, git worktree inafanya kazi na bare-repo?
Ndiyo, mpangilio maarufu ni kuweka bare-clone na kuunda nakala ya kazi kwa kila tawi kutoka humo, hivyo hakuna folda kuu yenye faili kabisa.
Mada hii inafundishwa kwa kina pamoja na mazoezi katika kozi “Git kutoka mwanzo hadi msanidi programu anayejiweza”.
Nenda kwenye kozi