border=0

"82.112.191.130 - 82.112.191.130"

Hoe 'git add' te annuleren voordat je commit?

Ik heb ten onrechte bestanden aan git toegevoegd met het commando:

 git add myfile.txt 

Ik heb git commit nog niet uitgevoerd. Is er een manier om dit te annuleren zodat deze bestanden niet zijn opgenomen in de commit?


Op dit moment zijn er 48 antwoorden (sommige zijn verwijderd). Voeg geen nieuwe toe als u geen nieuwe informatie heeft.

7856
08 дек. ingesteld door paxos1977 08 dec. 2008-12-08 00:57 '08 om 0:57 2008-12-08 00:57
@ 34 antwoorden
  • 1
  • 2

Je kunt git add annuleren voordat je git add

 git reset <file> 

die het zal verwijderen uit de huidige index (de lijst "about to be commit") zonder iets anders te veranderen.

Je kunt gebruiken

 git reset 

zonder bestandsnaam om alle wijzigingen uit te schakelen. Dit kan van pas komen wanneer teveel bestanden één voor één binnen een redelijke tijd worden vermeld.

In oudere versies van Git zijn de bovenstaande commando's gelijk aan git reset HEAD <file> en git reset HEAD en zal mislukken als HEAD undefined is (omdat je geen commits in je repo hebt vastgelegd) of dubbelzinnig (omdat je een branch hebt gemaakt met de naam HEAD , wat een stom ding is dat je niet zou moeten doen). Dit is gewijzigd in Git 1.8.2 , hoewel je in moderne versies van Git de bovenstaande commando's kunt gebruiken voordat je je eerste commit maakt:

"git reset" (zonder parameters of parameters) gebruikt voor u heeft geen verplichtingen in uw geschiedenis, maar nu geeft het u een lege index (om een ​​niet-bestaande commit te evenaren, bent u niet eens inbegrepen).

8850
08 дек. antwoord wordt gegeven genehack 08 dec. 2008-12-08 01:30 '08 om 1:30 2008-12-08 01:30

Jij wilt

 git rm --cached <added_file_to_undo> 

Achtergrond:

Toen ik nieuw was, probeerde ik het voor het eerst

 git reset . 

(om al mijn eerste uploads te annuleren), alleen om dit (niet erg handige) bericht te krijgen:

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

Het blijkt dat dit komt omdat de link HEAD (branch?) Alleen bestaat na de eerste commit. Dat wil zeggen, u zult hetzelfde newbie-probleem tegenkomen als ik als uw workflow, zoals die van mij, er ongeveer zo uitziet:

  1. Ga naar mijn nieuwe projectdirectory om Git uit te proberen, het nieuwe enthousiasme
  2. git init
  3. git add.
  4. git status

    ... veel shitty-scrolls ...

    > Verdomme, ik wilde dit niet allemaal toevoegen.

  5. google "cancel git add"

    => vind stapeloverloop - ooh

  6. git reset.

    => fatal: Kon 'HEAD' niet als geldige link oplossen.

Daarnaast is gebleken dat een foutmelding is geregistreerd op de distributielijst.

En dat de juiste beslissing daar was in de Git-statusoutput (die, ja, ik noemde "crap")

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

En de oplossing is echt om git rm --cached FILE .

Let op de waarschuwingen elders - git rm verwijdert uw lokale werkkopie van het bestand, maar niet als u --cached gebruikt . Hier is het resultaat van git help rm :

--cached Gebruik deze optie om alleen paden uit de index te verwijderen en te verwijderen. Desktop-bestanden, gewijzigd of niet, blijven.

Ik begin te gebruiken

 git rm --cached . 

verwijder alles en begin opnieuw. Het werkte niet, want hoewel add. is recursief, het blijkt dat rm -r voor recursie. Zucht.

 git rm -r --cached . 

Ok, nu ben ik terug naar waar ik begon. Volgende keer zal ik -n voor de -n run en kijken wat er zal worden toegevoegd:

 git add -n . 

Ik heb alles op een veilige plaats gearchiveerd voordat ik vertrouwde dat --cached git help rm dat --cached niets vernietigt (en wat als ik het verkeerd heb geschreven).

2013
25 марта '09 в 19:20 2009-03-25 19:20 het antwoord wordt gegeven door Rhubarb op 25 maart '09 om 19:20, 2009-03-25 19:20

Als je typt:

 git status 

git zal je vertellen wat er geregeld is, enz., inclusief instructies over het loskoppelen van:

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

Ik vind dat Git een behoorlijk goede klus is die me drijft om het juiste te doen in deze situaties.

Let op. Recente versies van git (1.8.4.x) hebben dit bericht gewijzigd:

 (use "git rm --cached <file>..." to unstage) 
498
08 дек. Het antwoord wordt gegeven door Paul Beckingham 08 dec. 2008-12-08 02:22 '08 om 2:22 uur 2008-12-08 02:22

Ter verduidelijking: git add bewegingen toe van de huidige werkmap naar een tussengebied (index).

Dit proces wordt intermediair genoemd. De meest natuurlijke opdracht voor het wijzigen van wijzigingen (gewijzigde bestanden) is dus duidelijk:

 git stage 

git add is slechts een alias voor git stage

Het is jammer dat er geen git unstage en git unadd . De bijbehorende vraag is moeilijker te raden of te onthouden, maar nogal voor de hand liggend:

 git reset HEAD -- 

We kunnen hier eenvoudig een bijnaam voor maken:

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

En tot slot hebben we nieuwe teams:

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

Persoonlijk gebruik ik zelfs kortere pseudoniemen:

 git a #for staging git u #for unstaging 
232
10 сент. Het antwoord was op 10 september 2010-09-10 23:28 '10 om 23:28 2010-09-10 23:28

In aanvulling op het geaccepteerde antwoord, als je per ongeluk toegevoegd bestand enorm was, zul je waarschijnlijk opmerken dat het, nog steeds na het verwijderen van de index met " git reset ", nog steeds plaatsvindt in de .git map. Je moet je er geen zorgen over maken, het bestand staat echt nog in de repository, maar alleen als een "gratis object", het zal niet naar andere repositories gekopieerd worden (via een kloon, push), en de ruimte zal uiteindelijk bevrijd worden - hoewel misschien niet erg snel . Als u zich zorgen maakt, kunt u uitvoeren:

 git gc --prune=now 

Update (hierna zal ik proberen enige verwarring weg te nemen die kan voortkomen uit de antwoorden met de meeste stemmen):

Dus wat is de echte annulering van git add ?

git reset HEAD <file> ?

of

git rm --cached <file> ?

Strikt genomen, en als ik me niet vergis: nee .

git add kan niet ongedaan worden gemaakt - veilig, in het algemeen.

Laten we eerst onthouden wat git add <file> eigenlijk doet:

  1. Als <file> niet eerder werd gevolgd , voegt git add toe aan de cache met zijn huidige inhoud.

  2. Als <file> al wordt bijgehouden , slaat git add de huidige inhoud (momentopname, versie) op in de cache. In GIT wordt deze actie nog steeds het toevoegen (en niet alleen bijwerken) genoemd, omdat twee verschillende versies (snapshots) van een bestand worden behandeld als twee verschillende elementen: daarom voegen we een nieuw item toe aan de cache, zodat het later zal worden gedaan.

In het licht hiervan is de vraag enigszins dubbelzinnig:

Ik heb ten onrechte bestanden toegevoegd met de opdracht ...

Het OP-script lijkt het eerste (niet-traceerbare bestand) te zijn, we willen "ongedaan maken" om het bestand (en niet alleen de huidige inhoud) uit de bijgehouden items te verwijderen. Als dat zo is, kun je git rm --cached <file> .

En we kunnen git reset HEAD <file> ook uitvoeren. Over het algemeen heeft dit de voorkeur omdat het in beide scenario's werkt: het annuleert ook acties wanneer we per abuis een versie van een reeds bijgehouden item hebben toegevoegd.

Maar er zijn twee voorbehouden.

Allereerst: er is (zoals aangegeven in het antwoord) slechts één script waarin git reset HEAD niet werkt, maar git rm --cached werkt: een nieuwe repository (zonder commits). Maar in feite is dit praktisch niet relevant.

Ten tweede, onthoud dat git reset HEAD niet eerder eerder gecachte inhoud van een bestand kan herstellen, het hersynchroniseert het gewoon opnieuw met HEAD. Als onze onjuiste git add de vorige niet-gecommitteerde versie git add overschreven, kunnen we deze niet meer herstellen. Daarom kunnen we strikt genomen [*] niet annuleren.

bijvoorbeeld:

 $ 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 

Dit is natuurlijk niet erg be>git commit -a .


* (Bewerken: het bovenstaande is bijna correct, maar er kunnen nog steeds verschillende hacker / verwarde manieren zijn om de aangebrachte wijzigingen te herstellen, maar niet opgelost en vervolgens overschreven - zie opmerkingen door Johannes Matokich en iolsmit)

153
18 мая '11 в 21:05 2011-05-18 21:05 het antwoord wordt gegeven door leonbloy op 18 mei '11 om 21:05 uur 2011-05-18 21:05
 git rm --cached . -r 

zal alles dat u uit de huidige map hebt toegevoegd, recursief "niet toevoegen"

89
10 дек. Het antwoord wordt gegeven door braitsch 10 dec. 2009-12-10 00:19 '09 om 0:19 2009-12-10 00:19

lopen

 git gui 

en verwijder alle bestanden handmatig of door ze allemaal te selecteren en op commit te drukken met commit.

83
12 окт. antwoord gegeven door Khaja Minhajuddin 12 oktober 2011-10-12 04:12 '11 om 4:12 op 2011-10-12 04:12

Git heeft opdrachten voor elke denkbare actie, maar heeft uitgebreide kennis nodig om het te repareren, en daarom is het op zijn best contra-intuïtief ...

Wat heb je eerder gedaan:

  • Veranderde het bestand en gebruik git add . of git add <file> .

Wat wil je:

  • Verwijder het bestand uit de index, sla het op in de versies en laat de niet-gefixeerde wijzigingen in de werkkopie achter:

     git reset head <file> 
  • Reset het bestand met de laatste status van HEAD, verwijder de wijzigingen en verwijder ze uit de index:

29 марта '13 в 14:14 2013-03-29 14:14 het antwoord wordt gegeven Sjas 29 maart '13 om 14:14 2013-03-29 14:14

Een bestand annuleren dat al is toegevoegd is vrij eenvoudig, gebruik git om mijn bestand.txt dat al is toegevoegd te resetten, gebruik:

 git reset HEAD myfile.txt 

uitleggen

Nadat u onnodige bestanden hebt geplaatst om te annuleren, kunt u de instellingen git reset , Head git reset uw bestand op het lokale netwerk en de laatste parameter is de naam van uw bestand.

Ik maak de stappen in de onderstaande afbeelding, voor meer detail, inclusief alle stappen die kunnen plaatsvinden in de volgende gevallen:

2019

De vraag is duidelijk niet gesteld. De reden is dat git add twee betekenissen heeft:

  • voeg een nieuw bestand toe aan het verzamelgebied en annuleer dan met git rm --cached file .
  • Een bestand toevoegen dat is gewijzigd naar een verzamelgebied en vervolgens annuleren met het git reset HEAD file .

gebruik bij twijfel

 git reset HEAD file 

Omdat in beide gevallen het verwachte ding wordt verwacht.

Waarschuwing: als je git rm --cached file in het bestand verandert (het bestand dat eerder in de repository bestond), dan wordt het bestand in git commit ! Het zal nog steeds bestaan ​​in uw bestandssysteem, maar als iemand anders uw commit haalt, wordt het bestand verwijderd uit uw werkstructuur.

git status vertelt je of het bestand nieuw was of gewijzigd :

 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 янв. Antwoord werd gegeven door Michael_Scharf 16 januari 2014-01-16 22:54 '14 om 10:54 uur 2014-01-16 22:54

Als je je originele commit gebruikt en git reset niet kunt gebruiken, declareer dan "Git bankruptcy" en verwijder de .git map en begin ermee

58
19 нояб. Het antwoord wordt gegeven door Paul Betts 19 november 2009-11-19 19:39 '09 om 19:39 2009-11-19 19:39

Zoals met veel andere antwoorden, kun je git reset

MAAR:

Ik vond dit prachtige bericht dat feitelijk een git unadd commando toevoegt (nou git unadd , alias) voor git unadd : zie git unadd voor details of ..

gewoon

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

Nu kan je

 git unadd foo.txt bar.txt 
54
01 окт. het antwoord wordt gegeven door electblake 01 okt. 2010-10-01 17:54 '10 om 17:54 2010-10-01 17:54

git remove of git rm kan hiervoor gebruikt worden met de --cached flag. Probeer het volgende:

 git help rm 
45
08 дек. het antwoord is gnud 08 dec. 2008-12-08 01:00 '08 om 1:00 2008-12-08 01:00

Gebruik git add -i om zojuist toegevoegde bestanden van je aankomende commit te verwijderen. bijvoorbeeld:

Een bestand toevoegen dat je niet nodig hebt:

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

Schakel interactieve add in om je toevoeging te annuleren (commando's getypt in git hier: "r" (return), "1" (de eerste vermelding in de lijst zal terugkeren), "return" om de return mode te verlaten, en "q" (quit):

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

Wat is dit! Hier is uw bewijs dat "foo" zonder sporen terugkomt in de lijst:

 $ 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 апр. Antwoord gegeven door Alex North-Keys op 18 april 2012-04-18 15:53 '12 om 15:53 ​​uur 2012-04-18 15:53

Hier kunt u dit onaangename probleem voorkomen bij het starten van een nieuw project:

  • Maak een basisdirectory voor uw nieuwe project.
  • Voer git init .
  • Maak nu een .gitignore-bestand (zelfs als het leeg is).
  • Los het .gitignore-bestand op.

Git maakt het erg moeilijk om een git reset als je geen commits hebt. Als je een kleine initiële commit maakt omwille van het, dan kun je git add -A en git reset zo vaak als je wilt dat alles correct is.

Een ander voordeel van deze methode is dat als u later lijnvoltooiingproblemen tegenkomt en u al uw bestanden moet bijwerken, dit eenvoudig is:

  • Merk op dat de eerste fix. Hiermee worden al uw bestanden verwijderd.
  • Controleer vervolgens uw laatste fix opnieuw. Dit zal nieuwe kopieën van uw bestanden herstellen met behulp van de huidige regel-eind instellingen.
36
25 сент. het antwoord wordt gegeven door Ryan Lundy 25 september. 2011-09-25 02:34 '11 om 2:34 op 2011-09-25 02:34

Misschien is Git geëvolueerd sinds je je vraag postte.

 $> git --version git version 1.6.2.1 

Nu kunt u proberen:

 git reset HEAD . 

Dit moet zijn wat je zoekt.

32
19 нояб. Antwoord wordt gegeven door Kokotte23 nov. 19. 2009-11-19 19:38 '09 om 19:38 2009-11-19 19:38

Houd er rekening mee dat als u geen revisie heeft opgegeven, u een scheidingsteken moet gebruiken. Een voorbeeld van mijn console:

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

32
23 янв. het antwoord wordt gegeven 23 januari. 2012-01-23 19:57 '12 om 19:57 2012-01-23 19:57

Om nieuwe bestanden uit het verzamelgebied te verwijderen (en alleen in het geval van een nieuw bestand), zoals hierboven gesuggereerd:

 git rm --cached FILE 

Gebruik rm --cached alleen voor per ongeluk toegevoegde nieuwe bestanden.

29
22 июня '09 в 14:58 2009-06-22 14:58 het antwoord wordt gegeven aan Ran op 22 juni '09 om 14:58, 2009-06-22 14:58

Bij het resetten van elk bestand in een specifieke map (en zijn submappen) kunt u de volgende opdracht gebruiken:

 git reset * 
23
26 июля '12 в 10:50 2012-07-26 10:50 het antwoord wordt gegeven Zorayr 26 juli '12 om 10:50 uur 2012-07-26 10:50

gebruik de opdracht * om meerdere bestanden tegelijkertijd te verwerken

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

en ga zo maar door

23
28 авг. boulder_ruby is antwoord 28 aug. 2013-08-28 00:15 '13 om 0:15 2013-08-28 00:15

Typ git reset , het komt terug en het lijkt erop dat je git add . nooit hebt ingevoerd git add . sinds de laatste commit. Zorg ervoor dat je dit eerder doet.

21
19 мая '10 в 6:49 2010-05-19 06:49 Antwoord wordt gegeven door Donovan op 19 mei '10 om 6:49 2010-05-19 06:49

Stel dat ik een nieuw bestand newFile.txt .

2019

04 окт. het antwoord wordt gegeven door Vidura Mudalige 04 okt. 2016-10-04 14:02 '16 om 2:02 uur 2016-10-04 14:02

Voor een specifiek bestand:

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

Voor alle toegevoegde bestanden:

  • git reset
  • Git uitchecken.

Opmerking: bij het afrekenen wordt de code in de bestanden gewijzigd en wordt de laatst bijgewerkte (bevestigde) status weergegeven. resetten verandert de codes niet; hij laat gewoon de kop vallen.

15
28 окт. het antwoord wordt gegeven door Hasib Kamal op 28 oktober. 2017-10-28 09:03 17 om 9:03 2017-10-28 09:03

Met deze opdracht worden uw wijzigingen gewijzigd:

 git reset HEAD filename.txt 

Je kunt ook gebruiken

 git add -p 

om delen van bestanden toe te voegen.

12
31 янв. antwoord gegeven door wallerjake op 31 januari 2013-01-31 18:43 '13 om 18:43 2013-01-31 18:43

Ik ben verrast dat niemand de interactieve modus vermeldt:

 git add -i 

Selecteer optie 3 om bestanden toe te voegen. In mijn geval wil ik vaak verschillende bestanden toevoegen: online kun je deze nummers gebruiken om bestanden toe te voegen. Het duurt slechts 4: 1,2,3,5

Om een ​​reeks te selecteren, voert u eenvoudig 1-5 in om alles van 1 tot 5 te nemen.

Git intermediaire bestanden

12
22 окт. Antwoord wordt gegeven door Jonathan op 22 oktober. 2015-10-22 16:03 '15 om 16.30 uur 2015-10-22 16:03

Om git te annuleren, gebruik toevoegen

git reset filename

12
02 окт. antwoord gegeven door Anirudh Sood 02 okt. 2016-10-02 18:54 '16 om 18:54 2016-10-02 18:54

git add myfile.txt # dit zal je bestand toevoegen aan de commit lijst

In tegenstelling tot dit commando,

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

U bent dus in de vorige toestand. De opgegeven zal opnieuw in de lijst voorkomen zonder trace (vorige status).

hij zal de kop resetten met het gespecificeerde bestand. dus als je hoofd het niet heeft, is het gewoon opnieuw ingesteld

8
27 июня '17 в 16:58 2017-06-27 16:58 Antwoord wordt gegeven door Mohideen ibn Mohammed op 27 juni '17 om 4:58 2017-06-29 17:58
 git reset filename.txt 

Verwijdert het bestand met de naam filename.txt uit de huidige index, het gedeelte "about to be commit", zonder iets te veranderen.

8
11 июля '16 в 21:40 2016-07-11 21:40 het antwoord wordt gegeven door Rahul Sinha 11 juli '16 om 21:40 uur 2016-07-11 21:40

In SourceTree kun je dit gemakkelijk doen via gui. U kunt controleren welk commando sourcetree gebruikt om het bestand uit te schakelen.

Ik heb een nieuw bestand gemaakt en dit aan git toegevoegd. Toen heb ik het uitgeschakeld met behulp van guit SourceTree. Dit is het resultaat:

Unstaging-bestanden [08/12/15 10:43]
git -c diff. mnemonicprefix = false -c core. quotepath = false -c referenties. helper = sourcetree reset -q - pad /to/file/filename.java

SourceTree gebruikt reset om nieuwe bestanden uit te schakelen.

7
08 дек. het antwoord wordt gegeven door miva2 08 dec. 2015-12-08 12:58 '15 om 12:58 2015-12-08 12:58
 git reset filename.txt 

Verwijdert het bestand met de naam filename.txt uit de huidige index, het gedeelte "about to be commit", zonder iets te veranderen.

6
26 окт. Antwoord van Joseph Mathew op 26 oktober 2017-10-26 21:15 17 om 21:15 2017-10-26 21:15
  • 1
  • 2

Zie andere vragen over labels of Stel een vraag