Kako poništiti "git add" prije izvršenja?

Pogrešno sam dodao datoteke u naredbu:

 git add myfile.txt 

Još nisam pokrenula git commit . Postoji li način da se to poništi tako da te datoteke nisu uključene u predaju?


Trenutno postoji 48 odgovora (neki su izbrisani). Nemojte dodavati novu ako nemate novih informacija.

7856
08 дек. postavila paxos1977 08 prosinca 2008-12-08 00:57 '08 u 0:57 2008-12-08 00:57
@ 34 odgovora
  • 1
  • 2

git add možete otkazati prije izvršavanja

 git reset <file> 

koji će je ukloniti iz trenutnog indeksa (popis "uskoro se obvezati") bez mijenjanja bilo čega drugog.

Možete koristiti

 git reset 

bez bilo kojeg naziva datoteke za onemogućavanje svih promjena. To može biti korisno kada je previše datoteka popisano jedan po jedan u razumnom roku.

U starijim verzijama Git-a, gore navedene naredbe su ekvivalentne git reset HEAD <file> i git reset HEAD i neće uspjeti ako je HEAD nedefiniran (jer niste izvršili bilo kakve uvrštenja u repo) ili dvosmisleni (jer ste stvorili podružnicu s) ime HEAD , što je glupa stvar koju ne biste trebali učiniti). To je promijenjeno u Git 1.8.2 , iako u modernim verzijama Git-a možete koristiti gore navedene naredbe prije stvaranja prvog urezivanja:

"git reset" (bez parametara ili parametara) koji se koristi za vas nema nikakvih obveza u vašoj povijesti, ali sada vam daje prazan indeks (da se podudara s nepostojećom pohranom, čak niste ni uključeni).

8850
08 дек. odgovor se daje genehack 08 dec. 2008-12-08 01:30 '08 u 1:30 2008-12-08 01:30

Želite:

 git rm --cached <added_file_to_undo> 

Obrazloženje:

Kad sam bio novi u ovome, prvo sam pokušao

 git reset . 

(da biste otkazali sve moje početne prijenose), samo da biste dobili ovu (ne baš) korisnu poruku:

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

Ispada da je to zato što link HEAD (grana?) Postoji tek nakon prvog urezivanja. To jest, susrest ćete se s istim problemom kao i ja ako vaš radni tijek, kao što je moj, izgleda ovako:

  1. Idite na moj novi direktorij projekta i isprobajte Git, novu želju
  2. git init
  3. git add.
  4. git status

    ... puno sranja ...

    > Dovraga, nisam htio sve to dodati.

  5. google "poništi git add"

    => pronaći pretakanje stog - ooh

  6. git reset.

    => fatalno: Ne mogu riješiti 'HEAD' kao valjanu vezu.

Osim toga, ispada da je poruka o pogrešci registrirana na popisu raspodjele.

I da je prava odluka bila tu u Git statusu (koji, da, nazvao sam "sranje")

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

A rješenje je stvarno koristiti git rm --cached FILE .

Primijetite upozorenja na drugim mjestima - git rm briše vašu lokalnu radnu kopiju datoteke, ali ne i ako koristite --cached . Ovo je rezultat git help rm :

--cached Koristite ovu opciju za uklanjanje i uklanjanje staza samo iz indeksa. Datoteke na radnoj površini, izmijenjene ili ne, ostaju.

Počinjem koristiti

 git rm --cached . 

izbrišite sve i počnite ispočetka. To nije uspjelo, jer, iako je add. je rekurzivan, ispada da rm treba -r za rekurziju. Uzdah.

 git rm -r --cached . 

Ok, sad sam se vratio tamo gdje sam počeo. Sljedeći put ću koristiti -n za -n run i vidjeti što će biti dodano:

 git add -n . 

Sve sam arhivirao na sigurnom mjestu prije povjerenja u git help rm i rekao da --cached ne uništava ništa (i što ako sam pogrešno napisao).

2013
25 марта '09 в 19:20 2009-03-25 19:20 odgovor je dao Rhubarb 25. ožujka u 19:20 2009-03-25 19:20

Ako upišete:

 git status 

git će vam reći što se rješava, itd., uključujući upute o tome kako prekinuti vezu:

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

Smatram da taj git prilično dobar posao gura da radim pravu stvar u takvim situacijama.

Napomena. Najnovije verzije git-a (1.8.4.x) promijenile su ovu poruku:

 (use "git rm --cached <file>..." to unstage) 
498
08 дек. Odgovor je dao Paul Beckingham 08 prosinca. 2008-12-08 02:22 '08 u 2:22 am 2008-12-08 02:22

Da pojasnimo: git add premješta promjene iz trenutnog radnog direktorija u srednje područje (indeks).

Taj se proces naziva intermedijer. Stoga je najočitija naredba za promjenu promjena (modificiranih datoteka) očigledna:

 git stage 

git add je samo pseudonim za git stage

Šteta je što ne postoje git unadd git unstage i git unadd . Odgovarajuće pitanje je teže pogoditi ili zapamtiti, ali sasvim očito:

 git reset HEAD -- 

Jednostavno možemo izraditi alias za ovo:

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

I na kraju, imamo nove timove:

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

Osobno koristim čak i kraće pseudonime:

 git a #for staging git u #for unstaging 
232
10 сент. Odgovor traje 10 rujna. 2010-09-10 23:28 '10 u 23:28 2010-09-10 23:28

Osim prihvaćenog odgovora, ako je vaša pogrešno dodana datoteka bila ogromna, vjerojatno ćete primijetiti da čak i nakon što ste je uklonili iz indeksa koristeći " git reset " još uvijek se odvija u .git direktoriju. Ne biste se trebali brinuti o tome, datoteka je još uvijek u spremištu, ali samo kao "slobodni objekt", neće se kopirati u druge repozitorije (putem klonova, push-a), a prostor će s vremenom biti oslobođen - iako možda ne vrlo brzo , Ako ste zabrinuti, možete pokrenuti:

 git gc --prune=now 

Ažuriraj (u daljnjem tekstu pokušat ću ukloniti neku zbrku koja može proizaći iz odgovora s najvećim brojem glasova):

Dakle, što je pravi otkaz git add ?

git reset HEAD <file> ?

ili

git rm --cached <file> ?

Strogo govoreći, i ako ne griješim: ne .

git add se ne može poništiti - sigurno, općenito.

Prvo ćemo zapamtiti što git add <file> zapravo:

  1. Ako <file> prethodno nije bio praćen , git add ga dodaje u predmemoriju s trenutnim sadržajem.

  2. Ako je <file> već praćen , git add sprema trenutni sadržaj (snimku, verziju) u predmemoriju. U GIT-u se ova akcija još uvijek naziva dodavanjem (i ne samo ažuriranjem), jer se dvije različite verzije (snimke) datoteke tretiraju kao dva različita elementa: dakle, dodaje se nova stavka u predmemoriju, tako da će se kasnije izvršiti.

U svjetlu toga, pitanje je pomalo dvosmisleno:

Pogrešno sam dodao datoteke pomoću naredbe ...

OP skripta čini se da je prva (neuređena datoteka), želimo "poništiti" brisanje datoteke (a ne samo trenutnog sadržaja) iz nadziranih stavki. Ako je tako, tada možete pokrenuti git rm --cached <file> .

Također možemo pokrenuti git reset HEAD <file> . Općenito, ovo je poželjno jer radi u oba scenarija: i poništava radnje kada smo pogreškom dodali verziju već praćene stavke.

Ali postoje dva upozorenja.

Prvo: postoji (kao što je navedeno u odgovoru) samo jedna skripta u kojoj git reset HEAD ne radi, ali git rm --cached radi: novo spremište (bez git rm --cached ). No, u stvari, to je praktički irelevantno.

Drugo, imajte na umu da git reset HEAD ne može magično vratiti prethodno spremljeni sadržaj datoteke, već ga jednostavno ponovno sinkronizira s HEAD. Ako je naš pogrešan git add prepisao prethodnu neobjavljenu verziju, nećemo ga moći oporaviti. Stoga, strogo govoreći, ne možemo otkazati [*].

primjer:

 $ 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 

Naravno, to nije jako važno ako samo slijedimo uobičajeni lijeni tijek izvršavanja 'git add' samo za dodavanje novih datoteka (slučaj 1), i ažuriramo novi sadržaj s naredbom commit, git commit -a .


* (Uredi: gore navedeno je gotovo točno, ali još uvijek može postojati nekoliko načina hakera / zapetljanih načina oporavka izmjena koje su isporučene, ali nisu fiksne, a zatim prebrisane - pogledajte komentare Johannes Matokich i iolsmit)

153
18 мая '11 в 21:05 2011-05-18 21:05 Odgovor je dao leonbloy 18. svibnja '11 u 21:05 2011-05-18 21:05
 git rm --cached . -r 

će "un-add" sve što ste dodali iz trenutnog direktorija rekurzivno

89
10 дек. odgovor od braitsch 10 dec. 2009-12-10 00:19 '09 u 0:19 2009-12-10 00:19

trčanje

 git gui 

i brisanje svih datoteka ručno ili odabirom svih njih i pritiskom gumba urezivanja s urezivanjem.

83
12 окт. Odgovor dao Khaja Minhauddin 12. listopada 2011-10-12 04:12 '11 u 4:12 na 2011-10-12 04:12

Git ima naredbe za svaku zamislivu radnju, ali treba opsežno znanje kako bi ispravio stvari, a zbog toga je u najboljem slučaju kontra-intuitivan ...

Što ste radili prije:

  • Promijenjena je datoteka i upotreba git add . ili git add <file> .

Što želite:

  • Uklonite datoteku iz indeksa, ali spremite je u verzijama i ostavite s nezaključenim promjenama u radnoj kopiji:

     git reset head <file> 
  • Resetirajte datoteku s najnovijim statusom iz HEAD, odbacite promjene i izbrišite ih iz indeksa:

29 марта '13 в 14:14 2013-03-29 14:14 odgovor je dat sjas 29. ožujka '13 u 14:14 2013-03-29 14:14

Da biste otkazali datoteku koja je već dodana, vrlo je jednostavno, pomoću git-a , da biste ponovo postavili myfile.txt koji je već dodan, upotrijebite:

 git reset HEAD myfile.txt 

objasniti

Nakon što stavite nepotrebne datoteke u otkaz, možete git reset , Head je git reset datoteku na lokalnoj mreži, a zadnji parametar je ime vaše datoteke.

Kreiram korake prikazane na slici ispod, detaljnije za vas, uključujući sve korake koji se mogu dogoditi u sljedećim slučajevima:

2019

28 июня '17 в 13:43 2017-06-28 13:43 Odgovor daje Alireza 28. lipnja 2006. u 13:43 sati 2017-06-28 13:43

Pitanje očito nije postavljeno. Razlog je taj što git add ima dva značenja:

  • dodajte novu datoteku u područje git rm --cached file , a zatim ga otkažite pomoću git rm --cached file .
  • Dodavanje datoteke koja je izmijenjena u područje za skeniranje, a zatim ga poništite pomoću git reset HEAD file .

ako ste u nedoumici, koristite

 git reset HEAD file 

Zato što se u oba slučaja očekuje očekivana stvar.

Upozorenje: ako napravite git rm --cached file u datoteci se mijenja (datoteka koja je prethodno postojala u spremištu), tada će datoteka biti izbrisana u git commit ! I dalje će postojati u vašem datotečnom sustavu, ali ako netko povuče vašu predaju, datoteka će biti uklonjena iz radnog stabla.

git status govori je li datoteka nova ili promijenjena :

 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 янв. Odgovor je dao Michael_Scharf 16. siječnja 2014-01-16 22:54 '14 u 22:54 sati 2014-01-16 22:54

Ako koristite izvornu obvezu i ne možete koristiti reset git, jednostavno proglasite "Git stečaj" i izbrišite .git mapu i počnite s njom

58
19 нояб. Odgovor koji je dao Paul Betts 19. studenog 2009-11-19 19:39 '09 u 19:39 2009-11-19 19:39

Kao i kod mnogih drugih odgovora, možete koristiti git reset

ALI:

Našao sam ovu divnu poruku koja zapravo dodaje naredbu git unadd (dobro, alias) za git unadd : pogledajte git unadd za detalje ili ..

samo

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

Sada možete

 git unadd foo.txt bar.txt 
54
01 окт. odgovor je dao electblake 01 oct. 2010-10-01 17:54 '10 u 17:54 2010-10-01 17:54

git remove ili git rm mogu se koristiti za to s --cached . pokušajte:

 git help rm 
45
08 дек. odgovor je dao gnud 08 dec. 2008-12-08 01:00 '08 u 1:00 2008-12-08 01:00

Upotrijebite git add -i da biste uklonili samo dodane datoteke s nadolazećeg predavanja. primjer:

Dodavanje datoteke koja vam nije potrebna:

 $ 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) # [...]# 

Omogućite interaktivni dodatak za poništavanje dodavanja (naredbe koje su ovdje unesene: "r" (povratak), "1" (prvi unos u popis će se vratiti), "povratak" za izlaz iz načina povratka i "q" (izlaz):

 $ 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. $ 

Što je ovo? Ovdje je vaš dokaz da se "foo" vraća na popis bez praćenja:

 $ 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 апр. Odgovor dao Alex North-Keys 18. travnja 2012-04-18 15:53 '12 u 3:53 pm 2012-04-18 15:53

Ovdje možete izbjeći ovaj neugodni problem prilikom pokretanja novog projekta:

  • Stvorite bazni direktorij za novi projekt.
  • Pokrenite git init .
  • Sada stvorite .gitignore datoteku (čak i ako je prazna).
  • Popravi datoteku .gitignore.

Git čini vrlo teško napraviti git reset ako nemate obvezu. Ako stvorite malu početnu pohranu samo zbog toga, tada možete git add -A i git reset onoliko puta koliko želite da sve bude ispravno.

Još jedna prednost ove metode je da ako kasnije naiđete na probleme s dovršavanjem crte i morate ažurirati sve svoje datoteke, jednostavno je:

  • Imajte na umu da početni popravak. Time ćete izbrisati sve vaše datoteke.
  • Zatim ponovno provjerite svoj zadnji upis. Tako ćete obnoviti svježe kopije datoteka pomoću trenutnih postavki za završetak niza.
36
25 сент. odgovor je dao Ryan Lundy 25 sep. 2011-09-25 02:34 '11 u 2:34 u 2011-09-25 02:34

Možda je Git evoluirao otkad ste postavili pitanje.

 $> git --version git version 1.6.2.1 

Sada možete pokušati:

 git reset HEAD . 

To mora biti ono što tražite.

32
19 нояб. Odgovor daje Kokotte23 . 2009-11-19 19:38 '09 u 19:38 2009-11-19 19:38

Imajte na umu da ako niste naveli reviziju, morate uključiti separator. Primjer iz moje konzole:

 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 verzija 1.7.5.4)

32
23 янв. odgovor je dat powlo 23 jan. 2012-01-23 19:57 '12 u 19:57 2012-01-23 19:57

Da biste uklonili nove datoteke s područja za skok (i samo u slučaju nove datoteke), kao što je predloženo gore:

 git rm --cached FILE 

Koristite rm - spremljeno samo za slučajno dodane nove datoteke.

29
22 июня '09 в 14:58 2009-06-22 14:58 odgovor se daje Ranu 22. lipnja 2009. u 14:58 2009-06-22 14:58

Prilikom resetiranja svake datoteke u određenoj mapi (i njezinim podmapama) možete koristiti sljedeću naredbu:

 git reset * 
23
26 июля '12 в 10:50 2012-07-26 10:50 odgovor je dan Zorayr 26. srpnja 2012. u 10:50 2012-07-26 10:50

koristite * naredbu za obradu više datoteka odjednom

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

i tako dalje

23
28 авг. boulder_ruby je odgovor 28 aug. 2013-08-28 00:15 '13 u 0:15 2013-08-28 00:15

Samo utipkajte git reset , vratit će se i izgleda da nikada niste ušli u git add . od zadnjeg urezivanja. Budite sigurni da to učinite i prije.

21
19 мая '10 в 6:49 2010-05-19 06:49 Odgovor je dao Donovan 19. svibnja 2010. u 6:49 2010-05-19 06:49

Pretpostavimo da stvorim novu datoteku newFile.txt .

2019

04 окт. odgovor daje Vidura Mudalige 04 okt. 2016-10-04 14:02 '16 u 14:02 2016-10-04 14:02

Za određenu datoteku:

  • git resetiraj my_file.txt
  • git checkout my_file.txt

Za sve dodane datoteke:

  • git reset
  • Git checkout.

Napomena: Blagajna mijenja kôd u datotekama i prelazi na zadnje ažurirano (potvrđeno) stanje. reset ne mijenja kodove; samo ispusti naslov.

15
28 окт. odgovor je dao Hasib Kamal 28. listopada. 2017-10-28 09:03 '17 u 9:03 2017-10-28 09:03

Ova naredba mijenja vaše izmjene:

 git reset HEAD filename.txt 

Također možete koristiti

 git add -p 

za dodavanje dijelova datoteka.

12
31 янв. Odgovor je dan wallerjake 31. siječnja 2013-01-31 18:43 '13 u 18:43 2013-01-31 18:43

Iznenađen sam da nitko ne spominje interaktivni način:

 git add -i 

Odaberite opciju 3 za dodavanje datoteka. U mom slučaju često želim dodati nekoliko datoteka: na mreži, te brojeve možete koristiti za dodavanje datoteka. Potrebno je samo 4: 1,2,3,5

Da biste odabrali niz, jednostavno unesite 1-5 da biste uzeli sve od 1 do 5.

Git interne datoteke

12
22 окт. Odgovorite na Jonathan 22. listopada. 2015-10-22 16:03 '15 u 16:03 2015-10-22 16:03

Da biste poništili git, upotrijebite

git reset filename

12
02 окт. odgovor od Anirudh Sood 02. 2016-10-02 18:54 '16 u 18:54 2016-10-02 18:54

git add myfile.txt # ovo će dodati vašu datoteku na popis urezivanja

Za razliku od ove naredbe,

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

Dakle, bit ćete u prethodnom stanju. navedeno će biti ponovno na popisu bez praćenja (prethodno stanje).

On će resetirati glavu s navedenom datotekom. pa ako vaša glava nema ovo, to je samo resetiranje

8
27 июня '17 в 16:58 2017-06-27 16:58 Odgovor daje Mohideen ibn Mohammed 27. lipnja 2006. u 16:58 2017-06-27 16:58
 git reset filename.txt 

Uklanja datoteku pod nazivom filename.txt iz trenutnog indeksa, područje "about to commit", bez mijenjanja bilo čega.

8
11 июля '16 в 21:40 2016-07-11 21:40 Odgovor daje Rahul Sinha 11. srpnja 2011. u 21:40 2016-07-11 21:40

U SourceTree, to možete jednostavno učiniti putem GUI. Možete provjeriti koju naredbu sourcetree koristi za onemogućavanje datoteke.

Stvorio sam novu datoteku i dodao je u git. Onda sam ga isključio koristeći guit SourceTree. To je rezultat:

Skidanje datoteka [08/12/15 10:43]
git -c diff. mnemonicprefix = lažna -c jezgra. quotepath = false -c vjerodajnice. helper = sourcetree reset -q - putanja /to/file/filename.java

SourceTree koristi reset za onemogućavanje novih datoteka.

7
08 дек. odgovor je dala miva2 08 dec. 2015-12-08 12:58 '15 u 12:58 2015-12-08 12:58
 git reset filename.txt 

Uklanja datoteku pod nazivom filename.txt iz trenutnog indeksa, područje "about to commit", bez mijenjanja bilo čega.

6
26 окт. Odgovor dao je Joseph Mathew 26. listopada 2017-10-26 21:15 '17 u 21:15 2017-10-26 21:15
  • 1
  • 2

Ostala pitanja o naljepnicama ili Ask a Question