Як скасувати "git add" перед фіксацією?


8958

Я помилково додав файли до Git за допомогою команди:

git add myfile.txt

Я ще не бігав git commit. Чи є спосіб скасувати це, щоб ці файли не були включені до комітету?


22
Починаючи з Git версії 1.8.4, всі відповіді нижче , що використовують HEADабо headможуть тепер використовувати @замість HEADзамість цього. Дивіться цю відповідь (останній розділ), щоб дізнатися, чому ви можете це зробити.

3
Я зробив трохи Summery , яка показує всі способи прибрати з буфера файлу: stackoverflow.com/questions/6919121 / ...
Daniel Альдер

5
Чому б не вийти з каси?
Ерік Reppen

13
@ErikReppen git checkoutне видаляє поетапні зміни з індексу комісій . Він повертає лише нестадійні зміни до останньої вчиненої редакції - яка, до речі, не є такою, яку я хочу, я хочу цих змін, я просто хочу їх у подальшому виконанні.
paxos1977

4
Якщо ви використовуєте Eclipse, це так само просто, як зніміть прапорці з файлів у діалоговому вікні "фіксація"
Hamzahfrq

Відповіді:


10363

Ви можете скасувати, git addперш ніж здійснити коммісію

git reset <file>

який видалить його з поточного індексу (список "збирається зробити"), не змінюючи нічого іншого.

Можна використовувати

git reset

без жодного імені файлу, щоб усунути всі належні зміни. Це може стати в нагоді, коли занадто багато файлів повинні бути перераховані один за одним за розумну кількість часу.

У старих версіях Git вищезазначені команди є еквівалентними git reset HEAD <file>і git reset HEADвідповідно, і вони вийдуть з ладу, якщо їх HEADне визначено (тому що ви ще не зробили жодних комісій у вашому сховищі) або неоднозначними (тому що ви створили гілку з назвою HEAD, що є дурною справою що ти не повинен робити). Це було змінено в Git 1.8.2 , тому в сучасних версіях Git ви можете використовувати команди, наведені вище, ще до того, як зробити перший запис:

"git reset" (без параметрів чи параметрів), що використовується для виправлення помилок, коли у вас немає жодних комісій у вашій історії, але тепер він дає порожній індекс (для відповідності неіснуючій комісії, на яку ви навіть не входите).


92
Звичайно, це не є справжнім скасуванням, тому що якщо неправильна git addзаміна попередньої поетапної невмілої версії, ми не можемо її відновити. Я намагався уточнити це у своїй відповіді нижче.
leonbloy

7
git reset HEAD *.extде extфайли даного розширення, яке ви хочете скасувати. Для мене це було *.bmp&*.zip
boulder_ruby

18
@Jonny, індекс (він же область постановки) містить усі файли, а не лише змінені файли. Він "починає життя" (коли ви перевіряєте комміт або клонуєте репо) як копію всіх файлів у комітеті, на які вказує HEAD. Отже, якщо ви видалите файл з індексу ( git rm --cached), це означає, що ви готуєтеся взяти зобов’язання, яке видаляє цей файл. git reset HEAD <filename>з іншого боку, буде скопійовано файл з HEAD до індексу, так що наступний комітет не відображатиме жодних змін до цього файлу.
Wildcard

11
Я щойно виявив, що існує такий, git reset -pяк git add -p. Це круто!
donquixote

10
Ви фактично можете відновити перезаписані раніше поетапні, але некомплектні зміни, але не по-дружньому і не на 100% захищені (принаймні жодного я не знайшов): goto .git / об’єкти, пошук файлів, створених у момент, коли git addви хочете відновити ( 61/3AF3...- > ідентифікатор об'єкта 613AF3...), то git cat-file -p <object-id>(можливо, варто було б відновити кілька годин роботи, але й урок, щоб частіше вчиняти ...)
Пітер Шнайдер

2151

Ти хочеш:

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"

    => знайти стек переповнення - yay

  6. git reset .

    => fatal: Не вдалося вирішити 'HEAD' як дійсний номер.

Далі з'ясовується, що в списку розсилки є помилка, зареєстрована проти непристосованості цього.

І щоб правильне рішення було саме там, у вихідному статусі Git (який, так, я заглянув як "лайно")

...
# 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зроблю сухий пробіг і подивіться, що буде додано:

git add -n .

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


15
Ха-ха. Я стежив за цим самим процесом. За винятком того, що я здався і сказав rm -rf .git, git initбо не довіряв git rm --cachedзберігати свою робочу копію. Це трохи говорить про те, як git у деяких місцях все ще надмірно складний. git unstageмає бути просто стандартною командою, мені байдуже, чи можу я додати її як псевдонім.
Адріан Макнейл

5
Для мене git кажеgit reset HEAD <File>...
drahnr

16
git rm --cached <file> - насправді правильна відповідь, якщо це початковий імпорт <file> у сховище. Якщо ви намагаєтесь зняти зміни у файлі, правильна відповідь - скидання git. Люди, які кажуть, що ця відповідь неправильна, думають про інше питання.
Баррі Келлі

14
Це фактично спрацює, але лише при першому фіксації, де файл раніше не існував, або де git addкоманда додала нові файли, але не змінює існуючі файли.
naught101

4
просто показує, наскільки неінтуїтивним і перекрученим є git. замість того, щоб мати паралельні команди "скасувати", ви повинні з'ясувати, як їх скасувати. Як спробувати звільнити ногу в швидкому піску, а потім застрягнути руку, потім застрягнути іншу руку ... кожну команду слід виконувати через графічний інтерфейс, з пунктами меню, що випадає, для варіантів ... Подумайте про всі користувальницькі інтерфейси, підвищення продуктивності у нас було, але у нас це безлад інтерфейсу ретро командного рядка. Це не так, як програми git GUI роблять це більш інтуїтивно зрозумілим.
ahnbizcad

532

Якщо ви введете:

git status

Git розповість, що ставиться та ін., Включаючи інструкції щодо знеструмлення:

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

Я вважаю, що Git робить досить гарну роботу, підштовхуючи мене до того, щоб зробити правильну справу в таких ситуаціях.

Примітка. Останні версії Git (1.8.4.x) змінили це повідомлення:

(use "git rm --cached <file>..." to unstage)

19
Повідомлення буде різним залежно від того, чи addвже відслідковувався ed-файл ( addєдиний збережений нову версію в кеш - тут він покаже ваше повідомлення). В іншому випадку, якщо файл не був попередньо інсценований, він відобразитьсяuse "git rm --cached <file>..." to unstage
leonbloy

Чудово! git reset HEAD <file>Один єдиний , який буде працювати в разі , якщо ви хочете прибрати з буфера файлу видалення
skerit

2
Моя версія git 2.14.3 говорить git reset HEADпро нестабільність.
SilverWolf - Відновіть Моніку

246

Для уточнення: 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

3
"рухається"? Це вказувало б, що воно пішло з робочого каталогу. Це не так.
Томас Веллер

4
Чому це очевидно?
Ленар Хойт

Насправді git stageце псевдонім для git add, що є історичною командою, як на Git, так і на інших SCM. Він був доданий у грудні 2008 року з командою 11920d28da у "сховище git git", якщо я можу сказати.
Обсидіан

1
Це може бути не пов’язано, але я виявив, що перевірка файлу перед тим, як додати навіть корисну ідею, щось на кшталт check-command filename && git add filename, я замінив git на коротший g у своїй машині, і до цього часу він працював добре для мене: github.com/dataf3l/g , я не знаю, чи це комусь стане в нагоді, але я викладу це тут, сподіваючись, що це заощадить час людей.
Феліпе Вальдес

167

На додаток до прийнятої відповіді, якщо ваш помилково доданий файл був величезним, ви, ймовірно, помітите, що навіть після вилучення його з індексу із символом ' 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 ця дія все ще називається додати (не просто її оновити ), оскільки дві різні версії (знімки) файлу розглядаються як два різні елементи: отже, ми дійсно додаємо новий елемент у кеш, щоб бути зрештою вчинено пізніше.

Зважаючи на це, питання є дещо неоднозначним:

Я помилково додав файли за допомогою команди ...

Сценарій ОП, здається, перший (неповернутий файл), ми хочемо, щоб "скасувати" видалив файл (не лише поточний вміст) з відстежуваних елементів. Якщо це так, то нормально бігати 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 irrevocably lost "version 2"
-version 1
+version 3

Звичайно, це не дуже важливо, якщо ми просто дотримуємося звичайного ледачого робочого процесу, роблячи «git add» лише для додавання нових файлів (випадок 1), і ми оновлюємо новий вміст за допомогою команди комітування, git commit -aкоманда.


* (Редагувати: вищезазначене практично правильно, але все ж можуть бути кілька зловмисних / заплутаних способів відновлення змін, які були інсценовані, але не скоєні та перезаписані - див. Коментарі Йоханнеса Матокича та iolsmit)


4
Строго кажучи, існує спосіб відновити вже поетапний файл, замінений на git add. Як ви згадуєте git add, створює об’єкт git для цього файлу, який стане вільним об'єктом не тільки при повному видаленні файлу, але і при перезаписі новим вмістом. Але немає команди, щоб автоматично відновити її. Натомість файл слід ідентифікувати та витягувати вручну або за допомогою інструментів, написаних лише для цього випадку (libgit2 це дозволить). Але це виплатить лише в тому випадку, якщо файл дуже важливий і великий і його не вдасться відновити за допомогою редагування попередньої версії.
Йоганнес Матокич

2
Щоб виправити себе: Після того, як знайдений вільний файл об'єкта (використовуйте метадані, такі як дата / час створення), git cat-fileможна було б використовувати для відновлення його вмісту.
Йоганнес Матокич

2
Інший спосіб відновити зміни , які були поставлені , але не були зафіксовані , а потім переписані на інший , наприклад , git addце через git fsck --unreachableякий буде список всіх недосяжний OBJ, який ви можете оглянути на git show SHA-1_IDабо git fsck --lost-foundщо буде> Запис висячих об'єктів в .git/lost-found/commit/або .git/lost-found/other/, в залежності від типу. Дивіться такожgit fsck --help
iolsmit

110

Скасувати вже доданий файл досить просто за допомогою Git. Для скидання myfile.txt, які вже додано, використовуйте:

git reset HEAD myfile.txt

Пояснення:

Після того, як ви влаштували непотрібні файли, скасувати їх можна git reset. Headє головою вашого файлу в локальному і останній параметр - ім'я вашого файлу.

Я створив кроки на зображенні нижче для більш детальної інформації, включаючи всі кроки, які можуть статися в цих випадках:

git скидання файлу HEAD


Зображення: "Команда додає ...""Команда додає ..." ( теперішній простий час, третя особа )
Пітер Мортенсен

Зображення: хочетехочу (тут не потрібно використовувати сленг)
Peter Mortensen

92
git rm --cached . -r

буде "скасовувати" все, що ви додали з поточного каталогу, рекурсивно


3
Я не шукав, щоб скасувати все, лише ОДИН конкретний файл.
paxos1977

3
Також корисно, якщо у вас немає жодних попередніх зобов’язань. За відсутності попереднього зобов’язання, git reset HEAD <file>сказали бfatal: Failed to resolve 'HEAD' as a valid ref.
Priya Ranjan Singh

6
Ні, це додає до делеции всього в поточному каталозі. Дуже відрізняється від просто нестабільних змін.
Марк Амері

88

Біжи

git gui

і видаліть усі файли вручну або, вибравши їх усі та натиснувши кнопку " нестабільність" від кнопки фіксації .


1
Так, я це розумію. Я хотів лише неявно запропонувати вам вказати, що у вашій відповіді на кшталт "Ви можете використовувати git-gui...." :)
Олександр Сурафель

1
Там написано: "git-gui: команда не знайдена". Я не впевнений, чи це працює.
Парінда Раджапакша

Нічого собі, це дуже просто, ніж робити командні рядки, які ви не зрозуміли. Це, безумовно, рекомендується для початківців, як я. Дякуємо, що написали це!
Ірфанді Джип

Дякую. Не хотів ризикувати, тому довелося використовувати графічний інтерфейс.
Сагар Хатрі

83

У Git є команди для кожної дії, які можна уявити, але для знаходження справ потрібні широкі знання, а тому в кращому випадку він є протиінтуїтивним ...

Що ви робили раніше:

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

Що ти хочеш:

  • Вийміть файл з індексу, але нехай він залишається впорядкованим і залишений із невідомими змінами в робочій копії:

    git reset head <file>
    
  • Скиньте файл до останнього стану з HEAD, скасувавши зміни та видаливши їх з індексу:

    # Think `svn revert <file>` IIRC.
    git reset HEAD <file>
    git checkout <file>
    
    # If you have a `<branch>` named like `<file>`, use:
    git checkout -- <file>

    Це потрібно, оскільки git reset --hard HEADне працюватиме з одним файлом.

  • Видаліть <file>з індексу та версії, зберігаючи необроблений файл із змінами в робочій копії:

    git rm --cached <file>
    
  • <file>Повністю видаліть із робочої копії та версії версії:

    git rm <file>
    

1
Я не можу витримати різницю "git reset head <file>" та "git rm --cached <file>. Чи можете ви пояснити це?
jeswang

6
Файли @jeswang або "відомі" для git (зміни в них відслідковуються.), або вони не "модифіковані". reset headскасовує ваші поточні зміни, але git все ще контролюється. rm --cachedвиймає файл з версії, тому git більше не перевіряє його на зміни (а також видаляє зрештою індексовані теперішні зміни, про які казав git попереднім add), але змінений файл зберігатиметься у вашій робочій копії, тобто у папці файлів на жорсткому диску.
sjas

3
Різниця git reset HEAD <file>тимчасова - команда буде застосована лише до наступного git rm --cached <file>комітету , але буде нестабільною, поки вона знову не буде додана git add <file>. Крім того, git rm --cached <file>означає, що якщо ви натиснете цю гілку на віддалений, кожен, хто потягне гілку, отримає файл АКТИВНО видалений зі своєї папки.
DrewT

80

Питання чітко не ставиться. Причина в тому, що git addвона має два значення:

  1. додавання нового файлу до області постановки, а потім скасувати git rm --cached file.
  2. додавши модифікований файл до області постановки, а потім скасувати 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

7
+1. Надзвичайна кількість висококваліфікованих відповідей та коментарів на цій сторінці - це просто невірна помилка щодо поведінки git rm --cached somefile. Я сподіваюся, що ця відповідь пробиває сторінку на чільне місце, де вона може захистити новачків від введення в оману всіх помилкових претензій.
Марк Амері

одна з найкращих відповідей тут, на жаль, вона є досить низькою у списку
Creos

64

Якщо ви перебуваєте на початковому зобов’язанні і не можете скористатися git reset, просто оголосіть "Git банкрутства" та видаліть .gitпапку та починайте спочатку


5
Одна порада - скопіювати .git / config файл, якщо ви додали віддалене походження, перед видаленням папки.
Тіаго

4
Коментар @ChrisJohnsen - це місце. Іноді потрібно зафіксувати всі файли, крім одного: git add -A && git rm --cached EXCLUDEFILE && git commit -m 'awesome commit' (Це також працює, коли попередніх Failed to resolve 'HEAD'

57

Відповідно до багатьох інших відповідей, ви можете використовувати git reset

АЛЕ:

Я знайшов цей чудовий маленький пост, який фактично додає команду Git (ну псевдонім) для git unadd: див. Git unadd для деталей або ..

Просто,

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

Тепер ти можеш

git unadd foo.txt bar.txt

45

Використовуйте 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" (перший запис у списку повернення показує), "return", щоб вийти з режиму повернення, і "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)
$

42

git removeабо git rmможна використовувати для цього за допомогою --cachedпрапора. Спробуйте:

git help rm

9
Хіба це не видалить файл взагалі?
Вілла

8
git rm --cached ...видалить файли з git repo. Вони все ще існуватимуть на вашому комп’ютері, але це ДУЖЕ відрізняється від нестабільних змін у файлі. Для тих, хто натрапляє на це, це не вагома відповідь на питання.
Аддісон

38

Ось спосіб уникнути цієї неприємної проблеми, коли ви починаєте новий проект:

  • Створіть основний каталог для вашого нового проекту.
  • Біжи git init.
  • Тепер створіть файл .gitignore (навіть якщо він порожній).
  • Введіть файл .gitignore.

Git робить це дуже важко зробити, git resetякщо у вас немає жодних зобов'язань. Якщо ви створюєте крихітну початкову дію лише заради того, щоб мати її, після цього ви можете git add -Aі git resetстільки разів, скільки захочете, щоб все було правильно.

Ще одна перевага цього методу полягає в тому, що якщо ви зіткнулися з неполадкими пізніше і вам потрібно буде оновити всі файли, це легко:

  • Ознайомтеся з початковою комією Це видалить усі ваші файли.
  • Потім знову перегляньте останню версію. Це дозволить отримати нові копії ваших файлів, використовуючи ваші поточні налаштування рядка.

1
Підтверджено! Спробували скинути git після додавання git. і git скаржився на корумповану ГОЛОВУ. Дотримуючись ваших порад, я можу без проблем додавати та скидати назад і назад :)
Kounavi

1
Друга частина працює, але трохи незграбна. Як обробляються закінчення рядків, залежить від autocrlfзначення ... Це не працюватиме в кожному проекті, залежно від налаштувань.
sjas

1
Ця відповідь була обґрунтованою на момент її опублікування, але зараз застаріла; git reset somefileі git resetобидва працюють до того, як зробити перший зобов’язання, зараз. Так було вже з кількох версій Git.
Марк Амері

@MarkAmery, ви можете мати рацію (було б здорово, якщо ви опублікували джерело для свого твердження), але все ж є значення, коли ви починаєте репо з чистого доручення чи двох.
Райан Лунді

34

Можливо, Git розвинувся з моменту, коли ви опублікували своє запитання.

$> git --version
git version 1.6.2.1

Тепер ви можете спробувати:

git reset HEAD .

Це має бути те, що ви шукаєте.


2
Зрозуміло, але тоді у вас з’являється наступне питання про те, як слід скасувати додавання одного з двох (або більше) файлів. У посібнику "скидання git" вказується, що "git reset <paths" "є протилежним до" git add <paths ", однак.
Алекс Норт-Кіс

34

Зауважте, що якщо не вдалося вказати версію, вам доведеться включити роздільник. Приклад з моєї консолі:

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)


2
Я спробував, git reset <path>і це працює чудово без роздільника. Я також використовую git 1.9.0. Можливо, це не працює в старих версіях?

31

Щоб видалити нові файли з області постановки (і лише у випадку нового файлу), як було запропоновано вище:

git rm --cached FILE

Використовуйте rm --cached лише для нових випадково доданих файлів.


4
Майте на увазі, що --cachedтут справді важлива частина.
приймає

1
-1; ні, цей файл не знімає стадії, він стадіює видалення файлу (не фактично видаляючи його з робочого дерева).
Марк Амері

25

Щоб скинути кожен файл у певній папці (та її підпапках), ви можете скористатися такою командою:

git reset *

4
Насправді, це не скидає кожен файл, оскільки * використовує розширення оболонки і ігнорує dotfiles (і dot-каталоги).
Люк

Ви можете запустити, git statusщоб побачити все, що залишилося, і скинути його вручну, тобто git reset file.
Зорайр

25

Використовуйте *команду для обробки декількох файлів одночасно:

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

тощо.


3
Майте на увазі, що * зазвичай не включатиме точкові файли або "крапки-довідники", якщо ви прямо не вказали .*або.*.prj
Люк

23

Просто введіть git resetйого назад, і це так, як ви ніколи не вводили git add .з моменту останнього вчинення. Переконайтеся, що ви здійснили раніше.


Як це буває, було останнє зобов’язання ... але я спеціально просив про видалення одного файлу з фіксації, а не кожного файлу з комісії.
paxos1977

20

Припустимо, я створюю новий файл newFile.txt:

Введіть тут опис зображення

Припустимо, я додаю файл випадково git add newFile.txt:

Введіть тут опис зображення

Тепер я хочу скасувати це додавання перед фіксацією git reset newFile.txt:

Введіть тут опис зображення


Припустимо, я перебуваю на 1-му малюнку, що означає, що я навіть не робив "git.add". Також я зовсім не хочу, щоб все це змінилося. Я маю на увазі, коли я роблю статус git, він не повинен показувати жодних червоних файлів. Я маю на увазі, що він повинен синхронізуватися так, ніби не було змінено жодного файлу з часу останнього натискання git. як цього досягти.
Незламний

Тож припустимо, що ти лише на першому кроці. І ви хочете позбутися від усіх змін, які ви внесли, завдяки чому "newFile.txt" вийшов червоним.
Незламний

Коли я займаюся статусом git. Я взагалі не повинен бачити жодних змін. Усі червоні файли повинні бути повернені.
Незламний

Привіт, я думаю, що ваше питання полягає в тому, як видалити незатребувані файли з поточного дерева. Для цього можна використовувати "git clean -f -d". Це також видалить неперевірені каталоги.
Vidura Mudalige

Якщо ви не хочете видалити незараховані файли, просто проігноруйте прапор "-f".
Vidura Mudalige

19

Для конкретного файлу:

  • git скидання my_file.txt
  • git checkout my_file.txt

Для всіх доданих файлів:

  • git reset.
  • git checkout.

Примітка. Каса змінює код у файлах і переходить до останнього оновленого (скоєного) стану. скидання не змінює коди; він просто скидає заголовок.


3
Поясніть, будь ласка, різницю між git reset <file>та git checkout <file>.
Трент

1
скидання не змінює файл, просто перенесіть його зі сцени (= індекс, куди його поклав git add)
франк

каси змінити коди у файлі та перейти до останнього оновленого стану. скидання не змінює коди, воно просто скидає заголовок. Наприклад, скидання використання для скидання доданих або допущених файлів перед використанням push-checkout для повернення до останнього оновленого / скоєного етапу перед додаванням git.
Хасіб Камал

1
reset = видаліть файл зі стадії, проте зміни все одно будуть. checkout = отримує оновлений файл із сховища та переосмислює поточний файл
Imam Bux

14

Ця команда видалить ваші зміни:

git reset HEAD filename.txt

Ви також можете використовувати

git add -p 

для додавання частин файлів.


14

Є також інтерактивний режим:

git add -i

Виберіть варіант 3, щоб скасувати додавання файлів. У моєму випадку я часто хочу додати більше одного файлу, і в інтерактивному режимі ви можете використовувати такі цифри, щоб додати файли. Це займе всіх, крім 4: 1, 2, 3 та 5

Щоб вибрати послідовність, просто введіть 1-5, щоб взяти всі від 1 до 5.

Постановка файлів Git


"Я здивований, що ніхто не згадує інтерактивний режим" - вони зробили: stackoverflow.com/a/10209776/1709587
Марк Амерді


10
git reset filename.txt

Видалить файл з ім'ям filename.txt з поточного індексу, область "збирається зробити", не змінюючи нічого іншого.


10

git add myfile.txt # Це додасть ваш файл до списку, який потрібно виконати

Зовсім протилежне цій команді,

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

значить, ви будете в попередньому стані. Вказане буде знову у списку без відстеження (попередній стан).

Він скине вашу голову із вказаним файлом. тож, якщо у вашій голові цього немає, це просто скине її.


9

У Sourcetree це легко зробити через GUI. Ви можете перевірити, яку команду Sourcetree використовує для видалення файлу.

Я створив новий файл і додав його до Git. Потім я зняв її з використанням GUI Sourcetree. Це результат:

Видалення файлів [12.12.2015 10:43] git -c diff.mnemonicprefix = false false -c core.quotepath = false -c poverljiv.helper = sourcetree reset -q - шлях / до / file / filename.java

Sourcetree використовує resetдля нестабільності нових файлів.


Так, таку саму техніку можна використовувати з TortoiseGit , отримуючи команди Git для випадків загального використання.
Пітер Мортенсен

8
git reset filename.txt  

Видалить файл з ім'ям filename.txt з поточного індексу, область "збирається зробити", не змінюючи нічого іншого.


git reset [назва файла] ex: git reset src / main / java / com / dao / ImportCsvDataDaoImpl.java
Rohit
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.