Как мне отменить 'git add' перед коммитом? - PullRequest
8168 голосов
/ 08 декабря 2008

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

git add myfile.txt

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

Ответы [ 35 ]

62 голосов
/ 19 ноября 2009

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

55 голосов
/ 01 октября 2010

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

НО:

Я нашел этот замечательный небольшой пост, в котором на самом деле добавлена ​​команда Git (также псевдоним) для git unadd: подробности см. git unadd или ..

Просто

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

Теперь вы можете

git unadd foo.txt bar.txt
45 голосов
/ 08 декабря 2008
Для этого можно использовать

git remove или git rm с флагом --cached. Попробуйте:

git help rm
42 голосов
/ 18 апреля 2012

Используйте 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)
$
37 голосов
/ 25 сентября 2011

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

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

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

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

  • Проверьте этот начальный коммит. Это удалит все ваши файлы.
  • Затем проверьте ваш последний коммит снова. Это позволит получить свежие копии ваших файлов, используя текущие настройки окончания строки.
33 голосов
/ 23 января 2012

Обратите внимание, что если вы не указали ревизию, вы должны включить разделитель Пример из моей консоли:

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 version 1.7.5.4)

33 голосов
/ 19 ноября 2009

Возможно, Git эволюционировал с тех пор, как вы опубликовали свой вопрос.

$> git --version
git version 1.6.2.1

Теперь вы можете попробовать:

git reset HEAD .

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

30 голосов
/ 22 июня 2009

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

git rm --cached FILE

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

24 голосов
/ 26 июля 2012

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

git reset *
24 голосов
/ 28 августа 2013

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

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

и т.д.

...