Kodėl yra du būdai ištrinti failą iš git?

Kartais git siūlo git rm --cached išjungtumėte failą, kartais git reset HEAD file . Kada naudoti?

EDIT:

 D:\code\gt2>git init Initialized empty Git repository in D:/code/gt2/.git/ D:\code\gt2>touch a D:\code\gt2>git status # On branch master # # Initial commit # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # a nothing added to commit but untracked files present (use "git add" to track) D:\code\gt2>git add a D:\code\gt2>git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: a # D:\code\gt2>git commit -ma [master (root-commit) c271e05] a 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 a D:\code\gt2>touch b D:\code\gt2>git status # On branch master # Untracked files: # (use "git add <file>..." to include in what will be committed) # # b nothing added to commit but untracked files present (use "git add" to track) D:\code\gt2>git add b D:\code\gt2>git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: b # 
942
03 авг. nustatė Senthess 03 rug . 2011-08-03 00:50 '11 prie 0:50 2011-08-03 00:50
@ 11 atsakymų

git rm --cached <filePath> neištrina failo, bet ištrina failą (-us) iš saugyklos (jei ji jau buvo padaryta anksčiau), bet palieka failą darbo medyje (paliekant jus be priežiūros). failą).

git reset -- <filePath> panaikina visus šio failo (-ų) pakeitimus.

Tačiau, jei naudojote „ git rm --cached , skirtą naujam failui, kuris yra „ git rm --cached , jis atrodytų, kaip ką tik įdiegėte, nes jis niekada nebuvo nustatytas anksčiau.

1581
03 авг. Ryan Stewart atsakymas 03 rugpjūtis 2011-08-03 01:03 '11 at 1:03 2011-08-03 01:03

git rm --cached failas naudojamas failui pašalinti iš indekso. Tuo atveju, kai failas jau yra repo, git rm --cached pašalins failą iš indekso, paliekant jį darbiniame kataloge, o pataisymas taip pat pašalins jį iš repo. Iš esmės po nustatymo neperduosite failo ir neišsaugosite vietos kopijos.

git reset HEAD file (kuris pagal nutylėjimą naudoja „ --mixed flag“) yra kitoks, kai failas jau yra repo, jis pakeičia failo indekso versiją su nuoroda į repo (HEAD), efektyviai, nenaudojant pakeitimų .

border=0

Jei failas nepakeistas, jis atjungs visą failą, nes failas nebuvo HEAD. Šiuo aspektu git reset HEAD file ir git rm --cached pats, bet jie nėra tokie patys (kaip aprašyta failuose, kurie jau yra repo)

Why are there 2 ways to unstage a file in git? - niekada nėra tik vieno būdo padaryti kažką git. tai jo grožis :)

315
03 авг. atsakymas duotas manojlds 03 rug . 2011-08-03 02:00 '11, 2:00, 2011-08-03 02:00

Gana paprasta:

  • git rm --cached <file> sukelia „git“ visiškai sustabdant failą (paliekant jį failų sistemoje, skirtingai nei paprastas „ git rm *“)
  • git reset HEAD <file> atšaukia visus pakeitimus, padarytus faile nuo paskutinio įvykdymo (tačiau nepateikia jų į failų sistemą, priešingai nei nurodo komandų pavadinimas **). Failas lieka versijos valdymo.

Jei failas anksčiau nebuvo įdiegtas versijos valdyme (t. Y. Neformatuojate failo, kurį pirmą kartą git add tik pirmą kartą), tada dvi komandos turi tokį patį poveikį, todėl šių „dviejų būdų daryti kažką ".

* Turėkite omenyje, kad jo atsakyme minimas @DrewT straipsnis dėl git rm --cached failo, kuris anksčiau buvo susietas su saugykla. Šio klausimo kontekste failas ką tik buvo pridėtas ir dar nėra nustatytas, nes jaudintis.

** Bijau blaiviai ilgą laiką, kad galėčiau naudoti git reset komandą dėl savo pavadinimo - ir šiandien aš dažnai pažiūrėsiu į sintaksę, kad įsitikintume, kad aš netampauosi ( atnaujinti ): pagaliau rado laiko apibendrinti „ git reset “ naudojimą TL puslapyje; DR , taigi dabar turiu geresnį psichikos modelį, kaip jis veikia, ir trumpą aprašymą, kai pamiršiu kai kurias detales.)

100
18 окт. Atsakymas pateikiamas 18 val. 2014-10-18 00:16 '14 ne 0:16 2014-10-18 00:16

Ši gija yra šiek tiek senas, bet vis dar noriu pridėti šiek tiek demo, nes tai vis dar nėra intuityvi problema:

 me$ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: to-be-added # modified: to-be-modified # deleted: to-be-removed # me$ git reset -q HEAD to-be-added # ok me$ git reset -q HEAD to-be-modified # ok me$ git reset -q HEAD to-be-removed # ok # or alternatively: me$ git reset -q HEAD to-be-added to-be-removed to-be-modified # ok me$ git status # On branch master # Changes not staged for commit: # (use "git add/rm <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: to-be-modified # deleted: to-be-removed # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # to-be-added no changes added to commit (use "git add" and/or "git commit -a") 

git reset HEAD (be -q ) pateikia įspėjimą apie pakeistą failą, o jo išėjimo kodas yra 1, kuris bus laikomas scenarijaus klaida.

Redagavimas: „ git checkout HEAD to-be-modified to-be-removed taip pat veikia nestabilumui, bet visiškai pašalina pakeitimą iš darbo vietos

40
16 апр. Danielio Alderio atsakymas, pateiktas balandžio 16 d 2013-04-16 22:00 „13, 10 val. 2013-04-16 22:00

jei netyčia įdėjote failus, kurių nenorite padaryti, ir norite būti tikri, kad išsaugosite pakeitimus, galite naudoti:

 git stash git stash pop 

jis atlieka iš naujo nustatymą HEAD ir pakartotinai pateikia pakeitimus, leidžiančius pertvarkyti atskirus failus, kad juos įvykdytų. tai taip pat naudinga, jei pamiršote sukurti funkcijų šaką traukos užklausoms ( git stash ; git checkout -b <feature> ; git stash pop ).

28
10 февр. Ives atsakymas vasario 10 d 2015-02-10 20:06 '15 - 20:06 2015-02-10 20:06

Šios dvi komandos turi keletą subtilių skirtumų, jei šis failas jau yra repo ir kontroliuojamas versijoje (anksčiau įrašyta ir tt):

  • git reset HEAD <file> išjungia failą dabartiniame įvykyje.
  • git rm --cached <file> pat išjungs failą ateityje. Ji neįdiegiama tol, kol ji vėl nebus pridėta su „ git add <file> .

Ir dar vienas svarbus skirtumas:

  • Po to, kai git rm --cached <file> ir spragtelėsite savo filialą nuotoliniame kompiuteryje, kiekvienas, kuris traukia savo filialą iš nuotolinio, gaus failą, kuris ištrinamas iš savo aplanko, nors vietiniame darbo rinkinyje failas tiesiog nustoja žiūrėti ( nėra fiziškai pašalintas iš aplanko).

Šis paskutinis skirtumas svarbus projektams, kuriuose yra konfigūracijos failas, kuriame kiekvienas komandos kūrėjas turi kitokią konfigūraciją (ty kitą bazinį URL, IP arba prievadą), todėl, jei naudojate git rm --cached <file> , traukdami šaką, jūs turite rankiniu būdu iš naujo sukurti konfigūraciją, arba galite juos atsiųsti, ir jie gali jį iš naujo redaguoti atgal į savo „ip“ nustatymus (ir tt), nes trynimas paveikia tik tai, kad žmonės ištraukia jūsų filialą nuotoliniu būdu.

15
10 авг. atsakymas, kurį pateikė DrewT 10 rug . 2014-08-10 23:04 '14, 23:04 2014-08-10 23:04

Tarkime, stage visą katalogą git add <folder> per „ git add <folder> , bet norite pašalinti failą iš fazių sąrašo (t. Y. Sąrašo, kuris generuojamas, kai paleisite „ git status ), ir įrašykite pakeitimus neįtrauktame faile (kažką padarėte ir nesate pasiruošę įsipareigoti, bet nenorite prarasti savo darbo ...). Galite naudoti:

git reset <file>

Kai paleidžiate „ git status , pamatysite, kad bet kuris reset failas yra unstaged , o likę failai, kuriuos added , vis dar yra sąraše.

8
28 авг. atsakymas, kurį pateikė jiminikiz 28 rug . 2015-08-28 19:08 '15, 19:08, 2015-08-28 19:08

1.

 D:\code\gt2>git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: a 

(naudokite „git rm - cached ...“ nestabilumui)

  • git yra rodyklės sistema

  • neturite įsipareigojimo pakeisti rodyklę į

  • Vienintelis būdas „ ištrinti failus iš kibirų, į kuriuos jis nukreipia“, yra ištrinti failus, kuriuos pasakėte, kad peržiūrėtumėte pakeitimus.

2

 D:\code\gt2>git commit -ma [master (root-commit) c271e05] a 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 a 

git įsipareigoti -ma

  • jūs padarėte, išsaugojote

3

 D:\code\gt2>git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: b # 

(naudokite „git reset HEAD ...“, jei norite atsijungti

  • dabar padarėte savo kodą
  • dabar galite atstatyti rodyklę į savo įsipareigojimą atgal į paskutinį įrašymą
7
08 сент. Atsakymas, kurį pateikė Timothy LJ Stewart 08 Sep. 2016-09-08 19:26 '16 at 19:26 pm 2016-09-08 19:26

Nenuostabu, kad niekas paminėjo git reflogą ( http://git-scm.com/docs/git-reflog ):

 # git reflog <find the place before your staged anything> # git reset HEAD@{1} 

„reflog“ yra gitų istorija, kuri ne tik seka repo pakeitimus, bet ir seka naudotojo veiksmus (pvz., ištraukimą, apmokėjimą į kitą filialą ir tt) ir leidžia atšaukti šiuos veiksmus. Todėl vietoj to, kad atmetėte klaidingai sukurtą failą, galite grįžti į tašką, kur nesukūrėte failų.

Tai panaši į git reset HEAD <file> , tačiau kai kuriais atvejais gali būti labiau granuliuota.

Atsiprašome - neatsakydami į jūsų klausimą, bet paprasčiausiai nurodydamas kitą ne stacionarių failų metodą, kurį naudoju gana dažnai (pavyzdžiui, kaip ir Ryan Stewart atsakymai ir labai galingi). Tikiuosi, kad tai padės.

5
10 февр. Atsakymą pateikė Alex vasario 10 d. 2015-02-10 15:06 '15, 15:06 2015-02-10 15:06

Man atrodo, kad git rm --cached <file> pašalina failą iš indekso neištrindamas iš katalogo, kuriame veiks paprastas git rm <file> , kaip OS rm <file> pašalina failą iš katalogo neištrindama jos versijos.

3
06 июня '13 в 15:06 2013-06-06 15:06 atsakymas pateikiamas ernie.cordell birželio 06 d. 13 val. 15:06 2013-06-06 15:06

Jei norite ignoruoti visą katalogą, naudokite rm recursively (-r)

 git rm -r --cached folderpath 
0
18 окт. atsakymas duotas DevWL Oct 18 2017-10-18 22:52 '17, 10:52 pm 2017-10-18 22:52

Kiti klausimai apie žymes arba Ask a question