Mwongozo

git stash: jinsi ya kuweka mabadiliko kando kwa muda na kuyarudisha

Imesasishwa: · Skillaria.Top

git stash inatoa mabadiliko ambayo hayajawekwa commit kwenye hifadhi tofauti na kurudisha saraka ya kazi kwenye commit ya mwisho, ili uweze kuhamia kwenye kazi nyingine. Kurudisha mabadiliko tumia git stash pop (kutumia na kufuta kwenye hifadhi) au git stash apply (kutumia na kubakiza); hakuna amri ya git unstash.

Kwa nini git stash inahitajika

Hali ya kawaida: uko katikati ya kazi, mafaili yamebadilishwa, na commit bado ni mapema — kisha wanakuomba urekebishe haraka hitilafu kwenye tawi jingine. Huwezi kuhama, au unaogopa kupoteza mabadiliko. git stash inaweka mabadiliko yote ambayo hayajawekwa commit «mfukoni» na kurudisha saraka ya kazi kwenye hali ya commit ya mwisho.

$ git stash
Saved working directory and index state WIP on feature/login: 3f2a1c4 Fomu ya kuingia

$ git status
On branch feature/login
nothing to commit, working tree clean

Sasa unaweza kuhama, kurekebisha hitilafu, kurudi, na kuchukua ulichoweka kando. Kila hifadhi ni ingizo kwenye rafu ya stash; ndani Git inaihifadhi kama commit maalum, kwa hiyo data ni salama na haitegemei tawi.

Jinsi ya kuhifadhi mabadiliko: chaguo kuu

Kwa maelezo yenye maana

Maelezo ya kawaida «WIP on tawi» hayatakuambia kitu baada ya wiki moja. Yape jina:

git stash push -m "uthibitishaji wa fomu, barua pepe bado haijakamilika"

git stash bila hoja ni kifupi cha git stash push. Fomu ya zamani git stash save "ujumbe" bado inafanya kazi, lakini kwa matumizi mapya tumia push -m.

Pamoja na mafaili mapya

Kwa chaguo-msingi stash inachukua mafaili yanayofuatiliwa tu — yaliyobadilishwa na yaliyoongezwa kwenye index. Mafaili mapya ambayo hayajawahi kuwa kwenye git add yanabaki kwenye saraka ya kazi. Hili ni mshangao wa kawaida.

git stash -u        # --include-untracked: pamoja na mafaili yasiyofuatiliwa
git stash -a        # --all: pamoja pia na yale yaliyo kwenye .gitignore

Kwa -a kuwa makini: node_modules, ujenzi na mipangilio ya ndani pia zitaingia mfukoni. Mara nyingi -u inatosha.

Sehemu tu ya mabadiliko

git stash push -m "usanidi" src/config.js   # mafaili yaliyotajwa tu
git stash -p                                # kuchagua vipande kwa mwingiliano
git stash --staged                          # yaliyo kwenye index tu (Git 2.35+)
git stash --keep-index                      # weka kando yote, lakini acha index kwenye saraka

--keep-index inasaidia kabla ya commit: unabaki na mabadiliko unayotaka ku-commit tu kwenye saraka ya kazi, unaendesha majaribio, na unahakikisha commit inajitosheleza.

Jinsi ya kurudisha mabadiliko (git unstash)

Amri git unstash haipo kwenye Git — hivyo ndivyo watu wanavyotafuta njia ya kurudisha vilivyowekwa kando. Kwa kazi hiyo kuna amri mbili.

AmriInafanya niniIngizo kwenye rafu
git stash popInatumia mabadiliko ya mwisho yaliyowekwa kandoInafutwa ikiwa imetumika bila conflicts
git stash applyInatumia mabadiliko ya mwisho yaliyowekwa kandoInabakia
git stash pop stash@{2}Inatumia ingizo maalumInafutwa
git stash apply --indexInarejesha pia mgawanyo kati ya index na saraka ya kaziInabakia
$ git stash pop
On branch feature/login
Changes not staged for commit:
        modified:   src/auth.js
        modified:   src/form.js
Dropped refs/stash@{0} (8c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d)

Angalia: kwa chaguo-msingi hata kile kilichokuwa kwenye index wakati wa stash kinarudishwa kama mabadiliko ya kawaida. Ikiwa ni muhimu kubakiza index iliyoandaliwa, ongeza --index.

pop au apply

Kwa kazi ya kila siku pop ni rahisi: unachukua na kusahau. apply ichague unapotaka kutumia mabadiliko yale yale kwenye matawi kadhaa, au huna uhakika kwamba yatapita bila tatizo — ingizo litabaki kama tahadhari, na unaweza kulifuta baadaye kwa git stash drop.

Kufanya kazi na orodha ya yaliyowekwa kando

$ git stash list
stash@{0}: On feature/login: uthibitishaji wa fomu, barua pepe bado haijakamilika
stash@{1}: WIP on main: 9b7e0d2 Sasisha utegemezi
stash@{2}: On feature/api: jaribio la akiba

Rafu inafanya kazi kwa kanuni ya «aliyeweka mwisho anatoa kwanza»: stash@{0} daima ni ingizo la hivi karibuni, na namba zinasogea baada ya kila push au drop.

AmriKusudi
git stash showTakwimu fupi za mabadiliko ya ingizo la mwisho
git stash show -p stash@{1}Diff kamili ya ingizo maalum
git stash drop stash@{1}Kufuta ingizo moja
git stash clearKufuta ingizo zote mara moja
git stash branch jina stash@{0}Kuunda tawi kutoka commit ambayo stash ilifanywa, kutumia ingizo na kulifuta

Ili git stash show ionyeshe diff kamili badala ya takwimu, na pia mafaili yasiyofuatiliwa, kuna mipangilio stash.showPatch na stash.showIncludeUntracked.

Mfano wa hatua kwa hatua: hitilafu ya dharura katikati ya kazi

  1. Weka kando kazi yako ya sasa pamoja na mafaili mapya: git stash push -u -m "kuingia: rasimu".
  2. Hamia tawi kuu na uunde tawi la kurekebisha: git switch main, git pull, git switch -c hotfix/null-email.
  3. Rekebisha hitilafu, fanya commit, tuma kwa ukaguzi.
  4. Rudi kwenye kazi yako: git switch feature/login.
  5. Chukua mabadiliko: git stash pop. Hakiki kwa git status kwamba kila kitu kipo.

Siku hizi wengi wanatumia git worktree kwa hali hii: saraka ya pili ya kazi ya hifadhi ile ile inakuwezesha kutoweka kando chochote. Lakini kwa mabadiliko ya dakika tano stash bado ni rahisi zaidi.

Conflicts wakati wa kutumia stash

Ikiwa baada ya stash mistari ile ile ilibadilishwa kwenye tawi, kutumia kutaishia kwa conflict:

$ git stash pop
Auto-merging src/auth.js
CONFLICT (content): Merge conflict in src/auth.js
The stash entry is kept in case you need it again.

Katika hali hii ingizo halifutwi, hata kwa pop. Suluhisha conflict kwenye faili kama kawaida, kisha tekeleza git add kuashiria suluhisho (au git restore --staged kama hutaki mabadiliko yabaki kwenye index), kisha futa ingizo lisilohitajika tena kwa git stash drop.

Ikiwa conflict ni ngumu, kuna njia ya mzunguko: git stash branch tmp-login. Git itaunda tawi kutoka commit ile ile ambayo stash ilifanywa juu yake — hapo mabadiliko yatatumika bila conflicts, na baadaye utayaunganisha na tawi kuu kwa merge ya kawaida.

Jinsi ya kurejesha stash iliyofutwa kwa bahati

Umetekeleza git stash drop au clear kwa makosa — si kila kitu kimepotea. Ingizo lilikuwa commit, na mradi garbage collector haijaiondoa, unaweza kuipata kati ya vitu vinavyoelea (dangling):

git fsck --no-reflog | grep "dangling commit"
git show 8c1d2e3        # hakiki kama hiyo ndiyo stash
git stash apply 8c1d2e3

Ikiwa umefuta ingizo kwa drop au pop hivi punde, hash imechapishwa moja kwa moja kwenye matokeo: kwenye mstari wa Dropped refs/stash@{0} (...). Inatosha kuipitisha kwenye git stash apply.

Stash inavyofanya kazi ndani

Kuelewa muundo kunaondoa hofu ya kupoteza data. Kila ingizo la stash ni commit ya kawaida, ambayo kiashiria cha refs/stash kinaelekeza. Ina wazazi wawili: commit ya HEAD ambayo ulisimama juu yake, na commit tofauti yenye hali ya index. Kwa -u kunaongezwa mzazi wa tatu wenye mafaili yasiyofuatiliwa. Orodha ya stash@{N} ni jarida tu (reflog) la rejeo la refs/stash.

Kutokana na hilo kuna matokeo ya vitendo. Stash inaweza kupewa amri yoyote inayokubali commit: git diff stash@{0}, git show stash@{0}:src/auth.js (yaliyomo ya faili moja kutoka ingizo), au git checkout stash@{0} -- src/auth.js kupata faili moja bila kutumia ingizo lote. Na ingizo lililofutwa linabaki kwenye hifadhidata ya vitu hadi litakapoondolewa na garbage collection.

Stash na amri nyingine za Git

Baadhi ya amri zinaweza kuweka mabadiliko kando zenyewe. git rebase --autostash na git pull --rebase --autostash zinaweka kando mabadiliko yasiyowekwa commit kabla ya kuanza, na kuyarudisha mwishoni. Tabia hii inaweza kuwashwa kudumu kwa rebase.autoStash true na merge.autoStash true. Ikitokea conflict wakati wa kurudisha, Git itaihifadhi kwenye rafu ya kawaida ya stash na kukujulisha.

Kubadili matawi kwa git switch pia hakuhitaji stash kila wakati: ikiwa mabadiliko yako hayagusi mafaili yanayotofautiana kati ya matawi, Git itayabeba nawe. Stash inahitajika pale Git inapojibu «Your local changes would be overwritten by checkout», au pale hutaki kubeba mabadiliko kwenda tawi jingine.

Makosa ya kawaida

  • Mafaili mapya hayakuhifadhiwa. Hayafuatiliwi, unahitaji -u.
  • Stash kama hifadhi ya muda mrefu. Baada ya mwezi kuna WIP kumi bila majina kwenye orodha, na hakuna anayekumbuka zilimo. Kwa kazi ya muda mrefu fanya commit kwenye tawi tofauti — angalau unaweza kuituma kwenye seva.
  • Kusahau kwamba ingizo lilibaki baada ya conflict, na baadaye kulitumia tena. Baada ya kusuluhisha conflict daima fanya drop.
  • Stash haisawazishwi na seva. Inahifadhiwa kwenye hifadhi yako ya ndani pekee, na git push haiitumi. Ukifuta folda ya mradi, stash inapotea.
  • Kutumia ingizo lisilo sahihi. Kabla ya pop, angalia git stash list na git stash show -p.

Muhtasari

git stash ni njia ya haraka ya kufungua saraka ya kazi bila kupoteza mabadiliko ambayo hayajawekwa commit: git stash push -u -m "maelezo" kuweka kando, na git stash pop kurudisha. Tumia apply ukitaka tahadhari, na git stash list pamoja na show -p ili usichanganyikiwe. Usigeuze stash kuwa ghala — kwa kila kitu cha muda mrefu kuna commits na matawi. Kubadilisha kati ya kazi kwa kutumia stash kunafanyiwa mazoezi ya vitendo katika kozi ya Git.

Maswali ya mara kwa mara

Je, inawezekana kutumia stash kwenye tawi jingine?

Ndiyo, stash haifungamani na tawi: hamia kwenye tawi unalotaka na utekeleze git stash pop au apply. Ikiwa mabadiliko hayaendani, utapata conflict ya kawaida.

Je, git stash inahifadhi mabadiliko yaliyo kwenye index?

Ndiyo, lakini kwa pop au apply ya kawaida yote yanarudi kama mabadiliko ambayo hayajaandaliwa. Ili kurejesha pia index, tumia git stash apply --index.

Ninaweza kuhifadhi ingizo ngapi kwenye stash?

Hakuna kikomo kigumu, lakini ingizo zilizo zaidi ya muda wa kuhifadhi wa reflog zinaweza kufutwa na garbage collection. Kwa vitendo weka kwenye rafu si zaidi ya ingizo mbili mpya.

Nawezaje kuweka kando faili moja tu?

Taja njia baada ya alama mbili za kufyeka au moja kwa moja baada ya push: git stash push -m maelezo -- src/config.js. Faili hilo tu ndilo litakaloingia kwenye stash, mabadiliko mengine yakibaki kwenye saraka ya kazi.

Stash inatofautianaje na commit ya muda?

Commit inaishi kwenye tawi, inaweza kutumwa kwenye seva na kurekebishwa baadaye kwa amend au rebase. Stash inahifadhiwa ndani ya kompyuta yako tu kwenye rafu yake, na inafaa kwa kubadili kwa muda mfupi.

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