Koks skirtumas tarp „git reset“ ir „git checkout“?

Aš visada maniau apie git reset ir git checkout kaip tą patį, ta prasme, kad abu grąžina projektą į tam tikrą pataisą. Tačiau manau, kad jie negali būti lygiai tokie patys, kaip būtų nereikalingi. Koks yra skirtumas tarp šių dviejų? Aš šiek tiek painu, nes svn turi svn co grįžti į pataisą.

Pridėta

Šioje diagramoje paaiškinamas skirtumas, nors galbūt pernelyg supaprastintas arba neteisingas. Ką manote? Ar tai neteisinga ar pernelyg supaprastinta?

2019

316
03 сент. set prosseek 03 sept. 2010-09-03 23:21 '10, 23:21, 2010-09-03 23:21
@ 5 atsakymai
  • git reset yra tik apie indekso atnaujinimą , perkeliant HEAD.
  • git checkout yra darbo medžio (indekso ar nurodyto medžio) atnaujinimas. Jis atnaujins HEAD tik jei patikrinsite filialą (jei ne, gausite specialų HEAD ).

Palyginimui, kadangi svn neturi indekso, tik apdorotas svn checkout medis nukopijuoja šią peržiūrą į atskirą katalogą. <ш> Artimiausias git checkout ekvivalentas git checkout :

  • svn update (jei esate toje pačioje šakoje, tai reiškia tą patį SVN URL)
  • svn switch (jei svn switch vieno filialo egzempliorių, bet iš kito SVN saugyklos URL)

Visi šie trys darbo medžio pakeitimai ( svn checkout , update , switch ) turi tik vieną komandą git: git checkout .
Bet kadangi „git“ taip pat turi indekso sąvoką („sustojimo zoną“ tarp repo ir darbo medžio), jūs taip pat turite git reset .


„Thinkeye “ komentaruose nurodo „ Reset Demystified “.

Pavyzdžiui, jei turime dvi šakas: „ master “ ir „ develop “, nurodydami skirtingus įsipareigojimus, o dabar mes esame „ develop “ (todėl HEAD nurodo jį), ir mes vykdome git reset master , „ develop “ dabar nurodys tą patį pranešimą kaip „ master “.

Kita vertus, jei mes paleisime „ git checkout master , develop nejudėti, HEAD . Dabar HEAD nurodys „ master “.

Taigi abiem atvejais perkeliame HEAD norėdami parodyti įsipareigojimą A , tačiau tai, kaip mes tai darome, yra labai skirtingi. reset perkelia HEAD filialą į taškus, perkelkite HEAD į kitą šaką.

2019

134
03 сент. atsakymas pateikiamas VonC 03 sep. 2010-09-03 23:29 '10, 23:29, 2010-09-03 23:29

Paprasčiausia forma reset indeksą neatitinkant darbo medžio, o checkout pakeičia darbinį medį nepaliesdamas indekso.

Atkuria indeksą pagal HEAD , apdorojimo medis lieka ramioje vietoje:

 git reset 

Konceptualiai tai patikrina indeksą darbo medyje. Norint, kad jis iš tikrųjų kažką padarytų, turite naudoti -f , kad jis perrašytų bet kokius vietinius pakeitimus. Tai yra saugumo funkcija, užtikrinanti, kad „be argumentų“ forma nebūtų destruktyvi:

 git checkout 

Kai tik pradedate pridėti parametrus, tiesa, kad yra tam tikras persidengimas.

checkout paprastai naudojamas su filialu, žyma arba įsipareigojimu. Tokiu atveju jis iš naujo nustatys HEAD ir rodyklės indeksą, taip pat atliks indekso patikrinimą darbo medyje.

Be to, jei siunčiate „ reset , galite paprašyti reset perrašyti darbo medį, taip pat iš naujo nustatyti indeksą.

Jei šiuo metu turite filialą, tarp alternatyvaus filialo ar įsipareigojimo yra tarp reikšmių reset ir checkout . reset pakeis esamą filialą į pasirinkto įvykio tašką, o checkout paliks tik dabartinį filialą, bet patikrins išsiųstą filialą arba vietoj jo.

Kitos reset ir commit apima siuntimo maršrutus.

Jei siunčiate kelius, kuriuos norite reset , jūs negalite nustatyti --hard , o reset pakeis tik pateiktos kelio versijos indekso versiją pateiktame įsipareigojime (arba HEAD , jei nenurodysite įsipareigojimo).

Jei siunčiate checkout takus, pvz., reset , jis atnaujina pateiktų kelių indekso versiją pagal numatytą įvykį (arba HEAD ), bet visada patikrins nustatyto kelio indekso versiją darbo medyje.

53
03 сент. Charles Bailey atsakymas 03 Sep. 2010-09-03 23:43 '10, 23:43, 2010-09-03 23:43

Vienas paprastas naudojimo atvejis, kai grąžinamas pakeitimas:
1. Jei norite atšaukti pakeisto failo diegimą, naudokite atstatymą.
2. Jei norite atšaukti pašalinto / pakeisto failo pakeitimus, naudokite kasą.

8
28 янв. John Doe atsakymas Jan 28 2016-01-28 05:54 '16 at 5:54 2016-01-28 05:54

Atlassian suteikia mums puikų paaiškinimą apie „git reset“, „git checkout“ ir todėl git grąžinimus. Šiame straipsnyje paaiškinamos įvairios šių komandų programos įvairiais lygiais - failas, pristatytas momentinis vaizdas ir įsipareigojimas.

https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting

5
21 марта '15 в 18:55 2015-03-21 18:55 atsakymas pateikiamas Rochadsouza kovo 21 d., 15 val. 18:55 2015-03-21 18:55

Abi komandos (reset ir checkout) yra visiškai skirtingos.

checkout X NEGALIMA reset --hard X

Jei X yra šakos pavadinimas, checkout X bus pakeistas dabartiniu filialu ir reset --hard X ne.

3
11 сент. atsakymas pateikiamas wiki1000 Sep 11 2015-09-11 19:01 '15, 19:01, 2015-09-11 19:01

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