Как да отмените „git add“ преди да извършите?

Погрешно добавих файлове към git с командата:

 git add myfile.txt 

Още не съм стартирал git commit . Има ли начин да се отмени това, така че тези файлове да не са включени в коммита?


В момента има 48 отговора (някои заличени). Моля, не добавяйте нова, ако нямате нова информация.

7856
08 дек. настроен от paxos1977 08 декември. 2008-12-08 00:57 '08 в 0:57 2008-12-08 00:57
@ 34 отговора
  • 1
  • 2

Можете да отмените git add преди да извършите

 git reset <file> 

което ще го премахне от текущия индекс (списък "да бъдеш ангажиран"), без да променя нищо друго.

Можете да използвате

 git reset 

без име на файл, за да забраните всички промени. Това може да е полезно, когато твърде много файлове са изброени един по един в разумен срок.

В по-стари версии на Git командите по-горе са еквивалентни на git reset HEAD <file> и git reset HEAD съответно, и няма да успее, ако HEAD е неопределен (защото не сте извършили никакви коммити в репо) или двусмислен (защото сте създали клон с Име HEAD , което е глупаво нещо, което не трябва да правите). Това беше променено в Git 1.8.2 , въпреки че в съвременните версии на Git можете да използвате горните команди, преди да създадете първия си ангажимент:

"git reset" (без параметри или параметри), използвани за вас, няма никакви ангажименти в историята ви, но сега ви дава празен индекс (за да съответства на несъществуващ ангажимент, дори не сте включени).

8850
08 дек. отговор е даден genehack 08 дек. 2008-12-08 01:30 '08 в 1:30 часа 2008-12-08 01:30

Вие искате:

 git rm --cached <added_file_to_undo> 

Обосновка:

Когато бях нов в това, за първи път се опитах

 git reset . 

(за да отмените всички мои първоначални качвания), само за да получа това (не много) полезно съобщение:

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

Оказва се, че това е така, защото връзката HEAD (клон?) Съществува само след първия ангажимент. Това означава, че ще срещнете същия проблем с начинаещите като мен, ако вашият работен процес, като моят, ще изглежда по следния начин:

  1. Отидете в новата ми директория на проекта, за да изпробвате Git, новото желание
  2. git init
  3. git add.
  4. git status

    ... много глупости ...

    > По дяволите, не исках да добавя всичко това.

  5. google "отмени git добави"

    => намиране на препълване на стека - ooh

  6. git reset.

    => фатално: Не може да се разреши 'HEAD' като валидна връзка.

Освен това се оказва, че в списъка за разпространение е регистрирано съобщение за грешка .

И че правилното решение беше точно там в изхода за състоянието на Git (което, да, наричах „crap“)

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

И решението наистина е да използвате git rm --cached FILE .

Обърнете внимание на предупрежденията на друго място - git rm изтрива вашето местно работно копие на файла, но не и ако използвате --cached . Ето резултатът от git help rm :

--cached Използвайте тази опция, за да премахнете и премахнете пътища само от индекса. Работните файлове, променени или не, ще останат.

Започвам да използвам

 git rm --cached . 

изтрийте всичко и започнете отначало. Тя не работи, защото, въпреки че add. е рекурсивно, се оказва, че rm нуждае от -r за рекурсия. Въздишка.

 git rm -r --cached . 

Добре, сега се връщам там, където започнах. Следващия път ще използвам -n за -n run и ще видя какво ще се добави:

 git add -n . 

Архивирах всичко на сигурно място, преди да се доверя на git help rm да кажа, че --cached не унищожава нищо (и какво, ако го написах погрешно).

2013
25 марта '09 в 19:20 2009-03-25 19:20 отговорът е даден от Rhubarb на 25 март 2009 г. в 19:20 2009-03-25 19:20

Ако въведете:

 git status 

git ще ви каже какво се урежда и т.н., включително инструкции за това как да прекъснете връзката:

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

Намирам, че git прави доста добра работа, подтикваща ме да върша правилното нещо в тези ситуации.

Забележка. Последните версии на git (1.8.4.x) са променили това съобщение:

 (use "git rm --cached <file>..." to unstage) 
498
08 дек. Отговорът е даден от Paul Beckingham 08 декември. 2008-12-08 02:22 '08 в 2:22 am 2008-12-08 02:22

За да се изясни: git add движи промените от текущата работна директория на междинна област (индекс).

Този процес се нарича междинен. Следователно най-естествената команда за промяна на промените (модифицирани файлове) е очевидна:

 git stage 

git add е просто псевдоним за git stage

Жалко е, че няма никакви git unstage и git unadd . Съответният въпрос е по-труден за отгатване или запомняне, но съвсем очевидно:

 git reset HEAD -- 

Лесно можем да създадем псевдоним за това:

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

И накрая, имаме нови екипи:

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

Лично аз използвам дори по-къси псевдоними:

 git a #for staging git u #for unstaging 
232
10 сент. Отговорът е 10 септември. 2010-09-10 23:28 '10 в 23:28 2010-09-10 23:28

В допълнение към приетия отговор, ако вашият погрешно добавен файл е огромен, вероятно ще забележите, че дори след като го изтриете от индекса, използвайки " git reset ", той все още се извършва в директорията .git . Не трябва да се притеснявате, че файлът все още е в хранилището, но само като "свободен обект", няма да бъде копиран в други хранилища (чрез клонинг, натискане) и пространството в крайна сметка ще бъде освободено - макар че може би не много скоро , Ако се притеснявате, можете да стартирате:

 git gc --prune=now 

Актуализация (по-нататък ще се опитам да премахна известно объркване, което може да възникне от отговорите с най-голям брой гласове):

И така, какво е истинската отмяна на git add ?

git reset HEAD <file> ?

или

git rm --cached <file> ?

Строго погледнато, и ако не греша: не .

git add не може да се отмени - безопасно, като цяло.

Нека първо да запомним какво прави git add <file> :

  1. Ако <file> не е бил проследен по-рано , git add го добавя в кеша с неговото текущо съдържание.

  2. Ако <file> вече е проследен , git add записва текущото съдържание (моментна снимка, версия) в кеша. В GIT това действие все още се нарича добавяне (и не само актуализиране), защото две различни версии (моментни снимки) на файл се третират като два различни елемента: следователно, добавяме нов елемент в кеша, така че да се направи по-късно.

В светлината на това, въпросът е малко двусмислен:

Погрешно добавих файлове с помощта на командата ...

OP скрипта изглежда е първият (непроследим файл), искаме "undo" да изтрие файла (а не само текущото съдържание) от проследените елементи. Ако е така, можете да стартирате git rm --cached <file> .

Можем да стартираме и git reset HEAD <file> . По принцип това е за предпочитане, защото работи и в двата сценария: също така отменя действия, когато по погрешка добавихме версия на вече проследен елемент.

Но има две възражения.

Първо: има (както е посочено в отговора) само един скрипт, в който git reset HEAD не работи, но git rm --cached работи: ново хранилище (без git rm --cached ). Но всъщност това е практически без значение.

Второ, имайте предвид, че git reset HEAD не може да възстанови магически предварително съдържанието на кеширани файлове, просто го синхронизира отново с HEAD. Ако неправилното ни git add презаписало предишната неиздадена версия, няма да можем да я възстановим. Следователно, строго погледнато, не можем да отменим [*].

например:

 $ 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 

Разбира се, това не е много важно, ако просто следваме обичайния мързелив работен процес на изпълнение на 'git add' само за добавяне на нови файлове (случай 1), и обновяваме новото съдържание с командата commit, git commit -a .


* (Редактиране: Горното е почти правилно, но все още може да има няколко хакерски / заплетени начина за възстановяване на доставените промени, но не фиксирани, а след това презаписани - виж Коментарите на Йоханес Матокич и Йолсмит)

153
18 мая '11 в 21:05 2011-05-18 21:05 Отговорът е даден от leonbloy на 18 май '11 в 21:05 2011-05-18 21:05
 git rm --cached . -r 

ще рециклира всичко, което сте добавили от текущата директория

89
10 дек. отговор, даден от braitsch 10 декември. 2009-12-10 00:19 '09 в 0:19 2009-12-10 00:19

тичам

 git gui 

и изтриване на всички файлове ръчно или чрез избиране на всички и натискане на бутона за предаване с commit.

83
12 окт. Отговор, даден от Khaja Minhajuddin на 12 октомври 2011-10-12 04:12 '11 в 4:12 часа в 2011-10-12 04:12

Git има команди за всяко действие, което можете да си представите, но се нуждаят от задълбочени познания, за да направят нещата правилни и поради това е най-добре противоположното ...

Какво сте правили преди:

  • Променихте файла и използвайте git add . или git add <file> .

Какво искате:

  • Премахнете файла от индекса, но го запазете във версиите и оставете незавършените промени в работното копие:

     git reset head <file> 
  • Нулирайте файла с последното състояние от HEAD, като отхвърлите промените и ги изтриете от индекса:

29 марта '13 в 14:14 2013-03-29 14:14 отговорът е даден sjas март 29, '13 в 14:14 2013-03-29 14:14

За да анулирате вече добавен файл е много просто, използвайки git , за да възстановите вече добавената myfile.txt , използвайте:

 git reset HEAD myfile.txt 

обяснявам

След като поставите ненужните файлове за отмяна, можете да git reset , Head е git reset на файла в локалната мрежа, а последният параметър е името на вашия файл.

Създавам стъпките, показани на фигурата по-долу, по-подробно за вас, включително всички стъпки, които могат да възникнат в следните случаи:

2019

Ясно е, че въпросът не е зададен. Причината е, че git add има две значения:

  • добавете нов файл в областта за поставяне, след това отменете с git rm --cached file .
  • Добавяне на файл, който е бил модифициран в областта за поставяне, след това го откажете с git reset HEAD file .

ако имате съмнения, използвайте

 git reset HEAD file 

Защото и в двата случая очакваното нещо се очаква.

Предупреждение: ако направите git rm --cached file във файла се променя (файлът, който по-рано съществуваше в хранилището), тогава файлът ще бъде изтрит в git commit ! Той все още ще съществува във вашата файлова система, но ако някой друг извади ангажимента ви, файлът ще бъде премахнат от работното му дърво.

git status ви казва дали файлът е нов или променен :

 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 янв. Отговорът е даден от Michael_Scharf 16 януари 2014-01-16 22:54 '14 в 22:54 ч. 2014-01-16 22:54

Ако използвате оригиналния си ангажимент и не можете да използвате git reset, просто декларирайте "Git bankruptcy" и изтрийте папката .git и започнете с нея

58
19 нояб. Отговор, даден от Пол Бетс 19 ноември 2009-11-19 19:39 '09 в 19:39 2009-11-19 19:39

Както и при много други отговори, можете да използвате git reset

НО:

Намерих това чудесно съобщение, което всъщност добавя команда git unadd (добре, псевдоним) за git unadd : виж git unadd за подробности или ..

просто

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

Сега можете

 git unadd foo.txt bar.txt 
54
01 окт. отговорът се дава от electblake 01 oct. 2010-10-01 17:54 '10 в 17:54 2010-10-01 17:54

git remove или git rm могат да бъдат използвани за това с флаг --cached . Опитайте:

 git help rm 
45
08 дек. отговорът е даден от gnud 08 dec. 2008-12-08 01:00 '08 в 1:00 2008-12-08 01:00

Използвайте git add -i да премахнете току-що добавените файлове от предстоящия ви ангажимент. например:

Добавяне на файл, от който не се нуждаете:

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

Активирайте интерактивното добавяне, за да отмените добавянето (командите, въведени в git тук: "r" (връщане), "1" (първото вписване в списъка ще се върне), "връщане" за излизане от режима на връщане и "q" (изход):

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

Какво е това? Ето вашето доказателство, показващо, че „foo“ се връща в списъка без следа:

 $ 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 на 18 април 2012-04-18 15:53 '12 в 3:53 pm 2012-04-18 15:53

Тук можете да избегнете този неприятен проблем при стартирането на нов проект:

  • Създайте основна директория за новия си проект.
  • Стартирайте git init .
  • Сега създайте .gitignore файл (дори и да е празен).
  • Фиксирайте файла .gitignore.

Git прави много трудно да се направи git reset ако нямате ангажименти. Ако създадете малък първоначален ангажимент само заради него, тогава можете да git add -A и git reset толкова пъти, колкото искате всичко да е правилно.

Друго предимство на този метод е, че ако по-късно срещнете проблеми със завършването на редовете и трябва да актуализирате всичките си файлове, е лесно:

  • Обърнете внимание, че първоначалното коригиране. Това ще изтрие всичките ви файлове.
  • След това проверете отново последния си запис. Това ще възстанови пресните копия на вашите файлове, използвайки текущите настройки за края на реда.
36
25 сент. отговорът е даден от Райън Лунди 25 сеп. 2011-09-25 02:34 '11 в 2:34 на 2011-09-25 02:34

Може би Git се е развил, откакто публикувахте въпроса си.

 $> git --version git version 1.6.2.1 

Сега можете да опитате:

 git reset HEAD . 

Това трябва да е това, което търсите.

32
19 нояб. Отговорът е даден от Kokotte23 19 ноември. 2009-11-19 19:38 '09 в 19:38 2009-11-19 19:38

Обърнете внимание, че ако не сте задали ревизия, трябва да включите разделител. Пример от конзолата ми:

 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 версия 1.7.5.4)

32
23 янв. отговорът е даден powlo 23 jan. 2012-01-23 19:57 '12 в 19:57 2012-01-23 19:57

За да премахнете нови файлове от зоната за спиране (и само в случай на нов файл), както е предложено по-горе:

 git rm --cached FILE 

Използвайте rm - кеш само за случайно добавени нови файлове.

29
22 июня '09 в 14:58 2009-06-22 14:58 отговорът е даден на Ran на 22.06.09 в 14:58 2009-06-22 14:58

При нулиране на всеки файл в определена папка (и подпапките) можете да използвате следната команда:

 git reset * 
23
26 июля '12 в 10:50 2012-07-26 10:50 отговорът е даден Zorayr 26 юли '12 в 10:50 ч. 2012-07-26 10:50

използвайте командата * за обработка на множество файлове наведнъж

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

и така нататък

23
28 авг. boulder_ruby е отговор 28 авг. 2013-08-28 00:15 '13 в 0:15 2013-08-28 00:15

Просто напишете git reset , ще се върне и изглежда, че никога не сте влизали в git add . след последния ангажимент. Не забравяйте да направите това и преди.

21
19 мая '10 в 6:49 2010-05-19 06:49 Отговор е даден от Донован на 19 май '10 в 6:49 2010-05-19 06:49

Да предположим, че създавам нов файл newFile.txt .

2019

04 окт. отговорът е даден от Vidura Mudalige 04 окт. 2016-10-04 14:02 '16 в 14:02 часа 2016-10-04 14:02

За конкретен файл:

  • git нулиране my_file.txt
  • git checkout my_file.txt

За всички добавени файлове:

  • git нулиране
  • Gut checkout.

Забележка: Checkout променя кода в файловете и преминава към последно актуализирано (потвърдено) състояние. нулирането не променя кодовете; той просто пуска заглавието.

15
28 окт. отговорът е даден от Хасиб Камал на 28 октомври. 2017-10-28 09:03 '17 в 9:03 2017-10-28 09:03

Тази команда променя промените ви:

 git reset HEAD filename.txt 

Можете също да използвате

 git add -p 

за добавяне на части от файлове.

12
31 янв. Отговорът е даден wallerjake 31 януари 2013-01-31 18:43 '13 в 18:43 2013-01-31 18:43

Изненадан съм, че никой не споменава интерактивен режим:

 git add -i 

Изберете опция 3, за да добавите файлове. В моя случай често искам да добавя няколко файла, онлайн, можете да използвате тези номера, за да добавяте файлове. Отнема само 4: 1,2,3,5

За да изберете последователност, просто въведете 1-5, за да вземете всичко от 1 до 5.

Git междинни файлове

12
22 окт. Отговорете на Jonathan 22 октомври. 2015-10-22 16:03 '15 в 16:03 2015-10-22 16:03

За да отмените git добавете използване

git reset filename

12
02 окт. отговор, даден от Anirudh Sood 02 окт. 2016-10-02 18:54 '16 в 18:54 2016-10-02 18:54

git add myfile.txt # това ще добави вашия файл към списъка за фиксиране

За разлика от тази команда,

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

Така че ще бъдете в предишното състояние. посоченото ще бъде отново в списъка без следа (предишно състояние).

Той ще нулира главата с посочения файл. така че ако главата ви няма такава, просто я нулирайте

8
27 июня '17 в 16:58 2017-06-27 16:58 Отговорът е даден от Mohideen ibn Mohammed на 27 юни '17 в 16:58 2017-06-27 16:58
 git reset filename.txt 

Премахва файла с име filename.txt от текущия индекс, областта "за да се ангажира", без да променя нищо.

8
11 июля '16 в 21:40 2016-07-11 21:40 Отговорът е даден от Rahul Sinha на 11 юли 2011 г. в 21:40 часа 2016-07-11 21:40

В SourceTree лесно можете да направите това чрез GUI. Можете да проверите коя команда използва sourcetree, за да деактивирате файла.

Създадох нов файл и го добавих в git. След това го изключих, използвайки guit SourceTree. Това е резултат:

Премахване на файлове [08/12/15 10:43]
git -c diff. mnemonicprefix = фалшиво -c ядро. quotepath = фалшиви -c идентификационни данни. helper = sourcetree reset -q - път / към / файл / файл.java

SourceTree използва reset да деактивира новите файлове.

7
08 дек. отговорът е даден от miva2 08 декември. 2015-12-08 12:58 '15 в 12:58 2015-12-08 12:58
 git reset filename.txt 

Премахва файла с име filename.txt от текущия индекс, областта "за да се ангажира", без да променя нищо.

6
26 окт. Отговор, даден от Джозеф Матю на 26 октомври 2017-10-26 21:15 '17 в 21:15 2017-10-26 21:15
  • 1
  • 2

Други въпроси относно етикети или Ask a Question