Как мне отменить 'git add' перед коммитом?

8968

Я по ошибке добавил файлы в Git с помощью команды:

git add myfile.txt

Я еще не бегал git commit. Есть ли способ отменить это, чтобы эти файлы не были включены в коммит?

paxos1977
источник
23
Начиная с Git версии 1.8.4, все ответы ниже , что используют HEADили headмогут теперь использовать @вместо HEADвместо этого. Посмотрите этот ответ (последний раздел), чтобы узнать, почему вы можете это сделать.
3
Я сделал небольшое резюме, которое показывает все способы удаления файла: stackoverflow.com/questions/6919121/…
Даниэль Алдер,
5
Почему бы не Git Checkout?
Эрик Реппен
13
@ErikReppen git checkoutне удаляет поэтапные изменения из индекса фиксации. Он только отменяет не поэтапные изменения последней зафиксированной ревизии - что, кстати, тоже не то, что я хочу, я хочу эти изменения, я просто хочу, чтобы они были в более поздней фиксации.
paxos1977
4
Если вы используете Eclipse, это так же просто, как
снять флажки

Ответы:

10375

Вы можете отменить, git addпрежде чем совершить с

git reset <file>

который удалит его из текущего индекса (список «собирается быть зафиксирован»), ничего не меняя.

Ты можешь использовать

git reset

без какого-либо имени файла, чтобы удалить все должные изменения. Это может пригодиться, когда слишком много файлов для перечисления один за другим в разумные сроки.

В старых версиях Git вышеприведенные команды эквивалентны git reset HEAD <file>и git reset HEADсоответственно и завершатся неудачей, если HEADне определено (потому что вы еще не сделали никаких коммитов в вашем хранилище) или неоднозначно (потому что вы создали ветвь с именем HEAD, что глупо что вы не должны делать). Это изменилось в Git 1.8.2 , поэтому в современных версиях Git вы можете использовать приведенные выше команды даже до того, как сделаете первый коммит:

«git reset» (без опций или параметров) используется для вывода ошибок, когда в вашей истории нет коммитов, но теперь он дает пустой индекс (для соответствия несуществующему коммиту вы даже не используете).

genehack
источник
93
Конечно, это не настоящая отмена, потому что если неправильная git addверсия перезаписала предыдущую подготовленную незафиксированную версию, мы не сможем ее восстановить. Я попытался уточнить это в своем ответе ниже.
leonbloy
7
git reset HEAD *.extгде extфайлы с заданным расширением, которые вы хотите удалить. Для меня это было *.bmp&*.zip
boulder_ruby
19
@Jonny, индекс (он же промежуточная область) содержит все файлы, а не только измененные файлы. Он «запускает жизнь» (когда вы извлекаете коммит или клонируете репо) как копию всех файлов в коммите, на которые указывает HEAD. Поэтому, если вы удаляете файл из index ( git rm --cached), это означает, что вы готовитесь сделать коммит, который удаляет этот файл. git reset HEAD <filename>с другой стороны, скопирует файл из HEAD в индекс, чтобы при следующей фиксации не было внесено никаких изменений в этот файл.
Уайлдкарт
11
Я только что обнаружил, что есть git reset -pпросто как git add -p. Это круто!
Donquixote
10
Вы действительно можете восстановить перезаписанные ранее внесенные, но незафиксированные изменения, но не в удобной для пользователя форме и не на 100% безопасные (по крайней мере, ни один из них я не нашел): перейти к .git / objects, найти файлы, созданные в тот момент, когда git addвы хотите восстановить ( 61/3AF3...- > идентификатор объекта 613AF3...), то git cat-file -p <object-id>(может быть, стоит восстановить несколько часов работы, но также и урок, который нужно совершать чаще ...)
Питер Шнайдер,
2152

Ты хочешь:

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 (который, да, я назвал «дерьмом»)

...
# 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 reset HEAD <File>...
драхнр
16
git rm --cached <file> на самом деле правильный ответ, если это первоначальный импорт <file> в хранилище. Если вы пытаетесь отменить изменение файла, git reset - правильный ответ. Люди, которые говорят, что этот ответ неправильный, думают о другом вопросе.
Барри Келли
14
Это на самом деле будет работать, но только при первом коммите, где файл ранее не существовал или когда git addкоманда добавляла новые файлы, но не вносила изменения в существующие файлы.
naught101
4
просто показывает, насколько неинтуитивен и запутанен мерзавец. вместо параллельных команд «отменить», вы должны выяснить, как их отменить. Как попытка высвободить ногу в быстром песке, а затем застрявшую руку, затем застрявшую вторую руку ... каждая команда должна выполняться через графический интерфейс, с пунктами выпадающего меню для вариантов ... Подумайте обо всем интерфейсе, рост производительности у нас был, но у нас есть этот беспорядок ретро интерфейс командной строки. Это не так, как программы git GUI делают это более интуитивно понятным.
Анбизкад
533

Если вы введете:

git status

Git расскажет вам, что ставится и т. Д., Включая инструкции о том, как выполнить расстановку:

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

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

Примечание: последние версии Git (1.8.4.x) изменили это сообщение:

(use "git rm --cached <file>..." to unstage)
Пол Бекингем
источник
20
Сообщение будет отличаться в зависимости от того add, отслеживался ли уже отредактированный файл ( addединственная сохраненная новая версия в кеш - здесь будет показано ваше сообщение). В другом месте, если файл не был предварительно подготовлен, он будет отображатьсяuse "git rm --cached <file>..." to unstage
leonbloy
Большой! git reset HEAD <file>Один единственный , который будет работать в случае , если вы хотите убрать из буфера файла удаления
skerit
2
Мой мерзавец версии 2.14.3 говорит, git reset HEADчтобы нестандартно.
Серебряный Волк - Восстановить Монику
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
takeshin
источник
4
«движется»? Это указало бы, что это ушло из рабочего каталога. Это не тот случай.
Томас Веллер
4
Почему это очевидно?
Ленар Хойт
На самом деле, git stageэто псевдоним для git add, который является исторической командой, как на Git, так и на других SCM. Он был добавлен в декабре 2008 года с коммитом 11920d28da в «Git's git репозиторий», если можно так выразиться.
Обсидиан
1
Это может быть не связано, но я обнаружил, что проверка файла перед тем, как даже добавить, была полезной идеей, например, команда проверки имени файла && 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 это действие по-прежнему называется add , а не просто update его), поскольку две разные версии (снимки) файла рассматриваются как два разных элемента: следовательно, мы действительно добавляем новый элемент в кеш, чтобы в конечном итоге совершено позже.

В свете этого вопрос несколько двусмысленный:

Я по ошибке добавил файлы с помощью команды ...

Похоже, что сценарий 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 irrevocably lost "version 2"
-version 1
+version 3

Конечно, это не очень важно, если мы просто следуем обычному ленивому рабочему процессу выполнения 'git add' только для добавления новых файлов (случай 1), и мы обновляем новое содержимое с помощью команды commit, git commit -acommand.


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

leonbloy
источник
4
Строго говоря, есть способ восстановить уже подготовленный файл, который был заменен на git add. Как вы упомянули, git add создает объект git для этого файла, который станет свободным объектом не только при полном удалении файла, но и при перезаписи новым содержимым. Но нет команды для автоматического восстановления. Вместо этого файл должен быть идентифицирован и извлечен вручную или с помощью инструментов, написанных только для этого случая (libgit2 позволит это). Но это окупится только в том случае, если файл очень важный и большой и не может быть восстановлен путем редактирования предыдущей версии.
Йоханнес Матокич
2
Чтобы исправить себя: Когда найден свободный объектный файл (используйте метаданные, такие как дата / время создания), git cat-fileможно использовать для восстановления его содержимого.
Йоханнес Матокич
2
Другой способ восстановить изменения, которые были организованы, но не зафиксированы, а затем перезаписаны , например, другим способом, git add- git fsck --unreachableэто список всех недоступных объектов, который можно затем просмотреть git show SHA-1_IDили git fsck --lost-foundкоторый будет> записывать висячие объекты в .git/lost-found/commit/или .git/lost-found/other/, в зависимости от типа. Смотрите такжеgit fsck --help
iolsmit
111

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

git reset HEAD myfile.txt

Объяснение:

После того, как вы поставили ненужные файлы, отменить их можно git reset.Headявляется заголовком вашего файла в локальном, а последний параметр является именем вашего файла.

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

git reset HEAD file

Алиреза
источник
Изображение: «Команда добавляет ...»«Команда добавляет ...» ( настоящее простое время, третье лицо )
Питер Мортенсен,
Изображение: хочухочу (здесь нет необходимости использовать сленг)
Питер Мортенсен
93
git rm --cached . -r

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

braitsch
источник
3
Я не хотел удалять все, только один конкретный файл.
paxos1977
3
Также полезно, если у вас нет предыдущих коммитов. В отсутствие предыдущего коммита, git reset HEAD <file>сказал быfatal: Failed to resolve 'HEAD' as a valid ref.
Прия Ранджан Сингх
6
Нет, это добавляет к делеции всего в текущем каталоге. Очень отличается от просто постоянных изменений.
Марк Амери
89

Запустить

git gui

и удалите все файлы вручную или, выбрав их все и нажав на кнопку unstatage from commit .

Хаджа Минхаджуддин
источник
1
Да, я понимаю это. Я только хотел косвенно предложить, чтобы вы указали, что в вашем ответе типа «Вы можете использовать git-gui....» :)
Александр Сурафель
1
Там написано "git-gui: команда не найдена". Я не уверен, что это работает.
Паринда Раджапакша
Вау, это намного проще, чем использовать командные строки, которые вы не поняли. Это определенно рекомендуется для начинающего, как я. Спасибо, что написали это!
Ирфанди Джип
Спасибо. Не хотел рисковать, поэтому пришлось использовать графический интерфейс.
Сагар Хатри
84

У 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>
    
sjas
источник
1
Я не могу понять разницу между 'git reset head <file>' и 'git rm --cached <file>. Не могли бы вы объяснить это?
Иисус
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
81

Вопрос не четко поставлен. Причина в том, что 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
Michael_Scharf
источник
7
+1. Чрезвычайное количество высокооплачиваемых ответов и комментариев на этой странице просто категорически неверно по отношению к поведению git rm --cached somefile. Я надеюсь, что этот ответ поднимется по странице на видное место, где он сможет защитить новичков от введения в заблуждение всеми ложными утверждениями.
Марк Амери
один из лучших ответов здесь, к сожалению, он довольно низок в списке
Creos
64

Если вы выполняете первоначальный коммит и не можете его использовать git reset, просто объявите «Git банкротство», удалите .gitпапку и начните сначала.

Ана Беттс
источник
5
Один из советов - скопировать файл .git / config, если вы добавили удаленный источник, перед удалением папки.
Tiago
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
electblake
источник
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» (первая запись в списке показывает возврат), «возврат», чтобы выйти из режима возврата, и «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
gnud
источник
9
Разве это не собирается удалить файл вообще?
Вилла
8
git rm --cached ...удалит файлы из репозитория git Они все еще будут существовать на вашем компьютере, но это ОЧЕНЬ отличается от постоянных изменений в файле. Для любого, кто наткнулся на это, это неправильный ответ на вопрос.
Аддисон
38

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

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

Git делает это действительно трудно, git resetесли у вас нет коммитов. Если вы создаете крошечный начальный коммит только ради его получения, после этого вы можете git add -Aиgit reset столько раз, сколько хотите, чтобы все было правильно.

Еще одним преимуществом этого метода является то, что если вы столкнетесь с проблемами, связанными с окончанием строки, и вам потребуется обновить все ваши файлы, это легко:

  • Проверьте этот первоначальный коммит. Это удалит все ваши файлы.
  • Затем проверьте ваш последний коммит снова. Это позволит получить свежие копии ваших файлов, используя ваши текущие настройки окончания строки.
Райан Ланди
источник
1
Подтверждено! Попробовал сброс мерзавца после добавления мерзавца. и мерзавец жаловался на испорченную голову. Следуя вашим советам, я мог бы без проблем добавить и сбросить 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 .

Это должно быть то, что вы ищете.

Kokotte23
источник
2
Конечно, но у вас есть вопрос о том, как добавить один из двух (или более) файлов. В руководстве «git reset» упоминается, что «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)

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

Чтобы удалить новые файлы из промежуточной области (и только в случае нового файла), как предложено выше:

git rm --cached FILE

Используйте rm --cached только для случайно добавленных новых файлов.

Ран
источник
4
Имейте в виду, что --cachedэто действительно важная часть здесь.
занимает
1
-1; нет, это не выводит файл из очереди, он удаляет файл (фактически не удаляя его из рабочего дерева).
Марк Амери
25

Чтобы сбросить каждый файл в определенной папке (и ее подпапках), вы можете использовать следующую команду:

git reset *
Zorayr
источник
4
На самом деле, это не сбрасывает каждый файл, потому что * использует расширение оболочки и игнорирует точечные файлы (и точечные каталоги).
Люк
Вы можете запустить , git statusчтобы увидеть что - нибудь оставшееся и сбросить его вручную то есть git reset file.
Зорайр
25

Используйте *команду для обработки нескольких файлов одновременно:

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

и т.п.

boulder_ruby
источник
3
Имейте в виду, что * обычно не включает в себя точечные файлы или «точечные каталоги», если вы явно не укажете .*или.*.prj
Luc
23

Просто наберите git resetего, он вернется назад, и это похоже на то, что вы никогда не печатали git add .с момента последнего коммита. Убедитесь, что вы совершили ранее.

Donovan
источник
Как это случилось, был последний коммит ... но я специально спрашивал об удалении одного файла из коммита, а не каждого файла из коммита.
paxos1977
20

Предположим, я создаю новый файл newFile.txt:

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

Предположим, я случайно добавил файл git add newFile.txt:

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

Теперь я хочу отменить это добавление перед коммитом git reset newFile.txt:

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

Видура Мудалиге
источник
Предположим, я на 1-й картинке, что означает, что я даже не сделал "git.add". Кроме того, я совсем не хочу, чтобы все это изменилось. Я имею в виду, когда я делаю git status, он не должен показывать никаких красных файлов. Я имею в виду, что он должен быть синхронизирован, как если бы не было изменено ни одного файла с момента последнего нажатия git. как этого добиться.
Unbreakable
Итак, предположим, что вы только на первом шаге. И вы хотите избавиться от всех изменений, которые вы сделали, что делает «newFile.txt» красным.
Unbreakable
Когда я делаю git status. Я не должен видеть никаких изменений вообще. Все красные файлы должны быть возвращены.
Unbreakable
Привет, я думаю, что ваш вопрос, как удалить неотслеживаемые файлы из текущего дерева. Для этого вы можете использовать «git clean -f -d». Это также удалит неотслеживаемые каталоги.
Видура Мудалиге
Если вы не хотите удалять неотслеживаемые файлы, просто игнорируйте флаг "-f".
Видура Мудалиге
19

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

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

Для всех добавленных файлов:

  • git reset
  • Git Checkout.

Примечание: checkout изменяет код в файлах и переходит в последнее обновленное (подтвержденное) состояние. сброс не меняет коды; это просто сбрасывает заголовок.

Хасиб Камаль
источник
3
Пожалуйста, объясните разницу между git reset <file>и git checkout <file>.
Трент
1
Сброс не меняет файл, просто уберите его со сцены (= index, куда он был добавлен git add)
Франк
Оформить заказ изменить коды в файле и перейти к последнему обновленному состоянию. сброс не меняет коды, он просто сбрасывает заголовок. Например, сбросьте использование для сброса добавленных или подтвержденных файлов перед использованием push и checkout, чтобы вернуться к последнему этапу обновления / подтверждения перед git add.
Хасиб Камаль
1
сброс = удалить файл со стадии, однако изменения все еще будут там. checkout = получает обновленный файл из хранилища и переопределяет текущий файл
Imam Bux
14

Эта команда отменяет ваши изменения:

git reset HEAD filename.txt

Вы также можете использовать

git add -p 

добавить части файлов.

wallerjake
источник
14

Также есть интерактивный режим:

git add -i

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

Чтобы выбрать последовательность, просто введите 1-5, чтобы взять все от 1 до 5.

Git промежуточные файлы

Джонатан
источник
«Я удивлен, что никто не упомянул интерактивный режим», - они сделали: stackoverflow.com/a/10209776/1709587
Марк Эмери
14

Чтобы отменить git add, используйте:

git reset filename
Анируд Суд
источник
10
git reset filename.txt

Удалит файл с именем filename.txt из текущего индекса, области «собирается быть зафиксирован», без изменения чего-либо еще.

Рахул Синха
источник
10

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

Совершенно противоположно этой команде,

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

Итак, вы будете в предыдущем состоянии. Указанный будет снова в неотслеживаемом списке (предыдущее состояние).

Это сбросит вашу голову с этим указанным файлом. так что, если у вашей головы нет этого средства, оно просто сбросит его.

Мохидин бен Мухаммед
источник
9

В Sourcetree вы можете сделать это легко через графический интерфейс. Вы можете проверить, какую команду Sourcetree использует для удаления файла.

Я создал новый файл и добавил его в Git. Затем я удалил его с помощью Sourcetree GUI. Это результат:

Unstaging файлы [12/12/15 10:43] git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = сброс исходного файла -q - путь / к / файлу / имени файла.java

Sourcetree использует resetдля удаления новых файлов.

miva2
источник
Да, ту же технику можно использовать с TortoiseGit , получая команды Git для общих случаев использования.
Питер Мортенсен
8
git reset filename.txt  

Удалит файл с именем filename.txt из текущего индекса, области «собирается быть зафиксирован», без изменения чего-либо еще.

Джозеф Мэтью
источник
git reset [имя файла] ex: git reset src / main / java / com / dao / ImportCsvDataDaoImpl.java
Рохит Чаурасия,