Kaip atšaukti „git add“ prieš įsipareigojant?

Klaidingai pridėjau failus, kad galėčiau gauti komandą:

 git add myfile.txt 

Aš dar git commit . Ar galima tai atšaukti, kad šie failai nebūtų įtraukti į įsipareigojimą?


Šiuo metu yra 48 atsakymai (kai kurie ištrinti). Jei neturite naujos informacijos, pridėkite naują.

7856
08 дек. nustatė paxos1977 08 dec. 2008-12-08 00:57 '08 at 0:57 2008-12-08 00:57
@ 34 atsakymai
  • 1
  • 2

Galite atšaukti „ git add prieš įsipareigodami

 git reset <file> 

kuris pašalins jį iš dabartinio indekso („artėjančio įsipareigojimo“ sąrašo) nekeičiant nieko kito.

Galite naudoti

 git reset 

be jokių failo pavadinimų, kad išjungtumėte visus pakeitimus. Tai gali būti naudinga, kai per daug failų yra pateikiami po vieną per protingą laiką.

Senesnėse „Git“ versijose aukščiau nurodytos komandos yra lygiavertės „ git reset HEAD <file> ir „ git reset HEAD ir nebus sėkmingos, jei HEAD yra neapibrėžta (nes nepadarėte jokio įsipareigojimo savo repo) arba dviprasmiška (nes sukūrėte filialą su pavadinkite HEAD , kuris yra kvailas dalykas, kurį neturėtumėte daryti). Tai buvo pakeista „Git 1.8.2“ , nors šiuolaikinėse „Git“ versijose, prieš kurdami pirmąjį įsipareigojimą, galite naudoti šias komandas:

„git reset“ (be parametrų ar parametrų), naudojamų jums, neturi jokių įsipareigojimų savo istorijoje, bet dabar jis suteikia jums tuščią indeksą (kad atitiktų neegzistuojančius įsipareigojimus, jūs net neįtraukėte).

8850
08 дек. atsakymas duotas genehack 08 dec. 2008-12-08 01:30 '08, 1:30, 2008-12-08 01:30

Norite:

 git rm --cached <added_file_to_undo> 

Loginis pagrindas:

Kai buvau naujas, aš pirmą kartą bandžiau

 git reset . 

(jei norite atšaukti visus mano pradinius įkėlimus), tik norint gauti šį (ne labai) naudingą pranešimą:

 fatal: Failed to resolve 'HEAD' as a valid ref. 

Pasirodo, kad tai yra todėl, kad nuoroda HEAD (filialas?) Egzistuoja tik po pirmojo įsipareigojimo. Tai reiškia, kad susidursite su ta pačia naujokų problema, kaip man, jei jūsų darbo eiga, pvz., Mano, atrodys taip:

  1. Eikite į mano naująjį projektų katalogą, kad išbandytumėte naująjį „Git“
  2. git init
  3. git add.
  4. git status

    ... daug šūdų slinkimų ...

    > Damn, aš nenorėjau visa tai pridėti.

  5. „Google“ atšaukti „git add“

    => rasti stekų perpildymą - ooh

  6. git reset.

    => mirtinas: Nepavyko išspręsti „HEAD“ kaip galiojančios nuorodos.

Be to, paaiškėja, kad platinimo sąraše yra užregistruotas klaidos pranešimas .

Ir kad teisingas sprendimas ten buvo „Git“ būsenos išvestyje (kuris, taip, aš vadinu „šūdą“)

border=0
 ... # Changes to be committed: # (use "git rm --cached <file>..." to unstage) ... 

Ir sprendimas iš tikrųjų yra naudoti „ git rm --cached FILE .

Atkreipkite dėmesį, kad kitur čia esantys įspėjimai - „ git rm pašalina jūsų vietinę darbo kopiją, bet ne, jei naudojate „ cached“ . Čia yra git help rm :

- cached Naudokite šią parinktį, jei norite pašalinti ir pašalinti kelius tik iš indekso. Darbastalio bylos, pakeistos arba ne, išliks.

Aš pradedu naudoti

 git rm --cached . 

ištrinkite viską ir pradėkite. Jis neveikė, nes, nors ir add. yra rekursinis, paaiškėja, kad rm reikia -r rekursijai. Sigh

 git rm -r --cached . 

Gerai, dabar aš grįžau į ten, kur pradėjau. Kitą kartą, kai ketinu naudoti -n , naudosite -n paleisti ir pamatysite, kas bus pridėta:

 git add -n . 

Viskas archyvavusi saugioje vietoje, prieš pasitikėdama „ git help rm sakydama, kad - „ --cached “ nieko nesunaikina (ir ką daryti, jei parašiau jį neteisingai).

2013 m
25 марта '09 в 19:20 2009-03-25 19:20 Rabarbaras atsakymą pateikė kovo 25 d., 09:19, 2009-03-25 19:20

Jei įvedate:

 git status 

„git“ pasakys, kas atsiskaito ir tt, įskaitant instrukcijas, kaip atsijungti:

 use "git reset HEAD <file>..." to unstage 

Manau, kad git daro gana gerą darbą, kuris verčia mane daryti teisingą dalyką šiose situacijose.

Pastaba Naujausi „git“ (1.8.4.x) versijos pakeitė šį pranešimą:

 (use "git rm --cached <file>..." to unstage) 
498
08 дек. Atsakymą pateikė Paul Beckingham 08 dec. 2008-12-08 02:22 '08 at 2:22 am 2008-12-08 02:22

Norėdami paaiškinti: „ git add perkelia pakeitimus iš dabartinio darbo katalogo į tarpinę sritį (indeksą).

Šis procesas vadinamas tarpiniu. Taigi, natūraliausia komanda keisti pakeitimus (pakeistus failus) yra akivaizdi:

 git stage 

git add yra tik „ git stage pseudonimas

Gaila, kad nėra git unstage ir git unadd . Atitinkamas klausimas yra sunkiau atspėti ar prisiminti, bet gana akivaizdus:

 git reset HEAD -- 

Šiam tikslui galime lengvai sukurti slapyvardį:

 git config --global alias.unadd 'reset HEAD --' git config --global alias.unstage 'reset HEAD --' 

Galiausiai, turime naujų komandų:

 git add file1 git stage file2 git unadd file2 git unstage file1 

Asmeniškai aš naudoju net trumpesnius slapyvardžius:

 git a #for staging git u #for unstaging 
232
10 сент. Atsakymas užtrunka 10 rugsėjo. 2010-09-10 23:28 '10, 23:28, 2010-09-10 23:28

Be priimtino atsakymo, jei jūsų klaidingai pridėtas failas buvo didžiulis, tikriausiai pastebėsite, kad netgi pašalinus jį iš indekso naudojant „ git reset “, jis vis tiek vyksta .git kataloge. Jūs neturėtumėte jaudintis, failas tikrai yra saugykloje, bet tik kaip „laisvas objektas“, jis nebus nukopijuotas į kitas saugyklas (per kloną, stumti), o erdvė galiausiai bus išlaisvinta - nors galbūt netrukus . Jei nerimaujate, galite paleisti:

 git gc --prune=now 

Atnaujinimas (toliau bandysiu pašalinti tam tikrą painiavą, kuri gali kilti dėl atsakymų su didžiausiu balsų skaičiumi):

Taigi, koks yra tikrasis git add atšaukimas ?

git reset HEAD <file> ?

arba

git rm --cached <file> ?

Griežtai kalbant, ir jei aš neklystu: ne .

git add negalima atšaukti - saugiai, apskritai.

Pirmiausia prisiminkime, ką git add <file> iš tikrųjų:

  1. Jei <file> anksčiau nebuvo stebėtas , „ git add prideda jį prie talpyklos su dabartiniu turiniu.

  2. Jei <file> jau stebimas , „ git add išsaugo esamą turinį (momentinį vaizdą, versiją) į talpyklą. „GIT“ šis veiksmas vis dar vadinamas pridėti (ir ne tik atnaujinti), nes dvi skirtingos failo versijos (fotografijos) yra traktuojamos kaip du skirtingi elementai: todėl prie talpyklos pridedame naują elementą, kad jis būtų atliktas vėliau.

Atsižvelgiant į tai, klausimas yra šiek tiek dviprasmiškas:

Klaidingai pridėjau failus naudojant komandą ...

Atrodo, kad OP scenarijus yra pirmasis (nepažymėtas failas), norime „atšaukti“ ištrinti failą (o ne tik esamą turinį) iš stebimų elementų. Jei taip, galite paleisti git rm --cached <file> .

Ir mes taip pat galime paleisti git reset HEAD <file> . Apskritai tai yra pageidautina, nes ji veikia abu scenarijus: ji taip pat panaikina veiksmus, kai klaidingai pridėjome jau stebėto elemento versiją.

Tačiau yra du įspėjimai.

Pirma: yra (kaip nurodyta atsakyme) tik vienas scenarijus, kuriame neveikia „ git rm --cached git reset HEAD “, bet „ git rm --cached darbai: naujas saugykla (be įsipareigojimo). Tačiau iš tikrųjų tai yra beveik nereikšminga.

Antra, nepamirškite, kad „ git reset HEAD negali stebuklingai atkurti anksčiau saugomo failo turinio, tiesiog jį sinchronizuoja su HEAD. Jei mūsų neteisingas git add ankstesnę nepriskirtą versiją, mes negalėsime jo susigrąžinti. Todėl griežtai kalbant, negalime atšaukti [*].

Pavyzdys:

 $ git init $ echo "version 1" > file.txt $ git add file.txt # first add of file.txt $ git commit -m 'first commit' $ echo "version 2" > file.txt $ git add file.txt # stage (don't commit) "version 2" of file.txt $ git diff --cached file.txt -version 1 +version 2 $ echo "version 3" > file.txt $ git diff file.txt -version 2 +version 3 $ git add file.txt # oops we didn't mean this $ git reset HEAD file.txt # undo ? $ git diff --cached file.txt # no dif, of course. stage == HEAD $ git diff file.txt # we have lost irrevocably "version 2" -version 1 +version 3 

Žinoma, tai nėra labai svarbu, jei mes tiesiog laikomės įprastos tingios „git add“ darbo eigos, kad tik pridėtume naujus failus (1 atvejis), o mes atnaujiname naują turinį su įvykiu, git commit -a komanda.


* (Redaguoti: aukščiau pateikta informacija yra beveik teisinga, tačiau vis dar gali būti kelios įsilaužėlių / sugadintų būdų, kaip atkurti pakeitimus, kurie buvo pristatyti, bet nebuvo nustatyti, ir tada perrašyti - žr. Johannes Matokich ir iolsmit komentarus)

153
18 мая '11 в 21:05 2011-05-18 21:05 Atsakymą pateikė leonbloy , gegužės 18 d., 11 d., 21:05, 2011-05-18 21:05
 git rm --cached . -r 

„prideda“ viską, ką pridėjote iš dabartinio katalogo rekursyviai

89
10 дек. 10 d. 2009-12-10 00:19 '09 ne 0:19 2009-12-10 00:19

Vykdyti

 git gui 

ir ištrinti visus failus rankiniu būdu arba išrinkdami juos visus ir paspaudę įsipareigojimo mygtuką.

83
12 окт. Khaja Minhajuddin atsakymas, pateiktas spalio 12 d 2011-10-12 04:12 2011-11-12 04:12 04:12

„Git“ turi komandas kiekvienam įsivaizduojamam veiksmui, tačiau jam reikalingos išsamios žinios, kad padėtis būtų teisinga, ir todėl, kad tai geriausia yra intuityvi.

Ką darėte anksčiau:

  • Pakeistas failas ir naudokite git add . arba git add <file> .

Ką norite:

  • Pašalinkite failą iš indekso, tačiau išsaugokite jį versijose ir palikite su nepakeistais pakeitimais darbo kopijoje:

     git reset head <file> 
  • Iš naujo nustatykite failą su naujausia HEAD būsena, pašalindami pakeitimus ir ištrindami juos iš indekso:

29 марта '13 в 14:14 2013-03-29 14:14 atsakymas pateikiamas sjas kovo 29 d., 13 val. 14:14 2013-03-29 14:14

Jei norite atšaukti jau pridėtą failą, yra gana paprasta, naudodami git , iš naujo nustatyti jau pridėtą myfile.txt , naudokite:

 git reset HEAD myfile.txt 

Paaiškinkite:

Įdėję nereikalingų failų, kuriuos norite atšaukti, galite git reset , Headgit reset failą vietiniame tinkle, o paskutinis parametras yra jūsų failo pavadinimas.

Sukuriu toliau pateiktame paveikslėlyje pateiktus veiksmus, išsamiau už jus, įskaitant visus veiksmus, kurie gali įvykti šiais atvejais:

2019

28 июня '17 в 13:43 2017-06-28 13:43 Atsakymą Alireza pateikė birželio 28 d. 17, 13:43 pm 2017-06-28 13:43

Akivaizdu, kad klausimas nėra užduotas. Priežastis yra ta, kad „ git add turi dvi reikšmes:

  • pridėkite naują failą į sustojimo sritį, tada atšaukite git rm --cached file .
  • Įtraukus failą, kuris buvo pakeistas į sustojimo sritį, atšaukite jį su git reset HEAD file .

jei abejojate, naudokite

 git reset HEAD file 

Kadangi abiem atvejais tikimasi tikėtis.

Įspėjimas: jei faile yra pakeistas git rm --cached file (failas, kuris anksčiau buvo saugykloje), tada failas bus ištrintas „ git commit ! Jis vis dar bus jūsų failų sistemoje, bet jei kas nors ištrauks jūsų įsipareigojimą, failas bus pašalintas iš jo darbo medžio.

git status nurodo, ar failas buvo naujas, ar pakeistas :

 On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: my_new_file.txt modified: my_modified_file.txt 
69
16 янв. Atsakymą pateikė Michael_Scharf 16 sausis 2014-01-16 22:54 '14, 10:54 val. 2014-01-16 22:54

Jei naudojate savo originalą ir negalite naudoti git reset, tiesiog deklaruokite „Git bankroto“ ir ištrinkite .git aplanką ir pradėkite su juo

58
19 нояб. Paul Betts atsakymas lapkričio 19 d 2009-11-19 19:39 '09 19:39 2009-11-19 19:39

Kaip ir daugelis kitų atsakymų, galite naudoti git reset

BET:

Radau šį nuostabų pranešimą, kuris iš tikrųjų prideda git unadd komandą (gerai, pseudonimą) git unadd : žr. Git unadd .

Tiesiog

 git config --global alias.unadd "reset HEAD" 

Dabar galite

 git unadd foo.txt bar.txt 
54
01 окт. atsakymą pateikė electblake 01 okt. 2010-10-01 17:54 '10, 17:54, 2010-10-01 17:54

git remove arba git rm gali būti naudojami su --cached vėliava. Pabandykite:

 git help rm 
45
08 дек. atsakymą pateikė gnud 08 dec. 2008-12-08 01:00 '08, 1:00, 2008-12-08 01:00

Naudokite git add -i kad pašalintumėte tiesiog pridėtus failus iš būsimo įsipareigojimo. Pavyzdys:

Pridėti failą, kurio jums nereikia:

 $ git add foo $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: foo # # Untracked files: # (use "git add <file>..." to include in what will be committed) # [...]# 

Įgalinti interaktyvųjį priedą, jei norite atšaukti pridėjimą (komandose, įvestose čia: „r“ (grįžimas), „1“ (pirmasis įrašas sąraše grįš), „grįžti“, jei norite išeiti iš grąžinimo režimo, ir „q“ (išeiti):

 $ git add -i staged unstaged path 1: +1/-0 nothing foo *** Commands *** 1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked 5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp What now> r staged unstaged path 1: +1/-0 nothing [f]oo Revert>> 1 staged unstaged path * 1: +1/-0 nothing [f]oo Revert>> note: foo is untracked now. reverted one path *** Commands *** 1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked 5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp What now> q Bye. $ 

Kas tai yra! Čia pateikiamas įrodymas, kad „foo“ grįžta į sąrašą be pėdsakų:

 $ git status # On branch master # Untracked files: # (use "git add <file>..." to include in what will be committed) # [...] # foo nothing added to commit but untracked files present (use "git add" to track) $ 
41
18 апр. Alex North-Keys atsakymas, pateiktas balandžio 18 d 2012-04-18 15:53 '12, 15:53 ​​pm 2012-04-18 15:53

Čia galite išvengti šios nemalonios problemos, kai pradedate naują projektą:

  • Sukurkite pagrindinį savo naujo projekto katalogą.
  • Paleiskite git init .
  • Dabar sukurkite .gitignore failą (net jei jis yra tuščias).
  • Nustatykite .gitignore failą.

„Git“ labai sunku atlikti git reset jei neturite įsipareigojimų. Jei sukuriate nedidelį pradinį įsipareigojimą tik dėl jo, tada galite git add -A ir git reset tiek kartų, kiek norite, kad viskas būtų teisinga.

Kitas šio metodo privalumas yra tai, kad jei vėliau susiduriate su linijų užbaigimo problemomis ir jums reikia atnaujinti visus failus, tai paprasta:

  • Atkreipkite dėmesį, kad pradinis nustatymas. Tai pašalins visus jūsų failus.
  • Tada patikrinkite savo paskutinį įvykį dar kartą. Taip bus atkurtos naujos failų kopijos, naudojant dabartinius linijos pabaigos nustatymus.
36
25 сент. atsakymą pateikė Ryan Lundy 25 sep. 2011-09-25 02:34 2011-11-25 02:34 02:34

Gal Git išsivystė nuo jūsų paskelbto klausimo.

 $> git --version git version 1.6.2.1 

Dabar galite pabandyti:

 git reset HEAD . 

Tai turi būti tai, ko ieškote.

32
19 нояб. Atsakymą pateikė Kokotte23 lapkričio 19 d. 2009-11-19 19:38 '09 19:38 2009-11-19 19:38

Atminkite, kad jei nenurodėte peržiūros, turite įtraukti separatorių. Pavyzdys iš mano konsolės:

 git reset <path_to_file> fatal: ambiguous argument '<path_to_file>': unknown revision or path not in the working tree. Use '--' to separate paths from revisions git reset -- <path_to_file> Unstaged changes after reset: M <path_to_file> 

(git versija 1.7.5.4)

32
23 янв. atsakymas pateiktas powlo 23 jan. 2012-01-23 19:57 '12 19:57 2012-01-23 19:57

Jei norite pašalinti naujus failus iš sustojimo zonos (ir tik naujo failo atveju), kaip siūloma aukščiau:

 git rm --cached FILE 

Naudokite rm - talpyklą tik atsitiktinai pridėjus naujus failus.

29
22 июня '09 в 14:58 2009-06-22 14:58 atsakymas yra pateiktas Ranui birželio 22 d., 09:58, 2009-06-22 14:58

Atstatydami kiekvieną failą konkrečiame aplanke (ir jo poaplankiuose) galite naudoti šią komandą:

 git reset * 
23
26 июля '12 в 10:50 2012-07-26 10:50 atsakymas pateikiamas Zorayr liepos 26 d. 12 val. 10:50 2012-07-26 10:50

naudokite komandą * norite apdoroti kelis failus vienu metu

 git reset HEAD *.prj git reset HEAD *.bmp git reset HEAD *gdb* 

ir pan

23
28 авг. boulder_ruby yra atsakymas 28 rug . 2013-08-28 00:15 '13 - 0:15 2013-08-28 00:15

Tiesiog įveskite git reset , jis sugrįš ir atrodo, kad niekada git add . nuo paskutinio įsipareigojimo. Būtinai atlikite tai anksčiau.

21
19 мая '10 в 6:49 2010-05-19 06:49 Atsakymą davė Donovanas gegužės 19 d. 10, 06:49 2010-05-19 06:49

Tarkime, aš sukuriu naują failą newFile.txt .

2019

04 окт. atsakymą pateikė Vidura Mudalige 04 okt. 2016-10-04 14:02 '16 at 14:02 pm 2016-10-04 14:02

Konkrečiam failui:

  • git reset my_file.txt
  • git checkout my_file.txt

Visiems pridėtiems failams:

  • git reset
  • „Git“ apmokėjimas.

Pastaba: išsiregistravimas pakeičia kodą rinkmenose ir pereina į paskutinę atnaujintą (patvirtintą) būseną. reset nepakeičia kodų; jis tiesiog sumažina antraštę.

15
28 окт. atsakymą pateikė Hasib Kamal spalio 28 d. 2017-10-28 09:03 '17 at 9:03 2017-10-28 09:03

Ši komanda pakeičia jūsų pakeitimus:

 git reset HEAD filename.txt 

Taip pat galite naudoti

 git add -p 

pridėti failų dalis.

12
31 янв. Atsakymas pateikiamas wallerjake 31 d 2013-01-31 18:43 '13, 18:43, 2013-01-31 18:43

Esu nustebęs, kad niekas nemini interaktyviuoju režimu:

 git add -i 

Pasirinkite parinktį 3, jei norite pridėti failus. Mano atveju, dažnai noriu pridėti keletą failų, internete galite naudoti šiuos numerius failams pridėti. Tai trunka tik 4: 1,2,3,5

Norėdami pasirinkti seką, tiesiog įveskite 1-5, kad būtų imtasi visko nuo 1 iki 5.

Git tarpiniai failai

12
22 окт. Atsakymas Jonathan 22 spalis. 2015-10-22 16:03 '15 - 16:03 2015-10-22 16:03

Jei norite atšaukti „git“, naudokite

git reset filename

12
02 окт. Anirudh Sood atsakymas 02 okt. 2016-10-02 18:54 '16 at 18:54 2016-10-02 18:54

git add myfile.txt # tai pridės jūsų failą prie įsipareigojimų sąrašo

Skirtingai nei ši komanda,

 git reset HEAD myfile.txt # this will undo it. 

Taigi, jūs būsite ankstesnėje būsenoje. nurodyta bus vėl sąraše be pėdsakų (ankstesnė būsena).

Jis nustatys failą iš naujo. taigi, jei jūsų galvos to nepadarysite, jis tiesiog iš naujo nustatomas

8
27 июня '17 в 16:58 2017-06-27 16:58 Atsakymą pateikė „ Mohideen ibn Mohammed “ birželio 17 d. 17 val. 16:58 2017-06-27 16:58
 git reset filename.txt 

Pašalina failą, pavadintą filename.txt iš dabartinio rodyklės - „artėjančio įsipareigojimo“, nekeičiant nieko.

8
11 июля '16 в 21:40 2016-07-11 21:40 Atsakymą pateikė Rahul Sinha liepos 16 d. 16:40 2016-07-11 21:40

„SourceTree“ programoje galite lengvai tai padaryti per „GUI“. Galite patikrinti, kurią komandą sourcetree naudoja failui išjungti.

Aš sukūriau naują failą ir pridėjau jį į git. Tada aš jį išjungiau naudojant Guit SourceTree. Tai yra rezultatas:

Failų atvaizdavimas [08/12/15 10:43]
git -c dif. mnemonicprefix = false -c branduolys. quotepath = false -c įgaliojimai. pagalbininkas = sourcetree reset -q - kelias /to/file/filename.java

SourceTree naudoja reset kad išjungtų naujus failus.

7
08 дек. atsakymas pateikiamas miva2 08 dec. 2015-12-08 12:58 '15, 12:58, 2015-12-08 12:58
 git reset filename.txt 

Pašalina failą, pavadintą filename.txt iš dabartinio rodyklės - „artėjančio įsipareigojimo“, nekeičiant nieko.

6
26 окт. Joseph Mathew atsakymas, pateiktas spalio 26 d 2017-10-26 21:15 '17 at 21:15 2017-10-26 21:15
  • 1
  • 2

Kiti klausimai apie „ etikečių arba „ Klauskite klausimą“