git stash: jinsi ya kuweka mabadiliko kando kwa muda na kuyarudisha
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.
| Amri | Inafanya nini | Ingizo kwenye rafu |
|---|---|---|
git stash pop | Inatumia mabadiliko ya mwisho yaliyowekwa kando | Inafutwa ikiwa imetumika bila conflicts |
git stash apply | Inatumia mabadiliko ya mwisho yaliyowekwa kando | Inabakia |
git stash pop stash@{2} | Inatumia ingizo maalum | Inafutwa |
git stash apply --index | Inarejesha pia mgawanyo kati ya index na saraka ya kazi | Inabakia |
$ 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.
| Amri | Kusudi |
|---|---|
git stash show | Takwimu 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 clear | Kufuta 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
- Weka kando kazi yako ya sasa pamoja na mafaili mapya:
git stash push -u -m "kuingia: rasimu". - Hamia tawi kuu na uunde tawi la kurekebisha:
git switch main,git pull,git switch -c hotfix/null-email. - Rekebisha hitilafu, fanya commit, tuma kwa ukaguzi.
- Rudi kwenye kazi yako:
git switch feature/login. - Chukua mabadiliko:
git stash pop. Hakiki kwagit statuskwamba 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 pushhaiitumi. Ukifuta folda ya mradi, stash inapotea. - Kutumia ingizo lisilo sahihi. Kabla ya
pop, angaliagit stash listnagit 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.
Mada hii inafundishwa kwa kina pamoja na mazoezi katika kozi “Git kutoka mwanzo hadi msanidi programu anayejiweza”.
Nenda kwenye kozi