Як адмяніць '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> 

які выдаліць яго з бягучага індэкса (спіс "about to be commit") без змены чаго-небудзь яшчэ.

Вы можаце выкарыстоўваць

 git reset 

без якога-небудзь імя файла, каб адключыць ўсе змены. Гэта можа спатрэбіцца, калі занадта шмат файлаў будуць пералічвацца адзін за іншым у разумныя тэрміны.

У старых версіях Git прыведзеныя вышэй каманды эквівалентныя git reset HEAD <file> і git reset HEAD адпаведна, і не атрымаецца, калі HEAD - undefined (таму што вы яшчэ не здзейснілі ніякіх камітаў ў сваім РЭПО) або неадназначна (таму што вы стварылі галіна з імем HEAD , якая з'яўляецца дурной рэччу, якую вы не павінны рабіць). Гэты быў зменены ў Git 1.8.2 , хоць у сучасных версіях Git вы можаце выкарыстоўваць вышэйпрыведзеныя каманды яшчэ да стварэння ваша першая фіксацыя:

"Git reset" (без параметраў або параметраў), якія выкарыстоўваюцца для ў вас няма ніякіх фіксацый ў вашай гісторыі, але цяпер гэта дае вам пусты індэкс (для адпаведнасці non- існуючы commit вы нават не ўключаны).

8850
08 дек. адказ дадзены genehack 08 снеж. 2008-12-08 01:30 '08 у 01: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 add"

    => Знайсці перапаўненне стэка - ууу

  6. git reset.

    => Fatal: Не атрымалася вырашыць 'HEAD' у якасці сапраўднага спасылкі.

Акрамя таго, высвятляецца, што ў спісе рассылання зарэгістравана паведамленне пра памылку .

І што правільнае рашэнне было прама там, у выснове статусу Git (які, так, я назваў "лайном")

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 прагону і паглядзець, што будзе дададзена:

 git add -n . 

Я заархіваванага усё ў бяспечнае месца, перш чым давяраць git help rm пра тое, што --cached нічога не знішчае (і што, калі я яго няправільна напісаў).

2013
25 марта '09 в 19:20 2009-03-25 19:20 адказ дадзены Rhubarb 25 сакавіка '09 у 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 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 сент. адказ дадзены takeshin 10 сент. 2010-09-10 23:28 '10 у 23:28 2010-09-10 23:28

У дадатак да прынятага адказу, калі ваш памылкова даданыя файл быў велізарным, вы, верагодна, заўважыце, што нават пасля выдалення яго з індэкса з дапамогай " git reset " ён усё роўна займае месца ў каталогу .git . Пра гэта не варта турбавацца, файл сапраўды ўсё яшчэ знаходзіцца ў рэпазітары, але толькі як "свабодны аб'ект", ён не будзе скапіяваны ў іншыя рэпазітары (праз клон, push), і прастора ў канчатковым выніку будзе вызвалена - хоць магчыма, не вельмі хутка . Калі вы турбуецеся, вы можаце запусціць:

 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 здаецца першым (неотслеживаемый файл), мы хочам, каб "адмена" выдаляла файл (а не толькі бягучае змесціва) з адсочваных элементаў. Калі гэта так, тады можна запусціць git rm --cached <file> .

І мы таксама можам запусціць git reset HEAD <file> . У цэлым гэта пераважней, таму што гэта працуе ў абодвух сцэнарах: яно таксама адмяняе дзеянні, калі мы памылкова дадалі версію ўжо отслеженных элемента.

Але ёсць дзве агаворкі.

Па-першае: існуе (як паказана ў адказе) толькі адзін сцэнар, у якім git reset HEAD не працуе, але 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 .


* (Рэдагаваць: вышэйзгаданае практычна правільна, але ўсё ж могуць быць некалькі хакерскія / заблытаныя спосабы аднаўлення змяненняў, якія былі пастаўленыя, але не зафіксаваныя, а затым перапішуцца - гл. Каментары Ёханэса Матокича і iolsmit)

153
18 мая '11 в 21:05 2011-05-18 21:05 адказ дадзены leonbloy 18 мая '11 а 21:05 2011-05-18 21:05
 git rm --cached . -r 

будзе "un- дадаць" усё, што вы дадалі з бягучага каталога рэкурсіўна

89
10 дек. адказ дадзены braitsch 10 снеж. 2009-12-10 00:19 '09 у 0:19 2009-12-10 00:19

Run

 git gui 

і выдаліце ​​ўсе файлы ўручную або выбраўшы ўсе з іх і націснуўшы кнопку фіксацыі з фіксацыяй.

83
12 окт. адказ дадзены Khaja Minhajuddin 12 каст. 2011-10-12 04:12 '11 года ў 4:12 2011-10-12 04:12

Git мае каманды для кожнага дзеяння, якое толькі можна ўявіць, але мае патрэбу ў шырокіх ведах, каб усе выправіць, і з-за гэтага ён counter- інтуітыўна зразумелы ў лепшым выпадку ...

Што вы рабілі раней:

  • Зменены файл і выкарыстоўваецца git add . , Або git add <file> .

Што вы хочаце:

  • Выдаліце ​​файл з індэкса, але захавайце яго ў версіях і пакінеце з незафіксаваных зменамі ў рабочай копіі:

     git reset head <file> 
  • Reset файл з апошнім станам з 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 банкруцтва" і выдаліце ​​папку .git і пачніце з яе

58
19 нояб. адказ дадзены Paul Betts 19 лістапада. 2009-11-19 19:39 '09 у 19:39 2009-11-19 19:39

Як і ў многіх іншых адказах, вы можаце выкарыстоўваць git reset

АЛЕ:

Я знайшоў гэта выдатнае паведамленне, якое фактычна дадае каманду Git (ну аліяс) для git unadd : гл. Git unadd для дэталяў або ..

проста,

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

Цяпер вы можаце

 git unadd foo.txt bar.txt 
54
01 окт. адказ дадзены electblake 01 каст. 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 снеж. 2008-12-08 01:00 '08 ў 1:00 2008-12-08 01:00

Выкарыстоўвайце git add -i , каб выдаліць just- дададзеныя файлы з вашага мае быць камітаў. прыклад:

Даданне файла, які вам не патрэбны:

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

Што гэта! Тут ваша доказ, якое паказвае, што "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 у 15:53 2012-04-18 15:53

Тут можна пазбегнуць гэтай непрыемнай праблемы пры запуску новага праекту:

  • Стварыце асноўны каталог для вашага новага праекта.
  • Запусціце git init .
  • Цяпер стварыце файл .gitignore (нават калі ён пусты).
  • Зафіксуйце файл .gitignore.

Git робіць вельмі цяжкім зрабіць git reset , калі ў вас няма камітаў. Калі вы ствараеце малюсенькі першапачатковы комм толькі дзеля яго, пасля гэтага вы можаце git add -A і git reset столькі разоў, колькі хочаце, каб усё было правільна.

Іншым перавагай гэтага метаду з'яўляецца тое, што калі вы сутыкнецеся з line- праблемамі завяршэння пазней і вам трэба абнавіць усе вашы файлы, лёгка:

  • Адзначце, што пачатковая фіксацыя. Гэта прывядзе да выдалення ўсіх вашых файлаў.
  • Затым зноў праверце сваю апошнюю фіксацыю. Гэта прывядзе да аднаўлення свежых копій вашых файлаў, выкарыстоўваючы бягучыя налады заканчэння line-.
36
25 сент. адказ дадзены Ryan Lundy 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> tree 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 студз. 2012-01-23 19:57 '12 у 19:57 2012-01-23 19:57

Каб выдаліць новыя файлы з прамежкавай вобласці (і толькі ў выпадку новага файла), як было прапанавана вышэй:

 git rm --cached FILE 

Выкарыстоўваць rm --cached толькі для выпадкова дададзеных новых файлаў.

29
22 июня '09 в 14:58 2009-06-22 14:58 адказ дадзены Ran 22 чэрвеня '09 у 14:58 2009-06-22 14:58

У reset кожны файл у вызначанай тэчцы (і яе падтэчку) вы можаце выкарыстоўваць наступную каманду:

 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 адказ дадзены Donovan 19 мая '10 у 06: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 reset my_file.txt
  • git checkout my_file.txt

Для ўсіх дададзеных файлаў:

  • git reset
  • Git Checkout.

Заўвага: checkout змяняе код у файлах і пераходзіць у апошні абноўленае (пацверджанае) стан. скід не мяняе коды; ён проста скідае загаловак.

15
28 окт. адказ дадзены Hasib Kamal 28 каст. 2017-10-28 09:03 '17 у 09: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 add выкарыстоўвайце

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. 

Такім чынам, вы будзеце ў папярэднім стане. ўказаны будзе зноў у спісе без следу (папярэдні стан).

ён будзе reset галавой з паказаным файлам. таму, калі ваша галава не мае гэтага, гэта проста reset 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 з бягучага індэкса, вобласць "about to be commit", не змяняючы нічога.

8
11 июля '16 в 21:40 2016-07-11 21:40 адказ дадзены Rahul Sinha 11 ліпеня '16 ў 21:40 2016/07/11 21:40

У SourceTree вы можаце лёгка зрабіць гэта праз gui. Вы можаце праверыць, якая каманда sourcetree выкарыстоўвае, каб адключыць файл.

Я стварыў новы файл і дадаў яго ў git. Затым я адключыў яго, выкарыстоўваючы guit SourceTree. Гэта вынік:

Unstaging files [08/12/15 10:43]
git -c diff. mnemonicprefix = false -c core. quotepath = false -c ўліковыя дадзеныя. helper = sourcetree reset -q - шлях /to/file/filename.java

SourceTree выкарыстоўвае reset , каб адключыць новыя файлы.

7
08 дек. адказ дадзены miva2 08 снеж. 2015-12-08 12:58 '15 у 12:58 2015/12/08 00:58
 git reset filename.txt 

Выдаліць файл з імем filename.txt з бягучага індэкса, вобласць "about to be commit", не змяняючы нічога.

6
26 окт. адказ дадзены Joseph Mathew 26 каст. 2017-10-26 21:15 '17 а 21:15 2017/10/26 21:15
  • 1
  • 2

Іншыя пытанні па пазнаках або Задайце пытанне