Я по ошибке добавил файлы в Git с помощью команды:
git add myfile.txt
Я еще не бегал git commit
. Есть ли способ отменить это, чтобы эти файлы не были включены в коммит?
git
version-control
git-commit
git-stage
paxos1977
источник
источник
HEAD
илиhead
могут теперь использовать@
вместоHEAD
вместо этого. Посмотрите этот ответ (последний раздел), чтобы узнать, почему вы можете это сделать.git checkout
не удаляет поэтапные изменения из индекса фиксации. Он только отменяет не поэтапные изменения последней зафиксированной ревизии - что, кстати, тоже не то, что я хочу, я хочу эти изменения, я просто хочу, чтобы они были в более поздней фиксации.Ответы:
Вы можете отменить,
git add
прежде чем совершить скоторый удалит его из текущего индекса (список «собирается быть зафиксирован»), ничего не меняя.
Ты можешь использовать
без какого-либо имени файла, чтобы удалить все должные изменения. Это может пригодиться, когда слишком много файлов для перечисления один за другим в разумные сроки.
В старых версиях Git вышеприведенные команды эквивалентны
git reset HEAD <file>
иgit reset HEAD
соответственно и завершатся неудачей, еслиHEAD
не определено (потому что вы еще не сделали никаких коммитов в вашем хранилище) или неоднозначно (потому что вы создали ветвь с именемHEAD
, что глупо что вы не должны делать). Это изменилось в Git 1.8.2 , поэтому в современных версиях Git вы можете использовать приведенные выше команды даже до того, как сделаете первый коммит:источник
git add
версия перезаписала предыдущую подготовленную незафиксированную версию, мы не сможем ее восстановить. Я попытался уточнить это в своем ответе ниже.git reset HEAD *.ext
гдеext
файлы с заданным расширением, которые вы хотите удалить. Для меня это было*.bmp
&*.zip
git rm --cached
), это означает, что вы готовитесь сделать коммит, который удаляет этот файл.git reset HEAD <filename>
с другой стороны, скопирует файл из HEAD в индекс, чтобы при следующей фиксации не было внесено никаких изменений в этот файл.git reset -p
просто какgit add -p
. Это круто!git add
вы хотите восстановить (61/3AF3...
- > идентификатор объекта613AF3...
), тоgit cat-file -p <object-id>
(может быть, стоит восстановить несколько часов работы, но также и урок, который нужно совершать чаще ...)Ты хочешь:
Обоснование:
Когда я был новичком в этом, я впервые попробовал
(чтобы отменить все мои начальные добавления), только чтобы получить это (не очень) полезное сообщение:
Оказывается, это потому, что ссылка HEAD (ветвь?) Существует только после первого коммита. То есть, вы столкнетесь с той же проблемой новичка, что и я, если ваш рабочий процесс, такой как мой, будет выглядеть примерно так:
git init
git add .
git status
... много дерьмовых свитков ...
=> Черт, я не хотел добавлять все это.
google "отменить git add"
=> найти переполнение стека - ууу
git reset .
=> fatal: Не удалось разрешить 'HEAD' в качестве действительного ссылки.
Кроме того, выясняется, что в списке рассылки зафиксирована ошибка против этой бесполезности.
И что правильное решение было прямо там, в выводе статуса Git (который, да, я назвал «дерьмом»)
И решение действительно заключается в использовании
git rm --cached FILE
.Обратите внимание на предупреждения в другом месте здесь -
git rm
удаляет вашу локальную рабочую копию файла, но не, если вы используете --cached . Вот результатgit help rm
:Я приступаю к использованию
удалить все и начать заново. Не сработало, хотя, потому что пока
add .
рекурсивно, оказывается,rm
необходимо-r
рекурсивно. Вздох.Хорошо, теперь я вернулся к тому, с чего начал. В следующий раз я собираюсь использовать
-n
пробный прогон и посмотреть, что будет добавлено:Я заархивировал все в безопасное место, прежде чем поверить
git help rm
в--cached
то, что ничего не разрушено (и что, если я ошибся в этом).источник
rm -rf .git
,git init
потому что я не доверялgit rm --cached
сохранить свою рабочую копию. Это говорит немного о том, как git все еще слишком сложен в некоторых местах.git unstage
должна быть просто стандартная команда, мне все равно, могу ли я добавить ее в качестве псевдонима.git reset HEAD <File>...
git add
команда добавляла новые файлы, но не вносила изменения в существующие файлы.Если вы введете:
Git расскажет вам, что ставится и т. Д., Включая инструкции о том, как выполнить расстановку:
Я нахожу, что Git довольно хорошо подталкивает меня делать правильные вещи в подобных ситуациях.
Примечание: последние версии Git (1.8.4.x) изменили это сообщение:
источник
add
, отслеживался ли уже отредактированный файл (add
единственная сохраненная новая версия в кеш - здесь будет показано ваше сообщение). В другом месте, если файл не был предварительно подготовлен, он будет отображатьсяuse "git rm --cached <file>..." to unstage
git reset HEAD <file>
Один единственный , который будет работать в случае , если вы хотите убрать из буфера файла удаленияgit reset HEAD
чтобы нестандартно.Для пояснения:
git add
перемещает изменения из текущего рабочего каталога в область подготовки (индекс).Этот процесс называется постановкой . Таким образом, наиболее естественная команда этапа изменения (измененные файлы) является очевидным:
git add
простой псевдоним дляgit stage
Жалко нет
git unstage
ниgit unadd
команд. Соответствующий труднее угадать или запомнить, но он довольно очевиден:Мы можем легко создать псевдоним для этого:
И наконец, у нас есть новые команды:
Лично я использую даже более короткие псевдонимы:
источник
git stage
это псевдоним дляgit add
, который является исторической командой, как на Git, так и на других SCM. Он был добавлен в декабре 2008 года с коммитом 11920d28da в «Git's git репозиторий», если можно так выразиться.В дополнение к принятому ответу, если ваш ошибочно добавленный файл был огромным, вы, вероятно, заметите, что даже после удаления его из индекса с помощью '
git reset
' он все равно занимает место в.git
каталоге.Это не о чем беспокоиться; файл действительно все еще находится в хранилище, но только как «свободный объект». Он не будет скопирован в другие репозитории (через клон, push), и пространство будет в конечном итоге восстановлено - хотя, возможно, не очень скоро. Если вы беспокоитесь, вы можете запустить:
Обновить (далее я попытаюсь прояснить некоторую путаницу, которая может возникнуть из-за ответов с наибольшим количеством голосов):
Итак, что реальный откат от
git add
?git reset HEAD <file>
?или
git rm --cached <file>
?Собственно говоря, и если я не ошибаюсь нет .
git add
не может быть отменено - безопасно, в общем.Давайте вспомним сначала, что
git add <file>
самом деле делает:Если
<file>
был ранее не отслеживаются ,git add
добавляет его в кэш , с его текущим содержанием.Если
<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 add' только для добавления новых файлов (случай 1), и мы обновляем новое содержимое с помощью команды commit,
git commit -a
command.* (Редактировать: вышеупомянутое практически правильно, но все же могут быть несколько хакерские / запутанные способы восстановления изменений, которые были поставлены, но не зафиксированы, а затем перезаписаны - см. Комментарии Йоханнеса Матокича и iolsmit)
источник
git cat-file
можно использовать для восстановления его содержимого.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
Отменить файл, который уже был добавлен, довольно просто с помощью Git. Для сброса
myfile.txt
, который уже был добавлен, используйте:Объяснение:
После того, как вы поставили ненужные файлы, отменить их можно
git reset
.Head
является заголовком вашего файла в локальном, а последний параметр является именем вашего файла.Я создал шаги на изображении ниже для более подробной информации, включая все шаги, которые могут произойти в этих случаях:
источник
рекурсивно "удалит" все, что вы добавили из вашего текущего каталога
источник
git reset HEAD <file>
сказал быfatal: Failed to resolve 'HEAD' as a valid ref.
Запустить
и удалите все файлы вручную или, выбрав их все и нажав на кнопку unstatage from commit .
источник
git-gui
....» :)У Git есть команды для каждого мыслимого действия, но ему нужны обширные знания, чтобы понять все правильно, и поэтому он в лучшем случае нелогичен ...
Что вы делали раньше:
git add .
, илиgit add <file>
.То, что ты хочешь:
Удалите файл из индекса, но оставьте его версионным и оставьте с незафиксированными изменениями в рабочей копии:
Сбросьте файл до последнего состояния из HEAD, отмените изменения и удалите их из индекса:
Это необходимо, поскольку
git reset --hard HEAD
не будет работать с отдельными файлами.Удалить
<file>
из индекса и управления версиями, сохранив файл без версии с изменениями в рабочей копии:Удалить
<file>
из рабочей копии и полностью управлять версиями:источник
reset head
отменяет ваши текущие изменения, но git по-прежнему отслеживает файл.rm --cached
выводит файл из-под контроля версий, поэтому git больше не проверяет его на наличие изменений (а также удаляет в конечном итоге проиндексированные текущие изменения, переданные git ранееadd
), но измененный файл будет сохранен в вашей рабочей копии, которая находится в вашей файловой папке на жестком диске.git reset HEAD <file>
временная - команда будет применена только к следующемуgit rm --cached <file>
коммиту , но будет отменена до тех пор, пока не будет добавлена сноваgit add <file>
. Кроме того, этоgit rm --cached <file>
означает, что если вы нажмете эту ветку на удаленном компьютере, любой, кто потянет ветку, получит файл, фактически удаленный из их папки.Вопрос не четко поставлен. Причина в том, что
git add
имеет два значения:git rm --cached file
.git reset HEAD file
.Если сомневаетесь, используйте
Потому что это делает ожидаемую вещь в обоих случаях.
Предупреждение: если вы сделаете
git rm --cached file
файл, который был изменен (файл, который существовал ранее в хранилище), то этот файл будет удален вgit commit
! Он все еще будет существовать в вашей файловой системе, но если кто-нибудь еще извлечет ваш коммит, файл будет удален из их рабочего дерева.git status
скажет вам, был ли файл новым файлом или изменен :источник
git rm --cached somefile
. Я надеюсь, что этот ответ поднимется по странице на видное место, где он сможет защитить новичков от введения в заблуждение всеми ложными утверждениями.Если вы выполняете первоначальный коммит и не можете его использовать
git reset
, просто объявите «Git банкротство», удалите.git
папку и начните сначала.источник
git add -A && git rm --cached EXCLUDEFILE && git commit -m 'awesome commit'
(Это также работает, когда нет предыдущихFailed to resolve 'HEAD'
Как и во многих других ответах, вы можете использовать
git reset
НО:
Я нашел этот замечательный небольшой пост, который фактически добавляет команду Git (ну, псевдоним) для
git unadd
: см. Git unadd для деталей или ..Просто,
Теперь вы можете
источник
использование
git add -i
для удаления только что добавленных файлов из вашего предстоящего коммита. Пример:Добавление файла, который вы не хотели:
Переход к интерактивному добавлению для отмены добавления (команды, набранные здесь в git: «r» (возврат), «1» (первая запись в списке показывает возврат), «возврат», чтобы выйти из режима возврата, и «q» (уволиться):
Это оно! Вот ваше доказательство, показывающее, что «foo» снова в списке неотслеживаемых:
источник
git remove
илиgit rm
может быть использован для этого с--cached
флагом. Пытаться:источник
git rm --cached ...
удалит файлы из репозитория git Они все еще будут существовать на вашем компьютере, но это ОЧЕНЬ отличается от постоянных изменений в файле. Для любого, кто наткнулся на это, это неправильный ответ на вопрос.Вот способ избежать этой неприятной проблемы при запуске нового проекта:
git init
.Git делает это действительно трудно,
git reset
если у вас нет коммитов. Если вы создаете крошечный начальный коммит только ради его получения, после этого вы можетеgit add -A
иgit reset
столько раз, сколько хотите, чтобы все было правильно.Еще одним преимуществом этого метода является то, что если вы столкнетесь с проблемами, связанными с окончанием строки, и вам потребуется обновить все ваши файлы, это легко:
источник
autocrlf
значения ... Это не будет работать в каждом проекте, в зависимости от настроек.git reset somefile
иgit reset
оба работают до первого коммита, сейчас. Так было с тех пор, как несколько релизов Git вернулись.Возможно, Git эволюционировал с тех пор, как вы опубликовали свой вопрос.
Теперь вы можете попробовать:
Это должно быть то, что вы ищете.
источник
Обратите внимание, что если вы не указали ревизию, вам необходимо включить разделитель. Пример из моей консоли:
(Git версия 1.7.5.4)
источник
git reset <path>
и это работает просто отлично без разделителя. Я также использую git 1.9.0. Может быть, это не работает в старых версиях?Чтобы удалить новые файлы из промежуточной области (и только в случае нового файла), как предложено выше:
Используйте rm --cached только для случайно добавленных новых файлов.
источник
--cached
это действительно важная часть здесь.Чтобы сбросить каждый файл в определенной папке (и ее подпапках), вы можете использовать следующую команду:
источник
git status
чтобы увидеть что - нибудь оставшееся и сбросить его вручную то естьgit reset file
.Используйте
*
команду для обработки нескольких файлов одновременно:и т.п.
источник
.*
или.*.prj
Просто наберите
git reset
его, он вернется назад, и это похоже на то, что вы никогда не печаталиgit add .
с момента последнего коммита. Убедитесь, что вы совершили ранее.источник
Предположим, я создаю новый файл
newFile.txt
:Предположим, я случайно добавил файл
git add newFile.txt
:Теперь я хочу отменить это добавление перед коммитом
git reset newFile.txt
:источник
Для конкретного файла:
Для всех добавленных файлов:
Примечание: checkout изменяет код в файлах и переходит в последнее обновленное (подтвержденное) состояние. сброс не меняет коды; это просто сбрасывает заголовок.
источник
git reset <file>
иgit checkout <file>
.Эта команда отменяет ваши изменения:
Вы также можете использовать
добавить части файлов.
источник
Также есть интерактивный режим:
Выберите опцию 3, чтобы удалить файлы. В моем случае я часто хочу добавить более одного файла, и в интерактивном режиме вы можете использовать такие номера, чтобы добавить файлы. Это займет все, кроме 4: 1, 2, 3 и 5
Чтобы выбрать последовательность, просто введите 1-5, чтобы взять все от 1 до 5.
Git промежуточные файлы
источник
Чтобы отменить
git add
, используйте:источник
Удалит файл с именем filename.txt из текущего индекса, области «собирается быть зафиксирован», без изменения чего-либо еще.
источник
git add myfile.txt
# Это добавит ваш файл в список для подтвержденияСовершенно противоположно этой команде,
Итак, вы будете в предыдущем состоянии. Указанный будет снова в неотслеживаемом списке (предыдущее состояние).
Это сбросит вашу голову с этим указанным файлом. так что, если у вашей головы нет этого средства, оно просто сбросит его.
источник
В Sourcetree вы можете сделать это легко через графический интерфейс. Вы можете проверить, какую команду Sourcetree использует для удаления файла.
Я создал новый файл и добавил его в Git. Затем я удалил его с помощью Sourcetree GUI. Это результат:
Sourcetree использует
reset
для удаления новых файлов.источник
источник