Если вы добавили файл в индекс Git-проекта на Mac, но хотите исключить его из следующего коммита, выполните git restore --staged для этого файла в Терминале. Это обновит область подготовленных файлов Git, оставив файл в рабочей папке, благодаря чему изменения останутся доступными для просмотра или последующего добавления в индекс. Перед коммитом проверьте путь к файлу и подтвердите результат с помощью git status.
Что меняет удаление из индекса («unstage»)
Git хранит подготовленный следующий коммит в своем индексе (также называемом областью подготовки, staging area). Коммит обычно включает подготовленные (staged) изменения; правки, которые вы не добавили в индекс, остаются в вашем рабочем дереве. Таким образом, удаление файла из индекса меняет то, что подготовлено для коммита, без необходимости перезаписывать рабочую копию. В документации Git указано, что команда git restore --staged по умолчанию восстанавливает индекс из HEAD. Документация Git по restore
Это полезно, когда вы добавили в индекс не тот файл или решили, что один файл должен остаться за пределами коммита. Команда применяется к конкретному файлу, если указать один путь. Не добавляйте --worktree: согласно документации Git, одновременное использование --staged и --worktree восстанавливает обе области, что не подходит, если вы хотите сохранить свои правки.
Как убрать один файл из индекса в Терминале
Откройте Терминал на Mac и перейдите в папку репозитория. Оболочкой по умолчанию в Терминале является zsh, хотя на управляемом Mac может использоваться другая оболочка. Руководство по Терминалу от Apple
Сначала выполните git status. Найдите проиндексированный файл в разделе «Changes to be committed» и обратите внимание на его путь относительно корня репозитория. Если вы видите другой репозиторий или путь неясен, остановитесь и проверьте свое текущее расположение, прежде чем что-либо менять.
Например, чтобы убрать из индекса src/Feature.swift, выполните:
git restore --staged -- src/Feature.swift
Символ -- отделяет параметры от пути. Это полезно для имен, которые иначе могли бы быть прочитаны как параметры. Заключайте пути, содержащие пробелы, в кавычки, чтобы zsh передавал путь как один аргумент:
git restore --staged -- "Documentation/Setup Notes.md"
Используйте путь точно так, как его выводит Git, включая регистр символов и имена каталогов. Если вы уже находитесь в подкаталоге репозитория, обработка путей в Git может быть менее очевидной; запуск команды из корня репозитория с использованием полного пути относительно репозитория упрощает проверку цели.
Убедитесь, что изменения сохранились
Выполните git status еще раз. Для отслеживаемого измененного файла подготовленное изменение должно исчезнуть из «Changes to be committed» и появиться в «Changes not staged for commit». Это означает, что рабочая копия все еще отличается от HEAD, но индекс больше не содержит это предложенное изменение. Согласно описанию Git, команда status показывает различия между HEAD и индексом, а также между индексом и рабочим деревом. Документация Git по add
Вы можете просмотреть неиндексированные изменения с помощью:
git diff -- "src/Feature.swift"
Этот diff сравнивает рабочий файл с индексом. Поскольку индекс для этого отслеживаемого файла теперь совпадает с HEAD, команда покажет сохраненные изменения, которые вы убрали из индекса. Чтобы подготовить файл для последующего коммита, снова добавьте его в индекс с помощью git add -- "src/Feature.swift".
Что происходит с новыми и удаленными файлами
Если файл новый и ни разу не фиксировался, у него нет версии в HEAD. После того как git restore --staged -- path/to/new-file удалит его из индекса, файл должен остаться на диске как неотслеживаемый (untracked). Убедитесь, что он отображается в разделе «Untracked files» при вызове git status; не удаляйте его, если хотите сохранить.
Если вы добавили в индекс удаление отслеживаемого файла, восстановление индекса из HEAD вернет отслеживаемую версию обратно в индекс, в то время как рабочая копия останется удаленной. В выводе status отобразится неиндексированное удаление. Это различие важно: исключение из индекса не обязательно возвращает рабочее дерево в исходный вид; оно сохраняет состояние, фактически присутствующее на диске.
Если вы добавили в индекс только часть файла
Эта же команда убирает из индекса все подготовленное содержимое файла целиком. Если вы намеренно добавили в индекс отдельные фрагменты (hunks) и хотите оставить проиндексированными только выбранные из них, не выполняйте команду для файла целиком. Команда restore в Git поддерживает интерактивный режим работы с патчами, однако выбор правильного направления и фрагментов требует внимательности. Изучите описанное в документации Git поведение git restore --patch перед его использованием; также в документации Git описана команда git add --patch для интерактивного выбора фрагментов для добавления в индекс. Документация Git по restore
Избегайте git restore --worktree или git restore --staged --worktree для этой задачи. Эти параметры затрагивают рабочее дерево и могут безвозвратно удалить именно те изменения, которые вы пытаетесь сохранить. Если результат в git status отличается от ожидаемого, сделайте паузу и проверьте путь и diff перед выполнением следующей команды restore.
Источники
Смена оболочки по умолчанию в приложении «Терминал» на Mac — Служба поддержки Apple