Дополнительно
Как отменить «git add» перед фиксацией?
Я по ошибке добавил файлы в Git с помощью команды:
git add myfile.txt
Я еще не запустил git commit
. Есть ли способ отменить это, чтобы эти файлы не были включены в коммит?
8527
33
Вы можете отменить
git add
перед фиксациейкоторый удалит его из текущего индекса (списка «собирается быть совершенным»), не меняя ничего другого.
Вы можете использовать
без какого-либо имени файла, чтобы отменить все необходимые изменения. Это может пригодиться, когда слишком много файлов, чтобы их можно было перечислить один за другим за разумное время.
В старых версиях Git, приведенные выше команды эквивалентны
git reset HEAD
иgit reset HEAD
соответственно, и потерпит неудачу, еслиHEAD
не определен (потому что у тебя есть # 39;пока не делали коммитов в вашем хранилище) или неоднозначно (потому что вы создали ветку под названиемHEAD
, это глупо, что вы должны 'т делать). Это было изменено в Git 1.8.2, поэтому в современных версиях Git вы можете использовать приведенные выше команды даже до создания первого коммита:Ты хочешь:
Рассуждение:
Когда я был новичком в этом, я впервые попробовал
(чтобы отменить все мое первоначальное добавление), только чтобы получить это (не очень) полезное сообщение:
Оказывается, это потому, что HEAD ref (ветвь?) не существует до момента первого коммита. То есть вы столкнетесь с той же проблемой новичка, что и я, если ваш рабочий процесс, как и мой, был чем-то вроде:
cd в мой замечательный новый каталог проектов, чтобы опробовать Git, новую жаркость
git init
Git добавить .
git status
много дерьмовых свитков ... = > Черт, я не хотел добавлять все это.
Google "undo git add"
= > найти переполнение стека - ура
Git сбросить .
= > смертельно: не удалось разрешить «HEAD» в качестве действительного реф.
Далее выясняется, что есть зарегистрированная ошибка против бесполезности этого в списке рассылки.
И что правильное решение было прямо в выводе статуса Git (который, да, я приукрасил как «дерьмо»)
И решение действительно состоит в том, чтобы использовать
git rm --cached FILE
.Обратите внимание на предупреждения в другом месте здесь -
git rm
удаляет локальную рабочую копию файла, но not, если вы используете - кэшированный . Вот результатgit help rm
:Я продолжаю использовать
удалить все и начать заново. Не сработало, потому что пока
добавить .
рекурсивно, оказывается,rm
нуждается в-r
, чтобы рекурсировать. Вздох.Хорошо, теперь я вернулся туда, откуда начал. В следующий раз я собираюсь использовать
-n
, чтобы сделать пробный запуск и посмотреть, что будет добавлено:Я отправил все в безопасное место, прежде чем доверять «git help rm» о «-cached», ничего не уничтожая (и что, если я неправильно написал это).
Если вы печатаете:
Git расскажет вам, что поставлено и т. Д., включая инструкции о том, как отцепить:
Я считаю, что Git неплохо справляется со своей задачей, заставляя меня поступать правильно в подобных ситуациях.
Примечание: последние версии Git (1.8.4.x) изменили это сообщение:
Чтобы уточнить:
git add
перемещает изменения из текущего рабочего каталога в область постановки (индекс).Этот процесс называется постановка . Таким образом, самая естественная команда для stage изменений (измененных файлов) является очевидной:
git add
- это просто простой в использовании псевдоним дляgit stage
Жаль, что нет команд "git unstage" или "git unadd". Соответствующее сложнее угадать или запомнить, но это довольно очевидно:
Мы можем легко создать псевдоним для этого:
И, наконец, у нас есть новые команды:
Лично я использую еще более короткие псевдонимы
В дополнение к принятому ответу, если ваш файл с ошибочной добавленной стоимостью был огромным, вы, вероятно, заметите, что даже после удаления его из индекса с помощью «git reset» он все еще занимает место в «.git». каталог.
Об этом не о чем беспокоиться; файл действительно все еще находится в хранилище, но только как «свободный объект». Он не будет скопирован в другие репозитории (с помощью клона, push), и пространство будет в конечном итоге восстановлено - хотя, возможно, не очень скоро. Если вы беспокоитесь, вы можете бежать:
Итак, что является реальным undo
git add
?git reset HEAD < file >
?или
git rm --cached < file >
?Строго говоря, и если я не ошибаюсь: нет .
git add
не может быть отменен - в общем, безопасно.Давайте сначала вспомним, что на самом деле делает
git add < file >
:Если
< file >
был ранее не отслеживался ,git add
добавляет его в кэш с его текущим содержимым.Если
< file >
был уже отслежен ,git add
сохраняет текущий контент (снимок, версия) в кеше. В Git это действие все еще называется add (а не просто update it), потому что две разные версии (снимки) файла рассматриваются как два разных элемента: следовательно, мы действительно добавляем новый элемент в кэш, который в конечном итоге будет передан позже.В свете этого вопрос немного неоднозначен:
Сценарий OP кажется первым (не отслеживаемый файл), мы хотим, чтобы «undo» удалял файл (а не только текущее содержимое) из отслеживаемых элементов. Если это так, то можно запустить
git rm --cached < file >
.И мы также можем запустить
git reset HEAD < file >
. В целом это предпочтительнее, поскольку оно работает в обоих сценариях: оно также выполняет отмену, когда мы ошибочно добавили версию уже отслеживаемого элемента.Но есть два предостережения.
Первое: есть (как указано в ответе) только один сценарий, в котором
git reset HEAD
не работает, ноgit rm --cached
делает: новый репозиторий (без коммитов). Но, действительно, это практически не имеет значения.Второе: имейте в виду, что
git reset HEAD
не может волшебным образом восстановить ранее кэшированное содержимое файла, он просто повторно синхронизирует его с HEAD. Если наше ошибочноеgit add
перезаписало предыдущую инсценированную незафиксированную версию, мы не сможем ее восстановить. Вот почему, строго говоря, мы не можем отменить [*].Пример:
Конечно, это не очень важно, если мы просто следуем обычному ленивому рабочему процессу выполнения «git add» только для добавления новых файлов (случай 1), и мы обновляем новое содержимое с помощью команды commit,
git commit -a
.& Лт; sup >
Undo файл, который уже был добавлен, довольно прост с помощью Git. Для сброса
myfile.txt
, который уже добавлен, используйте:Объяснение:
После того, как вы поставили ненужные файлы, чтобы отменить, вы можете сделать
git reset
.Head
- это глава вашего файла в локальном, а последний параметр - это имя вашего файла.Я создал шаги на изображении ниже в более подробной информации для вас, включая все шаги, которые могут произойти в этих случаях:
будет рекурсивно «откладывать» все, что вы добавили из своего текущего каталога
Запустить
и удалите все файлы вручную или выбрав их все и нажав кнопку unstage from commit .
Git имеет команды для каждого мыслимого действия, но ему нужны обширные знания, чтобы все исправить, и поэтому он в лучшем случае нелогичен...
Что ты делал раньше:
git add .
илиgit add < file >
.Что вы хотите:
Удалите файл из индекса, но сохраните его в версии и оставьте с незафиксированными изменениями в рабочей копии:
Сбросьте файл до последнего состояния из HEAD, отменив изменения и удалив их из индекса:
& Лт;!- язык: lang-bash - >
Это необходимо, так как
git reset --hard HEAD
не будет работать с отдельными файлами.Удалить
< file >
из индекса и версии, сохраняя неверсионный файл с изменениями в рабочей копии:Удалить
< file >
из рабочей копии и полностью изменить версию:Вопрос не совсем поставлен. Причина в том, что
git add
имеет два значения:git rm --cached file
.git reset HEAD file
.Если есть сомнения, используйте
Потому что это делает ожидаемую вещь в обоих случаях.
Предупреждение: если вы делаете
git rm --cached file
в файле, который был изменен (файл, который существовал ранее в хранилище), то файл будет удален вgit commit
,! Он все еще будет существовать в вашей файловой системе, но если кто-то еще извлечет ваш коммит, файл будет удален из их рабочего дерева.git status
сообщит вам, был ли файл новым файлом или измененным :Если вы используете свой первоначальный коммит и не можете использовать
git reset
, просто объявите «Git branch», удалите папку.git
и начните все сначалаСогласно многим другим ответам, вы можете использовать
git reset
НО:
Я нашел этот замечательный маленький пост, который фактически добавляет команду Git (ну, псевдоним) для
git unadd
: см. git unadd для деталей или..Просто,
Теперь вы можете
Используйте
git add -i
, чтобы удалить файлы с добавленной стоимостью из предстоящего коммита. Пример:Добавление файла, который вы не хотели:
Переход к интерактивному добавлению для отмены вашего добавления (команды, введенные в git здесь, это «r» (реверт), «1» (первая запись в списке реверт-шоу), «return» для выхода из режима реверта и «q» (бросить):
Вот и все! Вот ваше доказательство, показывающее, что «фу» вернулся в список без отслеживания:
git remove
илиgit rm
можно использовать для этого с флагом- cached
. Попробуй:Вот способ избежать этой неприятной проблемы при запуске нового проекта:
git init
.Git делает действительно трудным выполнение
git reset
, если у вас нет коммитов. Если вы создаете крошечный начальный коммит только ради его наличия, после этого вы можетеgit add -A
иgit reset
столько раз, сколько захотите, чтобы все исправить.Еще одним преимуществом этого метода является то, что если позже вы столкнетесь с проблемами с окончанием строки и вам нужно обновить все ваши файлы, это легко:
Обратите внимание, что если вы не указали ревизию, вы должны включить разделитель. Пример из моей консоли:
(Гит версия 1.7.5.4)
Возможно, Git развивался с тех пор, как вы опубликовали свой вопрос.
Теперь вы можете попробовать:
Это должно быть то, что вы ищете.
Удалять новые файлы из области подготовки (и только в случае нового файла), как предложено выше:
Используйте rm --cached только для случайно добавленных новых файлов.
Чтобы сбросить каждый файл в определенной папке (и ее подпапках), вы можете использовать следующую команду:
Используйте команду
*
для обработки нескольких файлов одновременно:так далее.