Pasirinkite tik vieną failą iš kelių failų, kurie buvo modifikuoti naudojant „Git“?

Kaip galiu pridėti tik vieną iš kelių pakeistų failų mano siūle?

2127
14 июня '10 в 23:52 2010-06-14 23:52 Rachelė yra birželio 14 d., 10 val. 23:52 2010-06-14 23:52
@ 24 atsakymai

Dėmesio

Kaip pažymėta komentaruose, tai viską įkelia į talpyklą, tiek tiek, tiek ir nestacionariai. Indekso raktas paprasčiausiai palieka indeksą tik tada, kai įvykdoma talpykla. Tai gali sukelti konfliktų sujungimą, kai vėliau įdėsite talpyklą.


Tai bus uždaryta visa, kas anksčiau nebuvo pridėta. Tiesiog git add ką norite išsaugoti, tada paleiskite.

 git stash --keep-index 

Pvz., Jei norite nutraukti seną įsipareigojimą keliais pakeitimų rinkiniais, galite naudoti šią procedūrą:

  • git rebase -i <last good commit>
  • Pažymėkite kai kuriuos pakeitimus kaip edit .
  • git reset HEAD^
  • git add <files you want to keep in this change>
  • git stash --keep-index
  • Jei reikia, išspręskite dalykus. Nepamirškite, kad „ git add jokių pakeitimų.
  • git commit
  • git stash pop
  • Pakartokite, jei reikia, pradedant nuo 5.
  • git rebase --continue
1174
01 дек. atsakymas duotas bukzorui 01 d. 2011-12-01 00:28 '11 prie 0:28 2011-12-01 00:28

Taip pat galite naudoti git stash -p . Taigi, galite pasirinkti, kuriuos blokus reikia pridėti prie atributų, taip pat galite pasirinkti visus failus.

Jums bus pasiūlyti keli veiksmai kiekvienam stulpui:

  y - stash this hunk n - do not stash this hunk q - quit; do not stash this hunk or any of the remaining ones a - stash this hunk and all later hunks in the file d - do not stash this hunk or any of the later hunks in the file g - select a hunk to go to / - search for a hunk matching the given regex j - leave this hunk undecided, see next undecided hunk J - leave this hunk undecided, see next hunk k - leave this hunk undecided, see previous undecided hunk K - leave this hunk undecided, see previous hunk s - split the current hunk into smaller hunks e - manually edit the current hunk ? - print help 
2227
31 июля '13 в 14:59 2013-07-31 14:59 atsakymas pateikiamas konrad.kruczynski liepos 31 d., 13 val. 14:59 2013-07-31 14:59

Kadangi git iš esmės yra apie saugyklos turinio ir indekso valdymą (o ne vieną ar daugiau failų), git stash daro sandorius, o ne stebėtinai, su visais darbo katalogais .

Iš tiesų, nuo git 2.13 (2017 m. Antrasis ketvirtis), galite išsaugoti atskirus failus naudodami:

 git stash push [--] [<pathspec>...] 

Išsamesnės informacijos ieškokite „ Failų pakeitimai “.


Pradinis atsakymas (žemiau, 2010 m. Birželio mėn.) Buvo rankiniu būdu pasirinkti, ką norite išsaugoti.

Casebash komentarai:

Tai (originalus „ stash --patch ) yra gražus, tačiau dažnai modifikavau daug failų, todėl naudojant pleistrą erzina

„bukzor“ atsakymas (atnaujintas, 2011 m. lapkričio mėn.) siūlo daugiau praktinio sprendimo, pagrįsto git add + git stash --keep-index .
Eikite, pažiūrėkite ir patvirtinkite savo atsakymą, kuris turėtų būti oficialus (vietoj mano).

Apie šią parinktį chhh reiškia alternatyvią darbo eigą komentaruose:

Turite „ git reset --soft “ po tokio slydimo, kad galėtumėte aiškiai nustatyti:
Norėdami patekti į pradinę būseną - tai yra aiški nustatymo zona ir tik su tam tikrais pasirinktiniais nenustatytais modifikacijomis, galima lengvai atkurti indeksą (nedarydamas nieko panašaus - bukzoras).


(Pradinis atsakymas yra 2010 m. Birželio mėn.: Rankinė talpykla)

Tačiau git stash save --patch gali leisti atlikti dalinį nurašymą po:

Naudodami --patch galite interaktyviai pasirinkti grupes diferencinėje dalyje tarp HEAD ir darbo medžio, kurį norite paslėpti.
Atšaukimo įrašas yra sukurtas taip, kad jo indekso būsena sutaptų su saugyklos indekso būsena, o jo darbo eilutėje yra tik tie pakeitimai, kuriuos pasirinkote interaktyviai. Tada pasirinkti darbo pakeitimai grįš iš darbo linijos.

Tačiau tai išsaugos visą indeksą (kuris gali būti ne tas, ko norite, nes gali būti kitų jau indeksuotų failų) ir dalinė darbo linija (kuri gali atrodyti tokia, kokia norite dygti).

 git stash --patch --no-keep-index 

gali būti geriau.


Jei --patch neveikia, rankinis procesas gali:

Vienam ar daugiau failų tarpinis sprendimas bus toks:

  • nukopijuokite juos už git saugyklos
    (Iš tikrųjų eleotlecram siūlo įdomią alternatyvą )
  • git stash
  • nukopijuokite juos.
  • git stash šiuo metu paslėpti tik norimi failai
  • git stash pop stash@{1} # pakartokite visus jūsų failų pakeitimus.
  • git checkout -- afile # reset file į HEAD turinį prieš bet kokius vietinius pakeitimus

Šio gana sudėtingo proceso pabaigoje turėsite tik vieną ar kelis failus.

161
15 июня '10 в 0:23 2010-06-15 00:23 atsakymą pateikė VonC birželio 15 d. , 10:23, 2010-06-15 00:23

Jei git stash -p (arba git add -p su stash --keep-index ) būtų pernelyg sudėtinga, man buvo lengviau naudoti diff , checkout ir apply :

Jei norite susieti tik tam tikrą failą / režimą:

 git diff path/to/dir > stashed.diff git checkout path/to/dir 

Tada po to

 git apply stashed.diff 
69
12 февр. atsakymas pateiktas mėlyna 12 vas . 2014-02-12 16:44 '14 at 16:44 2014-02-12 16:44

Tarkime, jūs turite 3 failus

 a.rb b.rb c.rb 

ir norite išsaugoti tik b.rb ir c.rb, bet ne a.rb

galite tai padaryti

 # commit the files temporarily you don't want to stash git add a.rb git commit -m "temp" # then stash the other files git stash save "stash message" # then undo the previous temp commit git reset --soft HEAD^ git reset 

Ir viskas yra paruošta! NTN.

39
31 окт. atsakymą pateikė venkatareddy spalio 31 d. 2013-10-31 10:10 '13, 10:10, 2013-10-31 10:10

Kitas būdas tai padaryti yra:

22
05 февр. Atsakymą pateikė Jasper 05 vasaris. 2015-02-05 13:16 '15, 13:16 pm 2015-02-05 13:16

Atnaujinimas (2015 2 14). Aš šiek tiek perrašiau scenarijų, kad galėčiau geriau susidoroti su konfliktų situacijomis, kurios dabar turėtų būti pateiktos kaip konfliktai be sąveikos, o ne su .rej failais.


Aš dažnai manau, kad labiau intuityvus daryti priešingą požiūrį @bukzor. Tai reiškia, kad reikia atlikti tam tikrus pakeitimus, o tada atlikti tik šiuos etapinius pakeitimus.

Deja, „git“ nesiūlo git stash - only-index arba panašių, taigi aš nulaužiau scenarijų.

 #!/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 succeed 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ų.

Kai kuriais atvejais darbo medžio pakeitimai gali priklausyti nuo indekso pokyčių, todėl, keičiant indekso pakeitimus, darbo medžio pakeitimai prieštarauja. Tokiu atveju jūs gaunate įprastus konfliktus be konfliktų, kuriuos galite išspręsti naudodami „git merge / git mergetool“ ir kt.

21
17 июня '13 в 0:00 2013-06-17 00:00 atsakymą pateikė Jėzus Freke birželio 17 d. 13 val. 0:00 2013-06-17 00:00

Kadangi filialų sukūrimas „Git“ yra trivialus, galite tiesiog sukurti laikiną filialą ir patikrinti atskirus jame esančius failus.

15
28 июня '11 в 15:07 2011-06-28 15:07 atsakymas pateikiamas shangxiao birželio 28 d. 11 val. 15:07 2011-06-28 15:07

Naudokite git stash push , pavyzdžiui:

 git stash push [--] [<pathspec>...] 

Pavyzdžiui:

 git stash push -- my/file.sh 

Galima įsigyti 2017 m. Pavasarį išleistą „Git 2.13“.

13
15 авг. atsakymas yra suteiktas sandstrom 15 rug . 2017-08-15 16:10 '17, 4:10 pm 2017-08-15 16:10

Į failą įrašykite šį kodą, pvz., Pavadinimą „ stash . Naudojant stash <filename_regex> . Argumentas yra reguliarus reiškinys visam failo keliui. Pvz., Norėdami užrakinti / b / c.txt, atidėti stash a/b/c.txt arba stash a/b/c.txt stash .*/c.txt ir kt.

 $ chmod +x stash $ stash .*.xml $ stash xyz.xml 

Kodas kopijuoti į failą:

10
11 июля '14 в 21:55 2014-07-11 21:55 atsakymas pateikiamas abrikosų, liepos 14 d., 14 val., 21:55, 2014-07-11 21:55

Tiesiog, jei jūs iš tikrųjų reiškia „atšaukti pakeitimus“, kai naudojatės „Git Stash“ (ir tikrai nenaudokite „Git Stash“ laikinojo saugojimo atveju), tokiu atveju galite naudoti

 git checkout -- <file> 

Atkreipkite dėmesį, kad git stash yra tiesiog paprastesnė ir paprastesnė alternatyva šakojimui ir darbui.

9
19 дек. Devesh atsakė gruodžio 19 d 2014-12-19 14:40 '14, 14:40 2014-12-19 14:40

Su „VonC“ „tarpiniu“ sprendimu kopijuoti failus ne „Git“ saugykloje problema yra ta, kad jūs neteksite informacijos apie takelį, todėl vėliau failų kopijavimas tampa sudėtingesnis.

Lengviau naudoti dervą (panašius įrankius greičiausiai padarysite) vietoj kopijos:

  • tar cvf / tmp / stash.tar kelias / į / kai / failo kelias / į / kai / kitą / failą (... ir tt)
  • „Git Checkout“ kelias / į / kai / failo kelią / į / kai / kitą / failą
  • git stash
  • tar xvf / tmp / stash.tar
  • ir tt (žr. VonC „tarpinį“ pasiūlymą)
7
27 сент. atsakymas pateikiamas eleotlecram 27 sep . 2011-09-27 16:21 '11 at 16:21 2011-09-27 16:21

Kiekvienas atsakymas yra toks sudėtingas ...

Kaip apie tai: "stash":

 git diff /dir/to/file/file_to_stash > /tmp/stash.patch git checkout -- /dir/to/file/file_to_stash 

Jei norite grąžinti failą atgal:

 git apply /tmp/stash.patch 

Tiksli atitiktis, kaip kopijuoti vieną failą ir vėl jį įklijuoti.

6
14 дек. Christophe Fondacci atsakymas 14 d. 2016-12-14 23:19 '16 at 11:19 PM 2016-12-14 23:19

Tai galima padaryti lengvai naudojant 3 žingsnius naudojant „SourceTree“.

  • Laikinai išspręskite viską, ko nenorite slėpti.
  • „Git“ priduria viską ir išsaugo.
  • Įveskite laikinąjį fiksavimą, naudodami git reset, nukreipdami jį į laikinąjį nustatymą.

Visa tai galima padaryti per kelias sekundes „SourceTree“, kur galite tiesiog spustelėti norimus pridėti failus (ar net atskiras eilutes). Pridėję, tiesiog susieti juos su laikinu taisymu. Tada pažymėkite >

6
11 янв. atsakymas į Triynko sausio 11 d 2016-01-11 22:41 '16 at 10:41 pm 2016-01-11 22:41

Kartais aš padariau savo filialo nesusijusius pakeitimus, kol aš jį padariau, ir noriu perkelti jį į kitą filialą ir perkelti jį atskirai (pavyzdžiui, kapitonas). Aš tai darau:

 git stash git checkout master git stash pop git add <files that you want to commit> git commit -m 'Minor feature' git stash git checkout topic1 git stash pop ...<resume work>... 

Atkreipkite dėmesį, kad galima pašalinti pirmąjį stash ir stash pop , galite perkelti visus savo pakeitimus į master filialą, bet tik tada, kai nėra konfliktų. Be to, jei kuriate naują filialą daliniams pakeitimams, jums reikės talpyklos.

Jūs galite ją supaprastinti nesant konfliktų ir naujo filialo:

 git checkout master git add <files that you want to commit> git commit -m 'Minor feature' git checkout topic1 ...<resume work>... 

Deformacija net nereikia ...

6
13 марта '14 в 17:19 2014-03-13 17:19 atsakymas duotas negaliojančiu. 13 d. 14 d., 17:19 2014-03-13 17:19

Norėčiau naudoti git stash save --patch . Interaktyvumo nerandu, nes jos metu galima pasirinkti norimą operaciją visuose failuose.

3
13 апр. Raffi Khatchadourian atsakymas, pateiktas balandžio 13 d 2017-04-13 19:01 '17 at 7:01 pm 2017-04-13 19:01

Esant tokiai situacijai, git add -p (interaktyvus), git commit -m blah ir tada paslėpkite likusį, jei reikia.

2
19 апр. atsakymas pateikiamas J0hnG4lt 19 Bal 2013-04-19 00:10 '13 prie 0:10 2013-04-19 00:10

Kai bandote persijungti tarp dviejų šakų, susidaro tokia situacija.

Pabandykite pridėti failus naudodami „ git add filepath “.

Toliau paleiskite šią eilutę

git stash --keep-index

1
21 июля '15 в 22:26 2015-07-21 22:26 Atsakymą pateikė Sireesh Yarlagadda liepos 21 d. 15 val.

Panaši situacija. Padarė fiksaciją ir suprato, kad tai nėra normalu.

 git commit -a -m "message" git log -p 

Remiantis atsakymais, tai padėjo man.

 # revert to previous state, keeping the files changed git reset HEAD~ #make sure it ok git diff git status #revert the file we don't want to be within the commit git checkout specs/nagios/nagios.spec #make sure it ok git status git diff #now go ahead with commit git commit -a -m "same|new message" #eventually push tu remote git push 
1
20 июня '12 в 9:49 2012-06-20 09:49 Atsakymą pateikė Davidas Hrbáčas birželio 20 d., 12 val. 9:49 2012-06-20 09:49

Nežinau, kaip tai padaryti komandų eilutėje, naudojant tik „SourceTree“. Tarkime, kad pakeitėte failą A ir turite dvi pamainas faile B. Jei norite išsaugoti tik antrąjį failą B faile ir palikti visą kitą nepažeistą, atlikite šiuos veiksmus:

  • Visi etapai
  • Atlikite darbo kopijos pakeitimus, kurie panaikins visus A failo pakeitimus (pvz., Paleiskite išorinį apibrėžimo įrankį ir sukurkite failus.)
  • Padarykite failą B taip, kad būtų taikomas tik antrasis pakeitimas. (pvz., paleiskite išorinį palyginimo įrankį ir atšaukite pirmuosius pakeitimus.)
  • Sukurkite „Piniginę“ naudodami „Pakeisti etapus“.
  • Ne viskas
  • Priimta!
1
30 апр. Juozo Kontvainio atsakymas balandžio 30 d 2015-04-30 14:15 '15, 14:15, 2015-04-30 14:15

Peržiūrėjau atsakymus ir pastabas dėl šio ir daugelio panašių temų. Turėkite omenyje, kad nė viena iš šių komandų yra teisinga, kad galėtumėte nustatyti bet kokius konkrečius stebėtus / neišbandytus failus :

  • git stash -p (--patch) : pasirinkite git stash -p (--patch) rankiniu būdu, išskyrus failus, kurių git stash -p (--patch)
  • git stash -k (--keep-index) : užrašykite visus stebimus / neatkuriamus failus ir išsaugokite juos darbo kataloge
  • git stash -u (--include-untracked) : išsaugokite visus stebimus / neatkuriamus failus
  • git stash -p (--patch) -u (--include-untracked) : git stash -p (--patch) -u (--include-untracked) komanda

Šiuo metu tinkamiausias būdas įrašyti visus failus su / be pėdsakų yra:

  • Laikinai užrakinkite failus, kurių nenorite išsaugoti.
  • Pridėti ir išsaugoti
  • Vieta laikinai įvykdyti

Atsakydamas į kitą klausimą , aš parašiau paprastą šios procedūros scenarijų , ir yra žingsnių, kaip atlikti procedūrą „SourceTree“ čia .

1
22 марта '17 в 7:36 2017-03-22 07:36 atsakymą pateikė ZimbiX kovo 21 d. 17 val. 7:36 2017-03-22 07:36

Neradau atsakymo į tai, ko man reikia, ir tai taip pat paprasta:

 git add -A git reset HEAD fileThatYouWantToStash git commit -m "committing all but one file" git stash 

Tai patikslina vieną failą.

0
27 февр. Sebastiano vasario 27 d. atsakymas . 2017-02-27 11:39 '17 at 11:39 2017-02-27 11:39

Vienas sunkus būdas būtų pirmiausia perduoti viską:

 git add -u git commit // creates commit with sha-1 A 

Atstatyti, grįžti į originalų įsipareigojimą, bet patikrinkite naują failą_one_file:

 git reset --hard HEAD^ git checkout A path/to/the_one_file 

Dabar galite siūti_one_file:

 git stash 

Valymas, išsaugant fiksuotą turinį failų sistemoje, kai grįžtate į pradinį įsipareigojimą:

 git reset --hard A git reset --soft HEAD^ 

Taip, šiek tiek nepatogu ...

0
08 февр. Atsakymą pateikė Martin 08 Feb. 2017-02-08 21:17 '17 - 21:17 2017-02-08 21:17

Sprendimas

Vietiniai pakeitimai:

  • file_A (pakeistas) nepateiktas
  • file_B (pakeistas) nepateiktas
  • file_C (pakeistas) nepateiktas

Jei norite sukurti atributą „my_stash“ su tik failo_C pakeitimais:

 1. git add file_C 2. git stash save --keep-index temp_stash 3. git stash save my_stash 4. git stash pop stash@#{1} 

Padaryta.


Paaiškinimas

  • pridėti failą_C į sustojimo vietą
  • sukurkite piniginę su pavadinimu „temp_stash“ ir išsaugokite pakeitimus faile_C
  • sukurti norimą antspaudą („my_stash“), tik su failo_c pakeitimais
  • taikyti temp_stash (file_A ir file_C) pakeitimus į vietinį kodą ir pašalinkite atributą

Git statusą galite naudoti tarp veiksmų, kad pamatytumėte, kas nutiko.

0
29 марта '17 в 18:04 2017-03-29 18:04 atsakymas pateikiamas Alex 75 kovo 29 '17 18:04 2017-03-29 18:04

Peržiūrėkite kitus klausimus apie „ žymes arba užduokite klausimą