Як скасувати '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 о 1:30 2008-12-08 1: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 2: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 4: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 1: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 2: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 в 6:49 2010-05-19 6: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 о 9:03 2017-10-28 9: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 12: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

Інші питання по мітках або Задайте питання