Koks skirtumas tarp git reset --mixed, --soft ir --hard?

Noriu padalinti įsipareigojimą ir nesu įsitikinęs, kokia iš naujo nustatyti parinktį naudoti.

Stebėjau puslapį, ar galite paaiškinti, ką git reset daro paprastu anglų kalba ?, Bet aš supratau, kad nesuprantu, kas yra indeksas ar git, todėl paaiškinimai nepadėjo.

Be to, naudodamiesi - --mixed ir --mixed naudojimo atvejų man taip pat atrodo šis atsakymas (kai norite ištaisyti ir patvirtinti.) Ar kas nors gali jį sugadinti? Aš suprantu, kad --mixed tai turbūt yra galimybė, bet aš noriu žinoti, kodėl. Galiausiai, ką apie --hard ?

Ar kas nors gali pateikti darbo eigos pavyzdį, kaip pasirinkti 3 parinktis?

544
20 авг. nustatė Michael Chinen 20 rug. 2010-08-20 07:41 '10, 7:41 val. 2010-08-20 07:41
@ 11 atsakymų

Pakeitus failą savo saugykloje, pakeitimas iš pradžių nėra atliktas. Norėdami tai išspręsti, turite ją įvykdyti, ty pridėti jį prie indekso - naudodami git add . Kai įsipareigojate, tie indekso pakeitimai, kurie buvo įtraukti į indeksą.

git reset pakeičia bent jau esamą šaką ( HEAD ). Skirtumas tarp --mixed ir --mixed yra tai, ar jūsų indeksas keičiamas. Taigi, jei mes esame master filiale su šia įsipareigojimų serija:

 - A - B - C (master) 

HEAD nurodo C ir indeksas atitinka C

Kai paleidžiame git reset --soft B , master (ir todėl HEAD ) dabar nukreipia į B , bet indeksas vis dar keičiasi nuo C ; git status parodys juos kaip pristatytus. Todėl, jei šiuo metu mes vykdome git commit , mes gausime naują įsipareigojimą su tais pačiais pakeitimais kaip ir C


Gerai, todėl vėl pradėkite čia:

 - A - B - C (master) 

Dabar leiskite git reset --mixed B (Pastaba: numatytasis variantas yra --mixed ). Vėlgi, master ir HEAD nurodo į B, bet šį kartą indeksas taip pat keičiamas pagal B Jei šiuo metu mes vykdome git commit , nieko neįvyks, nes indeksas atitinka HEAD . Mes vis dar turime darbų katalogo pakeitimus, tačiau kadangi jie nėra rodyklėje, „ git status rodo juos kaip nestacionarius. Norėdami juos išspręsti, jums reikės git add ir tada paleisti, kaip įprasta.


Galiausiai, „ --hard pats, kaip „ --mixed (jis pakeičia jūsų HEAD ir indeksą), išskyrus tai, kad „ --hard taip pat keičia jūsų darbo katalogą. Jei mes esame C ir paleidžiame git reset --hard B , tada pakeitimai, įtraukti į „ C , taip pat bet kokie neprivalomi pakeitimai, kuriuos jūs padarysite, bus ištrinti, o darbo kopijoje esantys failai atitiks „ B Kadangi tokiu būdu jūs galite prarasti pakeitimus visam laikui, prieš paleisdami iš naujo, visuomet turėtumėte paleisti „ git status , kad įsitikintumėte, jog jūsų darbo katalogas yra švarus, arba kad esate gerai, praradę nekeisti pakeitimus.


Galiausiai vizualizacija: 2019

1112
20 авг. Atsakymą pateikė mkarasek 20 rug . 2010-08-20 08:53 '10 8:53 val. 2010-08-20 08:53

Atminkite, kad tai supaprastintas paaiškinimas, skirtas pirmajam šio sudėtingos funkcijos paieškos etapui.

Gali būti naudinga tiems žiūrovams, kurie nori vizualizuoti, kaip jų projekto būklė atrodo po kiekvienos iš šių komandų:


Tiems, kurie naudoja spalvotą terminalą (git config --global color.ui auto):

git reset --soft A ir pamatysite, kad elementai B ir C yra žalūs (nustatyti ir paruošti tvirtinti)

git reset --mixed A (arba git reset A ), ir jūs pamatysite elementus B ir C raudonai (nestacionarūs ir pasiruošę nustatyti (žalia)) ir tada baigsite

border=0

git reset --hard A , ir jūs nebebus matomi B ir C pakeitimai bet kur (tai bus tarsi jie niekada nebūtų buvę)


Arba tiems, kurie naudoja GUI programą, pvz., „Tower“ arba „SourceTree“

git reset --soft A ir pamatysite, kad „pristatytų failų“ srityje elementai B ir C yra paruošti fiksuoti

git reset --mixed A (arba git reset A ) ir matysite elementus B ir C „išdiegtų failų“ srityje, paruoštus faziniam perkėlimui ir tada nustatysite

git reset --hard A , ir jūs nebebus matomi B ir C pakeitimai bet kur (tai bus tarsi jie niekada nebūtų buvę)

62
21 нояб. atsakymą pateikė Timhc22 lapkričio 21 d. 2014-11-21 15:06 '14, 15:06 2014-11-21 15:06

Paprasčiau tariant:

  • --soft : nekomerciniai pakeitimai, pakeitimai paliekami etapais (indeksas).
  • --mixed (numatytasis): nesikeičiantys + nestabilūs pakeitimai, pakeitimai lieka darbo medyje.
  • --hard : --hard + unstage + ištrinti pakeitimus, nieko paliekama.
31
25 апр. Atsakymą pateikė Mo Ali balandžio 25 d. 2018-04-25 15:30 '18 15:30 2018-04-25 15:30

Čia yra pagrindinis „TortoiseGit“ naudotojų paaiškinimas:

git reset --soft --mixed ir --mixed palikite savo failus nepažeistus.

git reset --hard tikrai pakeisti savo failus pagal įsipareigojimą jūs iš naujo.

„TortoiseGit“ rodyklės sąvoka yra labai paslėpta grafinėje sąsajoje. Pakeitus failą, nereikia paleisti „ git add norite pridėti pakeitimų, susijusių su sustojimo zona / indeksu. Tiesiog pakeitus esamus failus, kurie nekeičia failų pavadinimų, git reset --soft --mixed ir --mixed patys! Pastebėsite skirtumą, jei pridėjote naujus failus arba pervardėte failus. Tokiu atveju, jei paleidžiate git reset - mišrią, turėsite iš naujo įtraukti failą iš sąrašo, kurio negalima laikyti.

19
28 окт. James Lawruk atsakymas, pateiktas spalio 28 d 2014-10-28 23:38 '14, 23:38, 2014-10-28 23:38

Tokiais atvejais man patinka vizualus, kurį tikiuosi paaiškinti:

git reset --[hard/mixed/soft] :

2019

13 сент. Atsakymą pateikė Tomer Ben David rugsėjo 13 d 2018-09-13 19:39 '18, 07:39 pm 2018-09-13 19:39

Trumpas atsakymas yra tas, kuriame kontekste naudojami 3 variantai:

Jei norite išsaugoti dabartinius kodo pakeitimus , bet perrašyti įsipareigojimo istoriją:

  • soft : galite viską padaryti iš karto ir sukurti naują įvykį su nauju aprašymu (jei naudojate torotizės gitą ar kitas grafines sąsajas, tai yra tas, kurį naudojate, nes galite pažymėti, kuriuos failus norite priskirti ir padaryti kelis įsipareigojimus. „Sourcetree“ programoje visi failai bus perduoti įvykdyti.)
  • mixed : prieš įtraukdami į indeksą reikės dar kartą pridėti atskirus failus (visi modifikuoti failai „Sourcetree“ bus neaktyvūs)

Faktiškai prarandant kodo pakeitimus :

  • hard : jūs ne tik perrašote istoriją, bet ir prarandate visus pakeitimus iki taško, kurį nustatėte iš naujo
1
14 июля '17 в 12:20 2017-07-14 12:20 atsakymas pateikiamas Nickpick liepos 14 d., 17 val. 12:20 2017-07-14 12:20

Prieš pereinant prie šių trijų variantų, turite suprasti tris dalykus.

1) Istorija / HEAD

2) etapas / indeksas

3) Darbo katalogas

reset --soft: pakeista istorija, pakeistas HEAD, darbo katalogas nepasikeitė.

reset --mixed: pasikeitė istorija, pakeistas HEAD, darbo katalogas pakeistas nenurodytomis duomenų bazėmis.

reset --hard: istorija pasikeitė, HEAD pasikeitė, darbo katalogas pasikeitė prarastais duomenimis.

Visada saugu dirbti su „Git“. Sudėtingame reikalavime turėtų būti naudojamas kitas variantas.

1
14 нояб. atsakymą pateikė Suresh Sharma lapkričio 14 d. 2017-11-14 14:32 '17 at 14:32 2017-11-14 14:32

--soft : pasakoja, kad Git iš naujo nustatys HEAD, kad kitas įvykdytų, todėl indeksas ir darbo katalogas nebus keičiami. Visi failai, keisti tarp pradinio HEAD ir įsipareigojimo, bus pateikti.

--mixed : lygiai taip pat, kaip ir programinė įranga, ji grąžins HEAD į kitą. Jis taip pat atkurs indeksą, kad jis atitiktų, o darbo katalogas nebus paveiktas. Visi pakeitimai liks darbo kataloge ir pasirodys kaip modifikuoti, bet neparengti.

--hard : Tai viskas viskas - jis nuleidžia HEAD atgal į kitą --hard , atstato indeksą, kad jis atitiktų, ir grąžina darbo katalogą, kad jis atitiktų.

Pagrindinis skirtumas tarp --mixed ir --mixed yra tai, ar - indeksas, ar ne jūsų indeksas. Sužinokite daugiau apie tai čia .

1
29 мая '18 в 13:18 2018-05-29 13:18 atsakė Nesha Zoricui gegužės 29 d. 18 val. 18:18 2018-05-29 13:18

Jums nereikia priversti prisiminti skirtumų tarp jų. Pagalvokite, kaip iš tikrųjų padarėte įsipareigojimą.

1. Atlikite keletą pakeitimų.

2.git pridėti.

3.gc -m "Aš kažką padariau"

„Soft“, „Mixed“ ir „Hard“ yra būdas atsisakyti operacijų, kurias atlikote nuo 3 iki 1.

Minkštas „apsimeta“, kad niekada nematytų, ką darėte „gc -m“.

Mišrus „apsimeta“, kad niekada nematytų, ką darėte.

Sunku „apsimesti“, kad niekada nematytumėte, jog pakeitėte failą.

0
14 дек. Atsakymas pateikiamas qinmu2127 gruodžio 14 d. 2018-12-14 16:10 '18, 4:10 pm 2018-12-14 16:10

Pagrindinis skirtumas tarp įvairių git reset komandos parinkčių yra parodyta žemiau.

  • --soft: atstato HEAD į pasirinktą įvykį. Jis veikia iš esmės tokį patį kaip git checkout, bet nesukuria atskiros galvos būsenos.
  • --mixed (numatytoji parinktis): atstata antraštę į įvykį, kurį pasirinkote istorijoje, ir atmeta indekso pakeitimus.
  • --hard: atstato antraštę į įvykį, kurį pasirinkote istorijoje, pašalinsite indekso pakeitimus ir pašalinsite pakeitimus savo darbo kataloge.
0
21 мая '18 в 7:27 2018-05-21 07:27 atsakė Viššui Abhankarui gegužės 21 d. 18 val

Atsakymas yra puikus, paprastais žodžiais galime pasakyti ...

  • git reset --soft : nustatykite HEAD numatyto įsipareigojimo vertei, bet išsaugokite pakeitimus, git reset --soft nuo paskutinio įsipareigojimo
  • git reset --mixed : tas pats, kaip git reset --soft bet vienintelis skirtumas yra tas, kad jis git reset --soft po pakeitimų po paskutinių įvykių
  • git reset --hard : nustatykite HEAD nurodytam įsipareigojimui ir atsisakykite visų pakeitimų, susijusių su naujausiais įsipareigojimais, įskaitant tuos, kurie nebuvo padaryti.
0
22 июня '18 в 14:16 2018-06-22 14:16 atsakymą pateikė Vivek Maru birželio 22 d. 18 val. 16:16 2018-06-22 14:16

Kiti klausimai apie „ žymes arba „ Užduoti klausimą“