Kaip pasakyti git tik paslėpti indeksą?

Aš ką tik naudojome „git add -p“, kad pridėtumėte indekso pakeitimų, ir aš ką tik supratau, kad praleidau pakeitimą, kuris turėjo vykti į ankstesnį įvykį.

Dabar negaliu įsipareigoti, nes pridėjau visus šiuos naujus indekso pakeitimus, ir nenoriu naudoti „git reset“, kad pašalintumėte viską iš indekso, nes prireiks jų pridėti atgal.

Man reikia kažko panašaus į „git stash“, kuris tik indeksuos indeksą - jis turėtų palikti darbo rinkmenas. Tada aš galiu kirsti indeksą, pridėti trūkstamų pokyčių, pataisyti, tada iškylančią ir stumti indeksą atgal, kaip jis buvo.

Tai neatrodo, kad git stash gali tai padaryti, bet ar aš kažko trūksta? Ačiū!

40
12 марта '11 в 12:18 2011-03-12 12:18 Malvineous yra nustatytas kovo 12 d. 11 val. 12:18 PM 2011-03-12 12:18
@ 10 atsakymų

Paprasčiausias būdas yra palikti šį pakeitimą dabar, padaryti naują įsipareigojimą ir sukurti antrą, padarytą tik su pakeitimais, kuriuos norite naudoti, kad atliktumėte pakeitimus, ir tada naudokite „ git rebase -i kad ją platintumėte į pradinį HEAD.

Alternatyva būtų padaryti pataisą, pažymėti ją, nuleiskite ją su git reset HEAD^ , pridėkite, kad vienas keisti ir pakeisti HEAD, o tada pažymėtos pataisos vyšnių pasirinkimas.

18
12 марта '11 в 12:24 2011-03-12 12:24 atsakymą pateikė Kevinas Ballardas kovo 12 d., 11 val. 12:24 val. 2011-03-12 12:24

Artimiausias dalykas, kurį radau, yra git stash --patch . Jame vadovaujamasi kiekvienu darbo medžio ir indekso pakeitimu, leidžiančiu jums pasirinkti, ką daryti.

http://www.kernel.org/pub/software/scm/git/docs/git-stash.html

26
13 авг. Leifo Gruenwoldto atsakymas 13 rug . 2012-08-13 22:41 '12, 10:41 val. 2012-08-13 22:41

Ištaisykite savo indeksą, sukurkite pataisymo pataisą ir iš naujo įdiegite naudodami automatinį:

 git commit git add -p # add the change forgotten from HEAD^ git commit --fixup HEAD^ # commits with "fixup! <commit message of HEAD^>" git rebase --autosquash -i HEAD~3 
9
27 февр. atsakymą pateikė vartotojo1338062 vasario 27 d 2013-02-27 20:33 '13, 20:33, 2013-02-27 20:33

1 sprendimas:

Kodėl gi ne apgauti?

 git stash --keep-index 

gauti viską iš ten, kuris dabar nėra rodyklėje. Tada

 git stash 

gauti talpyklą tik su tuo, kas buvo organizuota.

 git stash pop 

Pirmiausia palieskite, pridėkite pakeitimus. Tada

 git commit --amend ... git reset --hard 

išvalyti darbo medį ir tada

 git stash pop --index 

grąžinti indekso pakeitimus.

5
19 янв. Atsakymas pateikiamas doleriui 19 d 2017-01-19 21:40 '17, 21:40 2017-01-19 21:40

Atrodo, kad tai veikia. Aš ne visais atvejais išbandžiau, kad įsitikintumėte, jog tai patikima:

 git commit -m _stash  git stash  git reset HEAD^  git stash save  git stash pop stash@{1} 

Tačiau jis faktiškai fiksuoja indeksą laikinai, vėluoja darbo katalogą, grąžina įsipareigojimą grąžinti indeksą, išsaugo jį kaip kitą talpyklą ir tada vėl atkuria pradinį darbo katalogą.

Tai supaprastinama pridedant ją kaip „git“ slapyvardį:

 [alias] istash = "!f() { git commit -m _stash  git stash  git reset HEAD^  git stash save $1  git stash pop stash@{1}; }; f" 

Tai leidžia man jį naudoti kaip:

 git istash [optional stash name] 
5
14 окт. atsakymas pateikiamas Oli 14 okt. 2016-10-14 01:40 '16 at 1:40 2016-10-14 01:40

git stash faktiškai sukuria įsipareigojimą su indekso turiniu ir po to prideda įsipareigojimą su visų stebimų failų turiniu.

Jei norite peržiūrėti: sukurkite atributą ir paleiskite

 git log --oneline --graph stash@{0} 

Taigi, techniškai, kai jūs užklijuojate, indeksą galite sugrąžinti per stash@{0}^2 :

 $ git show --name-only stash@{0}^2 $ git checkout stash@{0}^2 -- . 

Taip pat galite užprogramuoti ir gauti failų turinį su stebėjimu, bet nepridėta:

 # get the diff between what was indexed and the full stashed content : $ git diff -p stash@{0}^2 stash@{0} > diff.patch # apply this diff : $ git apply diff.patch 
5
16 февр. LeGEC atsakymas, pateiktas vasario 16 d. 2017-02-16 11:42 '17 at 11:42 2017-02-16 11:42

magit for emacs leidžia tai padaryti su komandų magit-stash-index

4
24 сент. atsakymas duodamas imalison 24 sep . 2017-09-24 12:58 '17, 12:58 pm 2017-09-24 12:58

Aš turėjau tai padaryti, ir galų gale aš naudojome kai kuriuos git stash scenarijus. „Git“ kūrimas Atidarant stash'ą, galite sukurti (bet netaikyti) Atlicinātį objektą (kuriame yra indeksas). „Git Stash“ parduotuvė prideda ją prie git stash stack, nepadarydama git reset -hard, kad git taupymo žymės yra numanomos. Tai leis jums pridėti indeksą pridedant stash objektą į steką ir iš naujo nustatant indeksą rankiniu būdu:

 # This will add an entry to your git stash stack, but *not* modify anything git stash store -m "Stashed index" $(git stash create) # This will reset the index, without touching the workspace. git reset --mixed 

Dabar jūs veiksmingai paslėpėte savo indeksą ir galite padaryti „git stash pop -index“, kai baigsite.

Vienas iš įspėjimų yra tai, kad sukurtas statistikos objektas apima abu darbinėje erdvėje modifikuotus failus ir indeksą, nors esate tik susirūpinę dėl indekso, todėl kyla konfliktų galimybė, kai bandote iškarpyti iš kamino, nors naudojote - indeksas (tai reiškia, kad „taip pat taiko indeksą iš piniginės“, o ne „naudoti indeksą tik iš piniginės“). Tokiu atveju prieš pasirodant galite atlikti „git reset --hard“ (nes atstatomi pakeitimai taip pat sutampa su pakeitimais, kuriuos iškyla arba taikomi iškart po to; ne taip pavojingi, kaip atrodo.)

1
12 янв. atsakymas driusan Jan 12 2016-01-12 05:23 '16 ne 5:23 AM 2016-01-12 05:23
 git stash -k git stash git stash apply stash@{1} git stash drop stash@{1} 
0
05 дек. Atsakymą pateikė user9058026 05 Dec. 2017-12-05 21:56 '17 21:56 2017-12-05 21:56

Čia yra šiek tiek scenarijaus, kurį turėjau daryti su tuo anksčiau:

(Pastaba: Aš iš pradžių paskelbiau ją „ ngn-wiki.ru.site/questions/410 / ...“ , tačiau atrodo, kad tai tinka.

 #!/bin/sh # first, go to the root of the git repo cd `git rev-parse --show-toplevel` # create a commit with only the stuff in staging INDEXTREE=`git write-tree` INDEXCOMMIT=`echo "" | git commit-tree $INDEXTREE -p HEAD` # create a child commit with the changes in the working tree git add -A WORKINGTREE=`git write-tree` WORKINGCOMMIT=`echo "" | git commit-tree $WORKINGTREE -p $INDEXCOMMIT` # get back to a clean state with no changes, staged or otherwise git reset -q --hard # Cherry-pick the index changes back to the index, and stash. # This cherry-pick is guaranteed to suceed git cherry-pick -n $INDEXCOMMIT git stash # Now cherry-pick the working tree changes. This cherry-pick may fail # due to conflicts git cherry-pick -n $WORKINGCOMMIT CONFLICTS=`git ls-files -u` if test -z "$CONFLICTS"; then # If there are no conflicts, it safe to reset, so that # any previously unstaged changes remain unstaged # # However, if there are conflicts, then we don't want to reset the files # and lose the merge/conflict info. git reset -q fi 

git-stash-index scenarijų galite išsaugoti kaip git-stash-index kažkur jūsų kelio pusėje ir tada jį pavadinti kaip git stash-index

 # <hack hack hack> git add <files that you want to stash> git stash-index 

Stash'e dabar yra naujas įrašas, kuriame yra tik atlikti pakeitimai, ir jūsų darbo medyje vis dar yra nenurodytų pakeitimų.

Pagrindinis klausimas yra tas, kad, pavyzdžiui, negalite ištrinti ištrintų indeksuotų pakeitimų. jei darbo medyje yra pokyčių, priklausomai nuo indeksuotų pokyčių.

Tokiu atveju bet kokie tokie konfliktai bus palikti įprastoje nepareikalautoje konflikto būsenoje taip pat, kaip tai įvyko po vyšnių / sujungimų.

Pavyzdžiui.

 git init echo blah >> "blah" git add -A git commit -m "blah" echo "another blah" >> blah git add -A echo "yet another blah" >> blah # now HEAD contains "blah", the index contains "blah\nanother blah" # and the working tree contains "blah\nanother blah\nyetanother blah" git stash-index # A new stash is created containing "blah\nanother blah", and we are # left with a merge conflict, which can be resolved to produce # "blah\nyet another blah" 
0
15 февр. JesusFreke atsakymas, pateiktas vasario 15 d. 2015-02-15 03:33 '15 at 3:33 2015-02-15 03:33

Peržiūrėkite kitus klausimus „ žyma arba užduoti klausimą