"git rm - cached x" vs "git reset head - x"?

GitRef.org - raktas :

git rm pašalins įrašus iš tiltelio. Tai šiek tiek skiriasi nuo „ git reset HEAD , kuris yra „nestacionarūs“ failai. Iki "disbalanso", aš turiu galvoje, kad jis grįžta į sustojimo vietą, kas buvo ten, kol mes pradėjome keisti dalykus. git rm Kita vertus, jis tiesiog nužudo failą iš etapo visiškai, kad jis nebūtų įtrauktas į kitą, kad užfiksuotumėte vaizdą, tokiu būdu efektyviai ištrinant jį.

Pagal nutylėjimą „ git rm file visiškai pašalins failą iš sustojimo srities, taip pat iš> (darbo katalogo) disko. Jei norite palikti failą darbo kataloge, galite naudoti git rm --cached .

Bet koks skirtumas tarp git rm --cached asd ir git reset head -- asd ?

103
27 апр. nustatė Pacerier balandžio 27 d 2011-04-27 06:13 '11 at 6:13 2011-04-27 06:13
@ 3 atsakymai

Yra trys vietos, kur failas, tarkim, medis, indeksas ir darbo kopija. Kai paprasčiausiai įtraukiate failą į aplanką, įtraukiate jį į darbo kopiją.

Kai darote kažką panašaus į git add file , įtraukiate jį į indeksą. Ir kai tai padarysite, jūs taip pat įtraukiate jį į medį.

Tikriausiai jums padės trys dažniau pažymėtos vėliavėlės iš naujo:

git reset [- <mode> ] [ <commit> ]

Ši forma atkuria dabartinį filialą į <commit> ir galbūt atnaujina indeksą (grąžina jį į <commit> medį) ir darbo medį, priklausomai nuo <mode> , kuris turėtų būti vienas iš šių:
- minkštas

Jis netaikomas indekso rinkmenai ar darbo medžiui (bet jis nukreipia galvą į <commit> , kaip ir visi režimai). Tai palieka visus jūsų pakeistus failus "Pasikeitimai turi būti įvykdyti", kaip sako git statusas.

- sumaišyti

Atkuria indeksą, bet ne darbinį medį (t.y., pakeistos rinkmenos išsaugomos, bet nepažymėtos, kad būtų priskirtos), ir praneša, kad jis nebuvo atnaujintas. Tai yra numatytasis veiksmas.

- sunku

Atkuria indeksą ir darbo medį. Bet kokie stebimų failų pakeitimai į darbo medį su <commit> atmesti.

Dabar, kai darote kažką panašaus į git reset HEAD - tai, ką jūs iš tikrųjų darote, git reset HEAD --mixed , ir indeksas bus pridėtas) Šiuo atveju darbo kopija ir indeksas (arba etapas) buvo sinchronizuoti bet po reset nustatėte sinchronizavimo galvą ir indeksą.

git rm , kita vertus, pašalina failą iš darbo katalogo ir indekso, o taisydamas failą taip pat pašalinamas iš medžio. git rm --cached tačiau pašalina failą tik iš indekso ir saugo jį jūsų darbo kopijoje. Tai yra visiškai priešingas „ git add file . Tokiu atveju nurodėte, kad indeksas skiriasi nuo HEAD, o darbas, kai HEAD turi anksčiau nustatytą failo versiją, darbo kopija yra pakeista, jei yra, arba HEAD failo turinys, ir pašalinote failą iš indekso. Dabar įsipareigojimas sinchronizuos indeksą ir medį, o failas bus ištrintas.

153
27 апр. atsakymą pateikė manojlds 27 balandžio. 2011-04-27 09:14 '11 at 9:14 2011-04-27 09:14

Galbūt pavyzdys padės:

 git rm --cached asd git commit -m "the file asd is gone from the repository" 

prieš

 git reset HEAD -- asd git commit -m "the file asd remains in the repository" 

Atkreipkite dėmesį, kad jei nieko nekeičiate, antrasis pataisymas iš tikrųjų nieko nedarys.

52
27 апр. Greg Hewgill atsakymas balandžio 27 d 2011-04-27 06:19 '11 at 6:19 2011-04-27 06:19

git rm --cached file bus pašalintas iš scenos. Tai reiškia, kad taisydami failą jis bus ištrintas. git reset HEAD -- file paprasčiausiai atkurs tarpinės srities failą į būseną, kurioje jis buvo, kai padarėte HEAD, ty jis atšaukia visus pakeitimus, atliktus nuo paskutinio įsipareigojimo. Jei šis pakeitimas įvyksta pridėjus failą, jie bus lygiaverčiai.

22
27 апр. yuriks atsakymas, pateiktas balandžio 27 d 2011-04-27 06:18 '11 at 6:18 2011-04-27 06:18

Žr. Kitus klausimus apie „ žymes arba užduokite klausimą