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


6,998

я по ошибке добавили файлы мерзавцу с помощью команды:

git add myfile.txt 

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

+7

Начиная с Git версии 1.8.4, все ответы ниже, что использование 'HEAD' или' Теперь head' можно использовать '@ вместо этого вместо 'HEAD'. См. [Этот ответ (последний раздел)] (http://stackoverflow.com/questions/964876/head-and-orig-head-in-git/964927#964927), чтобы узнать, почему вы можете это сделать. 26 июл. 132013-07-26 02:04:14

+1

Я сделал небольшое лето, в котором показаны все способы нести файл: http: // stackoverflow.com/questions/6919121/why-are-there-2-way-to-unstage-a-file-in-git/16044987 # 16044987 26 апр. 142014-04-26 12:09:03

+1

Почему бы не git checkout? 05 сен. 162016-09-05 14:57:00

+5

@ErikReppen 'git checkout' не удаляет поэтапные изменения из индекса фиксации. Он возвращает только неустановленные изменения в последнюю исправленную ревизию, которая, кстати, не является тем, что я хочу, мне нужны эти изменения, я просто хочу, чтобы они были позже. 06 сен. 162016-09-06 21:08:58

+1

Если вы используете Eclipse, это так же просто, как снятие отметки с файлов в диалоговом окне фиксации 17 ноя. 162016-11-17 12:49:17

  0

Это отличный ресурс прямо из Github: [Как отменить \ (почти \) что угодно с Git] (https://github.com/blog/2019-how-to-undo-almost-anything-with-git) 03 фев. 172017-02-03 21:13:30

  0

Прежде чем вы опубликуете новый ответ, рассмотрите уже 25 ответов на этот вопрос. Удостоверьтесь, что ваш ответ вносит то, чего нет среди существующих ответов. 15 июн. 172017-06-15 15:29:32

  0

Хотелось бы, чтобы я мог повышать это каждый раз, когда мне нужно вернуться сюда, чтобы обратиться к нему. 02 фев. 182018-02-02 22:59:46

  0

git remove myfile.txt 13 фев. 182018-02-13 11:48:01

7,788

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

git reset <file> 

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

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

git reset 

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

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

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

+40

Конечно, это не истинный откат, потому что если неправильный 'git add' перезаписал предыдущую поэтапную версию, мы не можем ее восстановить. Я попытался разъяснить это в моем ответе ниже. 06 май. 132013-05-06 19:10:43

+3

'git reset HEAD * .ext' где' ext' - файлы данного расширения, которые вы хотите удалить. Для меня это было '* .bmp' &' * .zip' 26 ноя. 132013-11-26 14:25:19

+1

git reset сказал, что он отключил изменения, но когда я продолжил делать другой статус git, они все еще показывали измененный 16 окт. 152015-10-16 03:39:48

+1

Так что противоположность «add» «reset»? Как насчет «удалить»? 17 фев. 162016-02-17 05:53:02

+10

@ Jonny, индекс (aka staging area) содержит * все * файлы, а не только измененные файлы. Он «начинает жизнь» (когда вы проверяете фиксацию или клонируете репо) как копию всех файлов в фиксации, на которые указывает HEAD. Поэтому, если вы * удаляете * файл из индекса ('git rm --cached'), это означает, что вы готовитесь сделать фиксацию, которая * удаляет * этот файл. 'git reset HEAD <filename>' с другой стороны скопирует файл из HEAD в индекс, так что следующий коммит не будет показывать никаких изменений, внесенных в этот файл. 16 мар. 162016-03-16 12:27:34

  0

что, если оно уже было совершено? 20 мар. 162016-03-20 22:20:28

+5

Я только что обнаружил, что есть 'git reset -p', как' git add -p'. Это круто! 17 июл. 162016-07-17 23:23:05

+1

'-p' наиболее определенно потрясающе, и он используется во многих командах git (а не только для сброса и добавления). Но чтобы ответить @ WeDoTDD.com и @Johnny, 'git reset' сам по себе просто очищает, знает ли Git« об изменениях »; он не очищает сами изменения. Для этого вам нужно выполнить 'git checkout someFile.txt' (для отдельных файлов) или' git reset --hard' (стереть все в чистоте). Однако ни одна из этих команд не возвращается, поэтому будьте очень осторожны при их использовании. 15 дек. 162016-12-15 18:33:19

+1

, но 'git reset file' удаляет другие файлы, которые были поставлены для фиксации тоже. нехорошо. 17 фев. 172017-02-17 16:29:45

  0

Предположим, я даже не использовал «git add». Я только что внес изменения в код. Очевидно, что файл будет отображаться красным цветом. Что я могу сделать в этом контексте? Я хочу, чтобы мои локальные изменения файлов исчезли. Я хочу, чтобы он синхронизировался с мастером. 26 мар. 172017-03-26 11:14:58

  0

Вы на самом деле ** можете восстановить перезаписанные ранее поставленные, но неуправляемые изменения **, но не по-дружески, а не на 100% безопасно (по крайней мере, я не нашел): goto .git/objects, поиск файлов, созданных во время ' git add' вы хотите восстановить ('61/3AF3 ...' -> id объекта '613AF3 ...'), затем 'git cat-file -p <object-id>' (возможно, стоит восстановить несколько часов работы, но также урок, чтобы совершать более часто ...) 31 июл. 172017-07-31 14:03:25


39

git remove или git rm может использоваться для этого, с флагом --cached. Попробуйте:

git help rm 
+5

Разве это не совсем удалит файл? 26 авг. 152015-08-26 05:29:10


461

Если вы наберете:

git status 

мерзавец покажет вам, что поставил, и т.д., в том числе инструкции о том, как убрать из буфера:

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

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

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

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

Сообщение будет отличаться в зависимости от того, был ли уже обработан файл 'add'ed (' add' только сохранил новую версию в кеше - здесь он покажет ваше сообщение). В другом месте, если файл ранее не был поставлен, он отобразит 'use 'git rm --cached <file> ..." to unstage' 06 май. 132013-05-06 18:25:26

  0

Отлично! 'Git reset HEAD <file>' one - единственный, который будет работать, если вы хотите отключить удаление файла. 24 фев. 182018-02-24 00:25:25


1,893

Вы хотите:

git rm --cached <added_file_to_undo> 

Рассуждение:

Когда я был новичком в этом, я впервые попробовал

git reset . 

(отменить все мое первоначальное добавление), только чтобы получить это (не очень) полезное сообщение:

fatal: Failed to resolve 'HEAD' as a valid ref. 

Оказалось, что это потому, что HEAD ref (branch?) Не существует до момента первого фиксации. То есть, вы будете работать в проблемы того же новичка, как я, если ваш рабочий процесс, как у меня, было что-то вроде:

  1. кд в мой большой новый каталог проекта, чтобы опробовать Git, новый жаркости
  2. git init
  3. git add .
  4. git status

    ... много дерьма прокручивает ...

    => Черт, я не хотел добавлять все это.

  5. Google "отменить мерзавец добавить"

    => найти переполнения стека - яй

  6. git reset .

    => фатальным: Не удалось разрешить 'голова' в качестве действительного исх.

Он далее оказывается, что есть a bug logged против unhelpfulness этого в списке рассылки.

И что правильное решение было прямо на выходе состояния Гит (который, да, я приукрасил как «дерьмо)

... 
# 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 ничего не разрушать (а что, если я с ошибкой).

  0

Не просто «git reset» без. делай то, что хочешь, или я чего-то не хватает? 11 ноя. 092009-11-11 12:21:03

+20

Отличный ответ. +1 для использования опции '-n' с' git add'. Я определенно буду использовать его. 26 май. 102010-05-26 14:41:03

+8

Hah. Я последовал этому же процессу. Кроме того, что я сдался и сказал «rm -rf .git», 'git init', потому что я не доверял' git rm --cached', чтобы сохранить свою рабочую копию. В нем немного говорится о том, насколько гит по-прежнему чрезмерно сложный в некоторых местах. 'git unstage' должен быть просто стандартным командованием, мне все равно, могу ли я добавить его как псевдоним. 29 мар. 112011-03-29 03:45:18

  0

Удалил ли он все мои существующие файлы - без изменений - из резервной копии git.Повторное добавление их делает все больше и разрушает правильную историю. Git - полностью незавершенный проект. 01 июн. 112011-06-01 09:09:18

  0

в последних версиях git (v1.7.1.1 проверен) 'git rm -r --cached .' отлично работает 22 ноя. 112011-11-22 15:23:45

+1

Если вам нравится' git reset', попробуйте ** 'git reset *' ** вместо 'git reset .' - он дезактивирует все ранее поставленные файлы. 09 дек. 112011-12-09 21:58:24

+1

Блестящий ответ, который точно описывает мой рабочий процесс. Это действительно должен быть принятый ответ, чтобы быть самым верхним, поскольку это Q является тем, что является вершиной результатов поиска для «git unstage». 16 дек. 112011-12-16 09:36:51

+8

Мне не нравится «rm» часть «git rm». Похоже, что он уничтожит файлы навсегда. Плохое удобство. 06 фев. 122012-02-06 19:43:55

+1

Вместо сухого пробега пройдите через добавление с помощью git add -p' 28 апр. 122012-04-28 22:05:18

+2

Для меня git говорит 'git reset HEAD <File> ...' 12 сен. 122012-09-12 06:50:13

  0

Вы также можете использовать 'git stash/git stash pop', чтобы избежать zipping/backing up all 03 ноя. 122012-11-03 19:05:17

+8

git rm --cached <file> - фактически правильный ответ, если это первоначальный импорт <file> в репозиторий. Если вы пытаетесь отключить изменение файла, git reset - правильный ответ. Люди, говорящие, что этот ответ ошибочен, думают о другом вопросе. 28 фев. 132013-02-28 22:14:57

+8

Это будет работать, но ** только ** на первом коммите, где файл раньше не существовал, или где команда 'git add' добавила новые файлы **, но не ** изменяет существующие файлы. 10 апр. 132013-04-10 02:33:36

+1

Я уверен, что если это совершенно новый репозиторий, удаление каталога '.git' и повторная инициализация - лучший способ. Для случаев в хорошо используемом репо, где вы просто случайно добавили один файл, 'git rm --cached <file>' кажется лучшим, хотя я получаю страшный 'файл 100644 удаления 'после моего фиксации. 14 июл. 132013-07-14 22:28:14

+1

в соответствии с выходом 'git status' версии git версии 1.8.1.4. Правильный способ отключить новые файлы:' git reset HEAD <file> ... ' 28 авг. 132013-08-28 18:25:05

+2

просто показывает, как неинтуитивный и запутанный git. вместо того, чтобы иметь параллельные команды «отменить», вам нужно выяснить, как их отменить. Например, пытаясь освободить ногу быстрым песком, а затем завязать свою руку, а затем затянуть другую руку ... каждая команда должна быть выполнена через графический интерфейс с выпадающими меню для опций ... Подумайте обо всех пользовательских интерфейсах, прирост производительности, который у нас был, но у нас есть этот беспорядок интерфейса командной строки ретро. Это не похоже на программы git GUI, которые делают это более интуитивно понятным. 24 май. 142014-05-24 10:54:36

+2

@BarryKelly нет, это не правильный ответ. То, что вы на самом деле хотите сделать, это либо «git reset», чтобы отменить все добавленные файлы, либо «git reset <file>», чтобы отменить определенный добавленный файл. 'git rm --cached' может работать на поверхности, но на самом деле происходит его удаление из истории отслеживания, но это не то, что вы хотели бы сделать, если бы вы не добавили этот файл в файл gitignore, где этот файл должен В первую очередь это отслеживается, тогда в этом случае все будет хорошо. 02 июн. 142014-06-02 21:14:06

  0

@ JoeMoe1984 git reset не работает на пустых репозиториях (начальный импорт) 03 июн. 142014-06-03 13:40:23

  0

@BarryKelly Я попытался отредактировать свой комментарий, когда перечитал ваш, но я опоздал. Я пропустил эту часть того, что вы написали;). Но да, вы правы, это был бы другой пример, чтобы использовать 'git rm --cached' 03 июн. 142014-06-03 17:33:45

  0

Когда в основном заполняется репозиторий git,« git reset »из верхнего ответа не работает: не удалось разрешить HEAD. Мы добавили один файл слишком много к первоначальной фиксации. Как предложил этот ответ, в этом случае «git rm --cached <file>» работает для меня. Может быть, «git rm --cached». делает больше, чем предназначено для некоторых людей, но (как было предложено git status), git rm --cached <file> works .... 20 окт. 152015-10-20 11:31:15

  0

Почему бы просто не удалить скрытую папку .git lol .. и снова выполнить git init ... (предположим, что вы делаете git repo в первый раз и не совершаете никаких коммитов) 05 апр. 162016-04-05 14:16:48

+1

Если файлы еще не указаны в индексе, используйте 'git rm --cache <filename>', если файлы уже находятся в индексе, но вы не 't хочу, чтобы они были в этой фиксации, используйте 'git reset <filename>' 20 окт. 162016-10-20 01:46:10

  0

Это может быть применимо на момент написания, но, похоже, сейчас работает. 08 июн. 172017-06-08 10:20:25


25

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

git rm --cached FILE 

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

+2

Помните, что '-cached' является действительно важной частью здесь. 12 апр. 132013-04-12 12:21:46

  0

-1; Нет, это не отключает файл, он ставит на удаление файл (без фактического удаления его из вашего дерева работ). 30 окт. 152015-10-30 23:42:05


29

Возможно, Git развился с тех пор, как вы разместили свой вопрос.

$> git --version 
git version 1.6.2.1 

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

git reset HEAD . 

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

+1

Уверен, но тогда у вас есть следующий вопрос о том, как следует добавить один из * двух * (или более) файлов.В руководстве «git reset» упоминается, что «git reset <paths>» является противоположностью «git add <paths>». 15 май. 132013-05-15 13:36:21


52

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

+5

Один совет - скопировать файл .git/config, если вы добавили удаленное начало, перед удалением папки. 08 мар. 102010-03-08 23:15:52

+3

@ ChrisJohnsen комментарий - спот сверху. Иногда вы хотите зафиксировать все файлы, кроме одного: 'git add -A && git rm --cached EXCLUDEFILE && git commit -m 'awesome commit'' (Это также работает, когда нет предыдущих коммитов, re' Failed to resolve' HEAD ''problem) 29 мар. 132013-03-29 04:20:41


82
git rm --cached . -r 

будет «не-добавить» все вы добавили из своего текущего каталога рекурсивно

+3

Я не искал, чтобы удалить все, только один конкретный файл. 09 дек. 092009-12-09 22:35:27

+3

Также полезно, если у вас нет предыдущих коммитов. В отсутствие предыдущей фиксации 'git reset HEAD <file>' будет говорить 'fatal: не удалось разрешить 'HEAD' как действительный ref.' 02 июн. 132013-06-02 03:46:13

+4

Нет, это * добавляет * * удаление * всего в вашем текущем каталоге. Очень отличается от изменений без изменений. 30 окт. 152015-10-30 01:33:56


18

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

+1

Не будет работать, если нет последней фиксации. 11 апр. 122012-04-11 22:07:03

  0

Как бы то ни было, произошла последняя фиксация ... но я специально спросил об удалении одного файла из фиксации, а не обо всех файлах из фиксации. 31 янв. 132013-01-31 16:21:37


212

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

"движется"? Это означало бы, что он ушел из рабочего каталога. Это не так. 08 июн. 172017-06-08 09:18:33

  0

Почему это очевидно? 23 июн. 172017-06-23 18:25:52


47

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

НО:

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

Просто

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

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

git unadd foo.txt bar.txt 
+1

Очень правдоподобно - и я предполагаю, что должен иметь предисловие, что он должен использоваться как ярлык, а не замена. 11 ноя. 102010-11-11 14:26:42


127

Дополнение к принятому ответу, если ошибочно добавленный файл был огромен, вы, вероятно, заметили, что, даже после его удаления из индекса с «git reset», она по-прежнему кажется, занимают место в каталоге .git. Это не о чем беспокоиться, файл действительно находится в репозитории, но только как «свободный объект», он не будет скопирован в другие репозитории (через clone, push), и пространство будет в конечном итоге возвращено - хотя возможно, не очень скоро. Если вы волнуетесь, вы можете запустить:

git gc --prune=now 

Update (что следует моя попытка очистить некоторую путаницу, которая может возникнуть из-самые проголосовали ответы):

Итак, который является реальным аннулирование от git add?

git reset HEAD <file>?

или

git rm --cached <file>?

Строго говоря, и если я не ошибаюсь: нет.

git addне может быть отменен - безопасно, в целом.Напомним

Давайте сначала, что на самом деле делает git add <file>:

  1. Если <file> был ранее не отслеживаются, git addдобавляет его в кэш, с его текущим содержанием.

  2. Если <file> был уже отслеживаются, git addсохраняет текущее содержимое (снимок, версия) в кэш. В GIT это действие по-прежнему называется ., (не просто обновление), поскольку две разные версии (моментальные снимки) файла рассматриваются как два разных элемента: следовательно, мы действительно добавляем новый элемент в кеш , в конечном счете, позднее.

В свете этого, вопрос немного неоднозначный:

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

сценария

Ора, кажется, первый (untracked file), мы хотим, чтобы «undo» удалял файл (а не только текущее содержимое) из отслеживаемых элементов. Если это случай, тогда это нормально для запуска 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 надстройку» только для добавления новых файлов (случай 1), и мы обновляем новое содержание через команду commit, git commit -a.

+1

Строго говоря, есть способ восстановить уже поставленный файл, который был заменен на git add. Как вы отмечаете, git add создает объект git для этого файла, который станет свободным объектом не только при полном удалении файла, но и при перезаписывании нового содержимого. Но нет никакой команды для автоматического восстановления. Вместо этого файл должен быть идентифицирован и извлечен вручную или с помощью инструментов, написанных только для этого случая (libgit2 позволит это). Но это будет только выплачивать, если файл очень важен и большой и не может быть восстановлен путем редактирования предыдущей версии. 06 дек. 172017-12-06 13:07:37

+1

Чтобы исправить себя: после того, как найден свободный файл объекта (используйте метаданные, такие как дата создания/время создания), 'git cat-file' может использоваться для восстановления его содержимого. 06 дек. 172017-12-06 13:22:17


31

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

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

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

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

  • Проверьте, что первоначальное обязательство. Это приведет к удалению всех ваших файлов.
  • Затем проверьте свою последнюю фиксацию снова. Это позволит получить свежие копии ваших файлов, используя текущие настройки окончания строки.
+1

Подтверждено! Попробовал сброс git после добавления git. и git жаловался на коррумпированную HEAD. Следуя вашим советам, я мог бы добавить и сбросить назад и вперед без проблем :) 03 окт. 122012-10-03 21:32:16

+1

Вторая часть работает, но немного неуклюжие. Как обрабатываются концы строк, зависит от значения 'autocrlf' ... Это не будет работать в каждом проекте, в зависимости от настроек. 29 мар. 132013-03-29 11:26:58

+1

Этот ответ был разумным в то время, когда он был опубликован, но теперь устарел; 'git reset somefile' и' git reset 'работают до первого фиксации. Это было так, поскольку несколько выпусков Git возвращаются. 30 окт. 152015-10-30 23:38:32

  0

@MarkAmery, вы можете быть правы (было бы здорово, если бы вы разместили источник для вашего утверждения), но по-прежнему важно начать свое репо с чистой фиксацией или двумя. 31 окт. 152015-10-31 20:01:14


71

Run

git gui 

и удалить все файлы вручную или выбрать все из них и нажав на убрать из буфера от фиксации кнопки.

+1

Да, я это понимаю. Я только хотел косвенно предположить, что вы указываете, что в вашем ответе вроде «вы можете использовать« git-gui »....» :) 01 авг. 142014-08-01 16:11:05

+1

В нем говорится: «git-gui: command not found». Я не уверен, работает ли это. 13 сен. 172017-09-13 04:19:18


29

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

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> 

(мерзавец версия 1.7.5.4)

+2

Я попробовал 'git reset <path>' и он отлично работает без разделителя. Я также использую git 1.9.0. Может быть, это не работает в более старых версиях? 05 апр. 142014-04-05 05:32:25


-8

Команда git reset --hard HEAD должна работать. Следует отметить, что вам нужно сменить каталог (cd) обратно в обычный рабочий каталог. В противном случае, если вы запустите команду из каталога, вы ошибочно сделали git add . .... вы не сможете вернуться и вместо этого получить ошибки, упомянутые в других сообщениях, в отношении «неизвестной версии или пути не в рабочем дереве».

+17

** ПРЕДУПРЕЖДЕНИЕ: это не просто отключит файлы из вашего индекса, но и полностью удалит их изменения из вашей рабочей копии! ** Я бы * не * рекомендовал, чтобы кто-то использовал жесткий сброс, чтобы просто отключить файлы ... не если только они не поклонники полностью потеряли свою работу. 20 июл. 142014-07-20 07:55:09


37

Используйте 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) 
# [...]# 

Переход в интерактивный оных, чтобы отменить надстройку (команды, набранные в мерзавца здесь «г» (вернуться), «1» (первый запись в списке возвращается шоу), «возвращение», чтобы выйти из режима REVERT и «д» (выход):

$ 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) 
$ 

18

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

git reset * 
+2

На самом деле это не сбрасывает каждый файл, потому что * использует расширение оболочки и игнорирует dotfiles (и dot-каталоги). 04 май. 142014-05-04 23:20:01

  0

Вы можете запустить 'git status', чтобы увидеть что-нибудь остальное, и сбросить его вручную, то есть' git reset file'. 07 май. 142014-05-07 15:23:55


10

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

git reset HEAD filename.txt 

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

git add -p 

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


69

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 <file>» и «git rm --cached <file>. Не могли бы вы объяснить это? 14 авг. 132013-08-14 00:39:07

+5

Файлы @jeswang либо «известны» git (изменения в них отслеживаются.), Либо они не «версируются». 'reset head' отменяет ваши текущие изменения, но файл по-прежнему контролируется git. 'rm --cached' выводит файл из версии, поэтому git больше не проверяет его на изменения (а также удаляет в конечном итоге индексированные текущие изменения, которые сообщаются git с помощью предыдущего' add'), но измененный файл будет сохранен в вашем рабочей копии, то есть в папке с файлом на жестком диске. 15 авг. 132013-08-15 15:09:40

+2

Разница заключается в 'git reset HEAD <file>' является временной - команда будет применена только к следующей фиксации, но 'git rm --cached <file>' будет неактивной, пока она не будет добавлена ​​снова с помощью 'git add <file>'. Кроме того, 'git rm --cached <file>' означает, что если вы нажмете эту ветку на удаленный компьютер, любой, кто потянет ветку, получит файл, ФАКТИЧЕСКИ удаленный из своей папки. 10 авг. 142014-08-10 19:54:43


19

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

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

и т.д.

  0

Учтите, что * обычно не будет включать dotfiles или «dot-directories», если вы явно не укажете '. *' Или '. *. Prj' 04 май. 142014-05-04 23:21:06


54

вопрос четко не поставлена. Причина заключается в том, что 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 
+3

+1. Необычайное количество высокоприоритетных ответов и комментариев на этой странице просто неверно изложено о поведении 'git rm --cached somefile'. Я надеюсь, что этот ответ пробивает страницу на видную позицию, где он может защитить новичков от введения в заблуждение всеми ложными утверждениями. 30 окт. 152015-10-30 23:44:32


8

Я удивлен, что никто не говоря уже о интерактивном режиме:

git add -i 

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

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

Git staging files

  0

* «Я удивлен, что никто не упоминает интерактивный режим» * - они сделали: http://stackoverflow.com/a/10209776/1709587 30 окт. 152015-10-30 23:52:13


5

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

Я создал новый файл и добавил его в git. Затем я отключил его, используя guit SourceTree. Это результат:

Unstaging файлы [08/12/15 10:43]
мерзавец -c diff.mnemonicprefix = ложь -c core.quotepath = ложь -c credential.helper = sourcetree сброса - q - путь/в/файл/filename.java

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


4
git reset filename.txt 

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


-7
git stash && git stash pop 

Будет стирать стадию.


9

Чтобы отменить мерзавец добавить Используйте

git reset filename


14

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

enter image description here

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

enter image description here

Теперь я хочу отменить эту надстройку, перед фиксацией git reset newFile.txt

enter image description here

  0

Предположим, что я нахожусь в 1-м значении, означающем, что я даже не сделал «git.add ». Кроме того, я вовсе не хочу, чтобы все это изменилось. Я имею в виду, когда я делаю git статус, он не должен показывать красные файлы. Я имею в виду, что он должен быть синхронизирован, как если бы ни один файл не изменялся со времени последнего нажатия git. как добиться этого. 26 мар. 172017-03-26 00:59:40

  0

ТАК, предположим, вы только на первом шагу. И вы хотите избавиться от всех изменений, которые вы сделали, что делает «newFile.txt» красным. 26 мар. 172017-03-26 01:00:12

  0

Когда я делаю статус git. Я вообще не вижу никаких изменений. Все красные файлы должны быть возвращены. 26 мар. 172017-03-26 01:00:50

  0

Привет, я думаю, ваш вопрос заключается в том, как удалить ненужные файлы из текущего дерева. Для этого вы можете использовать «git clean -f -d». Это также приведет к удалению неподготовленных каталогов. 26 мар. 172017-03-26 10:19:04

  0

Если вы не хотите удалять неиспользуемые файлы, просто игнорируйте флаг «-f». 26 мар. 172017-03-26 10:20:26

  0

Это не сработало. Предположим, я сделал git push. Теперь, если я добавлю одну строку в свой код и проверю статус git. Он отобразит файл красного цвета. Предположим, я не хочу, чтобы одна строка менялась вообще. Один из вариантов - я могу сделать cntrl + z. Но я хочу, чтобы я сделал это для меня. Я хочу, чтобы мой локальный проект синхронизировался с мастер-репо. Я имею в виду, когда я делаю «git status», тогда я должен видеть сообщение как «Его в синхронизации с мастером». И когда я открываю свой код, у меня должно быть сообщение типа «какой-то внешний источник делает изменения», и когда я говорю «Да» в это приглашение, то одно изменение строки, которое я сделал, исчезло. 26 мар. 172017-03-26 11:06:35

  0

В основном я хочу команду git, которая вернет все изменения, которые приводят к состоянию git, чтобы показать «красные файлы» 26 мар. 172017-03-26 11:07:43

  0

Итак, я внес изменения в файл. Я ничего не делал. NO git command вообще (без git push даже git add или git commit). Но теперь я хочу команду git, которая вернет эти изменения в моем локальном репо. 26 мар. 172017-03-26 11:10:07

  0

В более технических терминах «Как вернуть изменения файла, сделанные в локальном репо, которые не были помещены в промежуточную область» 26 мар. 172017-03-26 11:21:10

  0

Не вы пытались «git checkout file_name». Кроме того, вы можете сохранить изменения, используя «git stash». 26 мар. 172017-03-26 12:14:59

  0

да проверка работа. Благодарю. :) 26 мар. 172017-03-26 14:57:03

  0

Приятно вам помочь :) 26 мар. 172017-03-26 16:12:49

  0

Git reset without Head использует текущие поэтажные файлы. Используйте git reset head, чтобы указать другую фиксацию. Подобно git reset Head ~ 2, чтобы вернуться к предыдущим фиксациям. 2 - количество коммитов 30 июл. 172017-07-30 12:53:47


3

Один из в большинстве интуитивных решений используется SourceTree.

Вы можете просто перетащить файлы из ступенчатого и unstaged enter image description here


4

git add myfile.txt # это будет добавить свой файл в совершаться лист

Совсем напротив этой команды,

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

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

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


41

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

git reset HEAD myfile.txt 

Объясните:

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

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

git reset HEAD


4
git reset filename.txt 

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


4

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

  • git reset my_file.txt

  • git checkout my_file.txt

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

  • git reset .

  • git checkout .

+2

Пожалуйста, объясните разницу между 'git reset <file>' и 'git checkout <file>'. 22 янв. 182018-01-22 23:47:24