Mwongozo

git worktree: nakala nyingi za kazi kwenye repo moja bila kuclone upya

Imesasishwa: · Skillaria.Top

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 nakalaCha 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 hazijakamilikaStash (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, .env na matokeo ya jenzi lazima yaundwe upya. Faili ambazo hazijafuatiliwa hazihamishwi kwenda nakala mpya.
  • Nakala ndani ya folda kuu. Amri git worktree add ./hotfix itaunda 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 — endesha git worktree repair kwenye 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 --init na uhakiki matokeo.

Karatasi ya haraka ya git worktree

KaziAmri
Kufungua tawi lililopo kwenye folda mpyagit worktree add ../dir branch
Kuunda tawi na nakalagit worktree add -b new-branch ../dir main
Nakala bila tawi (tag, commit)git worktree add --detach ../dir v1.0
Orodha ya nakalagit worktree list
Kufuta nakalagit worktree remove ../dir
Kuondoa rekodi za folda zilizofutwagit worktree prune
Kuhamisha nakalagit worktree move ../dir ../new-dir
Kurekebisha miunganisho baada ya kuhamishagit worktree repair
Kulinda dhidi ya prunegit worktree lock ../dir

git worktree, stash au clone ya pili

Kigezostashworktreeclone ya pili
Kasi ya kubadiliHaraka, lakini inabadilisha tawiPapo hapo — ni folda nyingine tuPapo hapo
Nafasi kwenye diskiKidogo zaidiFaili za kazi tuNakala kamili ya historia
UsawazishajiHauhitajikiHauhitajiki, historia ni ya pamojaKupitia push/fetch
Kazi sambambaHapanaNdiyoNdiyo

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.

Jifunze mada hii kwa video

Mada hii inafundishwa kwa kina pamoja na mazoezi katika kozi “Git kutoka mwanzo hadi msanidi programu anayejiweza”.

Nenda kwenye kozi