git-status
Название
git-status — показать состояние рабочего дерева
Краткое описание
git status [<options>] [--] [<pathspec>…]
Описание
Показывает пути, для которых есть различия между файлом индекса и текущим коммитом HEAD, пути, для которых есть различия между рабочим деревом и файлом индекса, а также пути в рабочем дереве, не отслеживаемые Git (и не игнорируемые gitignore[5]). Первые — это то, что вы would коммит, выполнив git commit; вторые и третьи — это то, что вы could коммит, выполнив git add перед запуском git commit.
Параметры
-
-s -
--short -
Выводить данные в кратком формате.
-
-b -
--branch -
Показывать сведения о ветке и отслеживании даже в кратком формате.
-
--show-stash -
Показывать количество записей, находящихся в stash.
-
--porcelain[=<version>] -
Выводить данные в удобном для обработки скриптами формате. Он похож на краткий вывод, но остается стабильным в разных версиях Git и независимо от пользовательских настроек. Подробности см. ниже.
Параметр
<version>используется для указания версии формата. Он необязателен; по умолчанию используется исходный форматv1. -
--long -
Выводить данные в полном формате. Это формат по умолчанию.
-
-v -
--verbose -
Помимо имен измененных файлов, показывать также текстовые изменения, подготовленные к коммиту (то есть аналогично выводу
gitdiff--cached). Если указать-vдважды, будут также показаны изменения в рабочем дереве, еще не добавленные в индекс (то есть аналогично выводуgitdiff). -
-u[<mode>] -
--untracked-files[=<mode>] -
Показывать неотслеживаемые файлы.
Параметр mode задает способ обработки неотслеживаемых файлов. Он необязателен: по умолчанию используется
all. Если параметр указан, он должен примыкать к опции (например,-uno, но не-uno).Возможные значения:
-
no -
Не показывать неотслеживаемые файлы.
-
normal -
Показывать неотслеживаемые файлы и каталоги.
-
all -
Также показывать отдельные файлы в неотслеживаемых каталогах.
Если параметр
-uне используется, неотслеживаемые файлы и каталоги показываются (то есть так же, как при указанииnormal), чтобы вы не забыли добавить новые файлы. Поиск неотслеживаемых файлов в файловой системе требует дополнительных затрат, поэтому в большом рабочем дереве этот режим может работать медленно. Если поддерживается, рассмотрите возможность включения кэша неотслеживаемых файлов и разделенного индекса (см.gitupdate-index--untracked-cacheиgitupdate-index--split-index). В противном случае можно использоватьno, чтобыgitstatusвыполнялась быстрее, не показывая неотслеживаемые файлы. Все обычные варианты записи логического значенияtrueинтерпретируются какnormal, аfalse— какno.Значение по умолчанию можно изменить с помощью переменной конфигурации
status.showUntrackedFiles, описанной в git-config[1]. -
-
--ignore-submodules[=<when>] -
Не учитывать изменения подмодулей при поиске изменений. Значение
<when>может бытьnone,untracked,dirtyилиall(значение по умолчанию).-
none -
подмодуль считается измененным, если он содержит неотслеживаемые или измененные файлы либо его HEAD отличается от коммита, записанного в суперпроекте. Это значение можно использовать для переопределения любых настроек параметра
ignoreв git-config[1] или gitmodules[5]. -
untracked -
подмодули не считаются измененными, если содержат только неотслеживаемые данные (при этом проверка на наличие измененных данных выполняется).
-
dirty -
игнорировать все изменения рабочего дерева подмодулей; показывать только изменения коммитов, сохраненных в суперпроекте (такое поведение использовалось до версии 1.7.0).
-
all -
скрывать все изменения подмодулей (а также отключать вывод сводок по подмодулям, если задан параметр конфигурации
status.submoduleSummary).
-
-
--ignored[=<mode>] -
Также показывать игнорируемые файлы.
Параметр mode задает способ обработки игнорируемых файлов. Он необязателен: по умолчанию используется
traditional.Возможные значения:
-
traditional -
Показывать игнорируемые файлы и каталоги, кроме случаев, когда указан
--untracked-files=all; тогда отображаются отдельные файлы в игнорируемых каталогах. -
no -
Не показывать игнорируемые файлы.
-
matching -
Показывать игнорируемые файлы и каталоги, соответствующие шаблону игнорирования.
Отображаются пути, явно соответствующие шаблону игнорирования. Если каталогу соответствует шаблон игнорирования, он отображается, но пути внутри игнорируемого каталога не показываются. Если каталог не соответствует шаблону игнорирования, но все его содержимое игнорируется, сам каталог не отображается, однако показывается все его содержимое.
-
-
-z -
Завершать записи символом
NULвместоLF. Если другой формат не задан, это подразумевает формат вывода--porcelain=v1. -
--column[=<options>] -
--no-column -
Отображать неотслеживаемые файлы в столбцах. Синтаксис параметров см. в переменной конфигурации
column.status. Опции--columnи--no-columnбез параметров эквивалентны соответственноalwaysиnever. -
--ahead-behind -
--no-ahead-behind -
Показывать или не показывать подробные сведения о количестве коммитов, на которые ветка опережает или отстает от своей вышестоящей ветки. По умолчанию используется
true. -
--renames -
--no-renames -
Включить или отключить обнаружение переименований независимо от пользовательских настроек. См. также
--no-renamesв git-diff[1]. -
--find-renames[=<n>] -
Включить обнаружение переименований, при необходимости задав порог схожести. См. также
--find-renamesв git-diff[1]. - <pathspec>...
-
См. запись
pathspecв gitglossary[7].
Вывод
Вывод этой команды предназначен для использования в качестве комментария к шаблону коммита. Формат по умолчанию, длинный формат, рассчитан на чтение человеком, он подробный и описательный. Его содержимое и формат могут измениться в любое время.
Пути, указанные в выводе, в отличие от многих других команд Git, становятся относительными к текущему каталогу, если вы работаете в подкаталоге (это сделано намеренно, чтобы упростить копирование и вставку). См. параметр конфигурации status.relativePaths ниже.
Краткий формат
В кратком формате состояние каждого пути отображается в одной из следующих форм
<xy> <path> <xy> <orig-path> -> <path>
где <orig-path> — это путь, откуда были взяты переименованные/скопированные данные. <orig-path> отображается только в том случае, если запись переименована или скопирована. <xy> — это двухбуквенный код состояния XY.
Поля (включая ->) разделяются одним пробелом. Если имя файла содержит пробельные или другие непечатаемые символы, это поле будет заключено в кавычки по правилам строкового литерала C: окружено двойными кавычками ASCII (34), а специальные символы внутри экранированы обратной косой чертой.
В этом формате отображаются три разных типа состояний, и каждый из них по-разному использует синтаксис <xy>:
-
Если выполняется слияние и оно завершилось успешно или слияние не выполняется,
Xпоказывает состояние индекса, аY— состояние рабочего дерева. -
Если возник конфликт слияния, который ещё не разрешён,
XиYпоказывают состояние, внесённое каждым из коммитов-родителей слияния относительно общего предка. Такие пути называютсяunmerged. -
Если путь не отслеживается,
XиYвсегда совпадают, поскольку этот путь неизвестен индексу. Для неотслеживаемых путей используется ??. Игнорируемые файлы не отображаются, если не используется--ignored; в этом случае игнорируемые файлы обозначаются как!!.
Обратите внимание, что термин merge здесь также включает перебазирование с использованием стандартной стратегии --merge, выборочное применение коммитов и любые другие операции, использующие механизм слияния.
В следующей таблице эти три класса показаны в отдельных разделах; для полей X и Y в первых двух разделах, где отображаются отслеживаемые пути, используются следующие символы:
- ' '
-
не изменён
-
M -
изменён
-
T -
изменился тип файла (обычный файл, символическая ссылка или подмодуль)
-
A -
добавлен
-
D -
удалён
-
R -
переименован
-
C -
скопирован (если параметр конфигурации status.renames имеет значение "copies")
-
U -
обновлён, но не слит
| X | Y | Значение |
|---|---|---|
[ | не обновлён | |
| [ | обновлён в индексе |
| [ | тип изменён в индексе |
| [ | добавлен в индекс |
| удалён из индекса | |
| [ | переименован в индексе |
| [ | скопирован в индексе |
[ | индекс и рабочее дерево совпадают | |
[ |
| рабочее дерево изменено после обновления индекса |
[ |
| тип изменён в рабочем дереве после обновления индекса |
[ |
| удалён из рабочего дерева |
| переименован в рабочем дереве | |
| скопирован в рабочем дереве | |
|
| не слит, удалён с обеих сторон |
|
| не слит, добавлен нами |
|
| не слит, удалён ими |
|
| не слит, добавлен ими |
|
| не слит, удалён нами |
|
| не слит, добавлен с обеих сторон |
|
| не слит, изменён с обеих сторон |
? | ? | не отслеживается |
|
| игнорируется |
У подмодулей больше состояний; вместо этого для них сообщается
-
M -
в подмодуле используется другой HEAD, чем тот, который записан в индексе
-
m -
содержимое подмодуля изменено
- ?
-
в подмодуле есть неотслеживаемые файлы
Так происходит потому, что изменённое содержимое или неотслеживаемые файлы в подмодуле нельзя добавить с помощью git add в суперпроект, чтобы подготовить коммит.
m и ? применяются рекурсивно. Например, если во вложенном подмодуле есть неотслеживаемый файл, он также будет обозначен как ?.
Если используется -b, перед кратким форматом статуса выводится строка
{empty}## <branchname> <tracking-info> Формат Porcelain, версия 1
Формат Porcelain версии 1 похож на краткий формат, но гарантированно не меняется несовместимым образом между версиями Git или в зависимости от пользовательской конфигурации. Поэтому он идеально подходит для разбора скриптами. Описание краткого формата выше также описывает формат Porcelain, за следующими исключениями:
-
Пользовательская настройка
color.statusне учитывается; цвет всегда отключён. -
Пользовательская настройка
status.relativePathsне учитывается; отображаемые пути всегда относительны к корню репозитория.
Также существует альтернативный формат -z, рекомендуемый для машинного разбора. В этом формате поле состояния остаётся таким же, но некоторые другие элементы меняются. Во-первых, в записях о переименовании опускается ->, а порядок полей меняется на обратный (например, from -> to становится to from). Во-вторых, после каждого имени файла ставится NUL (ASCII 0), заменяя пробел в качестве разделителя полей и завершающий символ новой строки (однако поле состояния по-прежнему отделяется от первого имени файла пробелом). В-третьих, имена файлов со специальными символами не форматируются особым образом: кавычки и экранирование обратной косой чертой не используются.
Любые изменения подмодулей отображаются как изменённое значение M, а не как m или одиночный ?.
Формат Porcelain, версия 2
Формат версии 2 добавляет более подробную информацию о состоянии рабочего дерева и изменённых элементах. В версии 2 также определён расширяемый набор простых для разбора необязательных заголовков.
Строки заголовков начинаются с # и добавляются в ответ на определённые аргументы командной строки. Парсеры должны игнорировать незнакомые им заголовки.
Заголовки ветки
Если указан --branch, выводится последовательность строк заголовков с информацией о текущей ветке.
| Строка | Примечания |
|---|---|
| Текущий коммит. |
| Текущая ветка. |
| Если задана вышестоящая ветка. |
| Если задана вышестоящая ветка и коммит существует. |
Информация о stash
Если указан --show-stash, выводится одна строка с количеством записей stash, если оно не равно нулю:
# stash <N>
Изменённые отслеживаемые записи
После заголовков выводится последовательность строк для отслеживаемых записей. Для описания записи может использоваться один из трёх различных форматов строк в зависимости от типа изменения. Отслеживаемые записи выводятся в неопределённом порядке; парсеры должны допускать любое сочетание трёх типов строк в любом порядке.
Обычные изменённые записи имеют следующий формат:
1 <XY> <sub> <mH> <mI> <mW> <hH> <hI> <path>
Переименованные или скопированные записи имеют следующий формат:
2 <XY> <sub> <mH> <mI> <mW> <hH> <hI> <X><score> <path><sep><origPath>
| Поле | Значение |
|---|---|
| Поле из 2 символов, содержащее значения XY для подготовленных и неподготовленных изменений, описанные в кратком формате; отсутствие изменений обозначается символом "." вместо пробела. |
| Поле из 4 символов, описывающее состояние подмодуля. "N…" — если запись не является подмодулем.
|
| Восьмеричный режим файла в HEAD. |
| Восьмеричный режим файла в индексе. |
| Восьмеричный режим файла в рабочем дереве. |
| Имя объекта в HEAD. |
| Имя объекта в индексе. |
| Оценка переименования или копирования (процент сходства между исходным и целевым объектами перемещения или копирования). Например, "R100" или "C75". |
| Путь. В переименованной/скопированной записи это целевой путь. |
| Если используется параметр |
| Путь в коммите HEAD или в индексе. Присутствует только в переименованной/скопированной записи и указывает, откуда были взяты переименованные/скопированные данные. |
Неслитые записи имеют следующий формат; первый символ — "u", отличающий их от обычных изменённых записей.
u <XY> <sub> <m1> <m2> <m3> <mW> <h1> <h2> <h3> <path>
| Поле | Значение |
|---|---|
| Поле из 2 символов, описывающее тип конфликта, как указано в кратком формате. |
| Поле из 4 символов, описывающее состояние подмодуля, как указано выше. |
| Восьмеричный режим файла на этапе 1. |
| Восьмеричный режим файла на этапе 2. |
| Восьмеричный режим файла на этапе 3. |
| Восьмеричный режим файла в рабочем дереве. |
| Имя объекта на этапе 1. |
| Имя объекта на этапе 2. |
| Имя объекта на этапе 3. |
| Путь. |
Другие элементы
После отслеживаемых записей (если это запрошено) выводится последовательность строк для неотслеживаемых, а затем игнорируемых элементов, найденных в рабочем дереве.
Неотслеживаемые элементы имеют следующий формат:
? <path>
Игнорируемые элементы имеют следующий формат:
! <path>
Примечания о формате путей и -z
Если указан параметр -z, пути выводятся как есть, без кавычек, а строки завершаются байтом NUL (ASCII 0x00).
Если параметр -z не указан, пути с «необычными» символами заключаются в кавычки, как описано для переменной конфигурации core.quotePath (см. git-config[1]).
Конфигурация
Команда учитывает настройки color.status (или status.color — они означают одно и то же, а последний вариант сохранён для обратной совместимости) и color.status.<slot>, чтобы окрашивать вывод.
Если для переменной конфигурации status.relativePaths задано значение false, все отображаемые пути будут относительными к корню репозитория, а не к текущему каталогу.
Если для status.submoduleSummary задано ненулевое число или значение true (что эквивалентно -1 или неограниченному числу), для длинного формата будет включена сводка подмодулей и будет показана сводка коммитов для изменённых подмодулей (см. параметр --summary-limit команды git-submodule[1]). Обратите внимание, что вывод сводки команды status будет подавлен для всех подмодулей, если для diff.ignoreSubmodules задано значение all, или только для тех подмодулей, для которых задано submodule.<name>.ignore=all. Чтобы также просмотреть сводку для игнорируемых подмодулей, можно использовать параметр командной строки --ignore-submodules=dirty или команду git submodule summary, которая выводит похожие данные, но не учитывает эти настройки.
Фоновое обновление
По умолчанию git status автоматически обновляет индекс: обновляет кэшированную статистическую информацию из рабочего дерева и записывает результат. Запись обновлённого индекса — оптимизация, которая не является строго необходимой (status вычисляет значения самостоятельно, но их запись избавляет последующие программы от повторения вычислений). При запуске status в фоновом режиме блокировка, удерживаемая во время записи, может конфликтовать с другими одновременно выполняющимися процессами, что приведёт к их сбою. Скриптам, запускающим status в фоновом режиме, следует рассмотреть возможность использования git --no-optional-locks status (подробности см. в git[1]).
Неотслеживаемые файлы и производительность
git status может работать очень медленно в больших рабочих деревьях, если ему приходится искать неотслеживаемые файлы и каталоги. Доступно множество параметров конфигурации, позволяющих ускорить работу: можно либо избежать выполнения этой работы, либо использовать кешированные результаты предыдущих команд Git. Единого оптимального набора настроек, подходящего всем, не существует. Мы кратко перечислим соответствующие параметры, чтобы помочь вам, но прежде чем переходить к списку, попробуйте ещё раз выполнить git status: возможно, ваша конфигурация уже кеширует результаты git status, поэтому при последующих запусках команда может выполняться быстрее.
-
Флаг
--untracked-files=noили параметр конфигурацииstatus.showUntrackedFiles=no(см. описание обоих выше): указывают, чтоgitstatusне должна сообщать о неотслеживаемых файлах. Это самый быстрый вариант.gitstatusне будет выводить список неотслеживаемых файлов, поэтому вам нужно не забывать о созданных вами новых файлах и вручную выполнять для них командуgitadd. -
advice.statusUoption=false(см. git-config[1]): если задать для этой переменной значениеfalse, отключается предупреждение, выводимое в случаях, когда перечисление неотслеживаемых файлов занимает более 2 секунд. В большом проекте это может занимать больше времени, и пользователь, возможно, уже согласился на такой компромисс (например, использование-unoможет быть неприемлемым вариантом). В таком случае выводить предупреждение бессмысленно, поэтому лучше его отключить. -
core.untrackedCache=true(см. git-update-index[1]): включает кеш неотслеживаемых файлов и выполняет поиск только в каталогах, изменённых после предыдущей командыgitstatus. Git запоминает набор неотслеживаемых файлов в каждом каталоге и предполагает, что если каталог не изменялся, то и набор неотслеживаемых файлов в нём остался прежним. Это гораздо быстрее, чем перечислять содержимое каждого каталога, но всё же требует затрат, поскольку Git всё ещё должен искать изменённые каталоги. Кеш неотслеживаемых файлов хранится в файле.git/index. Снижение затрат на поиск неотслеживаемых файлов несколько компенсируется увеличением размера индекса и затратами на его актуализацию. Обычно выигрыш во времени поиска оправдывает дополнительный размер. -
core.untrackedCache=trueиcore.fsmonitor=trueилиcore.fsmonitor=<hook-command-pathname> (см. git-update-index[1]): включают и кеш неотслеживаемых файлов, и функцию FSMonitor, а поиск выполняется только в каталогах, изменённых после предыдущей командыgitstatus. Это быстрее, чем использовать только кеш неотслеживаемых файлов, поскольку Git может также избежать поиска изменённых каталогов. Git достаточно перечислить точный набор каталогов, которые недавно изменились. Функцию FSMonitor можно включить и без кеша неотслеживаемых файлов, но в этом случае её преимущества значительно меньше.
Обратите внимание: после включения кеша неотслеживаемых файлов и/или функции FSMonitor может потребоваться выполнить несколько команд git status, прежде чем различные кеши прогреются и вы заметите ускорение работы команд. Это нормально.
См. также
status
© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/git-status