← Назад к вопросам

Что делает команда git unstage?

2.0 Middle🔥 201 комментариев
#Git

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разбор команды git unstage

Команда git unstage не является встроенной, "родной" командой Git. Это псевдоним (alias), который часто настраивается пользователями для удобства. По умолчанию, в "чистом" Git её не существует. Её цель — выполнять операцию, обратную git add, то есть удалять файлы из индекса (из так называемой "промежуточной области" или staging area), тем самым отменяя их подготовку к коммиту.

Что такое "индекс" (staging area) и "unstaging"

Прежде всего, важно понять основной рабочий процесс Git:

  1. Вы вносите изменения в файлы в рабочей директории (working directory).
  2. Вы выбираете (git add) конкретные изменения, которые должны попасть в следующий коммит. Эти изменения помещаются в индекс (staging area).
  3. Вы создаете коммит (git commit), который фиксирует состояние, хранящееся в индексе.

Таким образом, "unstage" — это процесс удаления файла (или изменений в нем) из этого промежуточного индекса. Файл возвращается в рабочую директорию, но внесенные в него правки при этом не пропадают. Они просто перестают быть "готовыми к коммиту".

Как выполнить "unstaging" стандартными средствами Git

Для выполнения операции "unstaging" в Git используется команда git reset. Её базовый синтаксис для этой цели:

git reset [<commit>] [<path>...]

Стандартная и самая частая команда для "unstaging" файла file.txt:

git reset HEAD file.txt
  • HEAD указывает на текущий коммит. Команда берет версию файла из последнего коммита (HEAD) и помещает её в индекс, перезаписывая проиндексированные изменения.
  • Более современная и рекомендуемая форма (начиная примерно с Git 1.8.2) — git reset -- file.txt. Флаг -- является разделителем, который явно указывает, что дальше следуют имена файлов.

Пример:

# 1. Вносим изменения в два файла
echo "new line" >> feature.txt
echo "fix" >> bugfix.txt

# 2. Подготавливаем оба файла к коммиту
git add feature.txt bugfix.txt

# 3. Проверяем статус: оба файла в разделе "Changes to be committed"
git status

# 4. Решаем, что файл feature.txt пока рано коммитить. Убираем его из индекса.
git reset HEAD feature.txt

# 5. Проверяем статус снова:
#    - bugfix.txt все еще подготовлен к коммиту (в индексе).
#    - feature.txt находится в разделе "Changes not staged for commit".
#    Его изменения сохранены на диске, но не будут частью следующего коммита.

Настройка alias git unstage для удобства

Чтобы не запоминать синтаксис git reset HEAD --, пользователи часто добавляют alias в свою глобальную конфигурацию Git. Это делает команду более интуитивной, особенно для новичков.

Создание алиаса:

git config --global alias.unstage 'reset HEAD --'

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

git unstage file.txt

Эта команда будет работать абсолютно идентично git reset HEAD -- file.txt.

Важные нюансы и альтернативы

  • git restore --staged <file>: Начиная с Git версии 2.23 (2019 год), была введена новая, более семантически понятная команда git restore. Команда git restore --staged <file> является современной рекомендуемой альтернативой для "unstaging". Она явно говорит о намерении: "восстановить состояние файла в индексе (staged) из коммита HEAD". Многие новые проекты и документации отдают предпочтение именно ей.
  • Что происходит с изменениями? Сами изменения в рабочем каталоге остаются нетронутыми. git reset HEAD -- file.txt или git restore --staged file.txt затрагивают только индекс.
  • Если не указать файл: Если выполнить git reset HEAD без указания файлов, команда unstage все файлы в индексе. Это может быть полезно, если вы ошибочно добавили git add . и хотите начать подготовку заново, более избирательно.

Вывод

Команда git unstage — это удобный псевдоним для стандартной операции Git по удалению файлов из индекса (staging area). Под капотом она выполняется через git reset HEAD -- <file> или, в современных версиях Git, через более явную команду git restore --staged <file>. Её главная задача — позволить разработчику гибко управлять содержимым следующего коммита, убирая из него те изменения, которые к нему пока не готовы, при этом не теряя самой проделанной работы.