Spec-Zone.ru › Git

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

Помимо имен измененных файлов, показывать также текстовые изменения, подготовленные к коммиту (то есть аналогично выводу git diff --cached). Если указать -v дважды, будут также показаны изменения в рабочем дереве, еще не добавленные в индекс (то есть аналогично выводу git diff).

-u[<mode>]
--untracked-files[=<mode>]

Показывать неотслеживаемые файлы.

Параметр mode задает способ обработки неотслеживаемых файлов. Он необязателен: по умолчанию используется all. Если параметр указан, он должен примыкать к опции (например, -uno, но не -u no).

Возможные значения:

no

Не показывать неотслеживаемые файлы.

normal

Показывать неотслеживаемые файлы и каталоги.

all

Также показывать отдельные файлы в неотслеживаемых каталогах.

Если параметр -u не используется, неотслеживаемые файлы и каталоги показываются (то есть так же, как при указании normal), чтобы вы не забыли добавить новые файлы. Поиск неотслеживаемых файлов в файловой системе требует дополнительных затрат, поэтому в большом рабочем дереве этот режим может работать медленно. Если поддерживается, рассмотрите возможность включения кэша неотслеживаемых файлов и разделенного индекса (см. git update-index --untracked-cache и git update-index --split-index). В противном случае можно использовать no, чтобы git status выполнялась быстрее, не показывая неотслеживаемые файлы. Все обычные варианты записи логического значения 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 Значение

[AMD]

не обновлён

M

[ MTD]

обновлён в индексе

T

[ MTD]

тип изменён в индексе

A

[ MTD]

добавлен в индекс

D

удалён из индекса

R

[ MTD]

переименован в индексе

C

[ MTD]

скопирован в индексе

[MTARC]

индекс и рабочее дерево совпадают

[ MTARC]

M

рабочее дерево изменено после обновления индекса

[ MTARC]

T

тип изменён в рабочем дереве после обновления индекса

[ MTARC]

D

удалён из рабочего дерева

R

переименован в рабочем дереве

C

скопирован в рабочем дереве

D

D

не слит, удалён с обеих сторон

A

U

не слит, добавлен нами

U

D

не слит, удалён ими

U

A

не слит, добавлен ими

D

U

не слит, удалён нами

A

A

не слит, добавлен с обеих сторон

U

U

не слит, изменён с обеих сторон

?

?

не отслеживается

!

!

игнорируется

У подмодулей больше состояний; вместо этого для них сообщается

M

в подмодуле используется другой HEAD, чем тот, который записан в индексе

m

содержимое подмодуля изменено

?

в подмодуле есть неотслеживаемые файлы

Так происходит потому, что изменённое содержимое или неотслеживаемые файлы в подмодуле нельзя добавить с помощью git add в суперпроект, чтобы подготовить коммит.

m и ? применяются рекурсивно. Например, если во вложенном подмодуле есть неотслеживаемый файл, он также будет обозначен как ?.

Если используется -b, перед кратким форматом статуса выводится строка

{empty}## <branchname> <tracking-info>

Формат Porcelain, версия 1

Формат Porcelain версии 1 похож на краткий формат, но гарантированно не меняется несовместимым образом между версиями Git или в зависимости от пользовательской конфигурации. Поэтому он идеально подходит для разбора скриптами. Описание краткого формата выше также описывает формат Porcelain, за следующими исключениями:

  1. Пользовательская настройка color.status не учитывается; цвет всегда отключён.

  2. Пользовательская настройка status.relativePaths не учитывается; отображаемые пути всегда относительны к корню репозитория.

Также существует альтернативный формат -z, рекомендуемый для машинного разбора. В этом формате поле состояния остаётся таким же, но некоторые другие элементы меняются. Во-первых, в записях о переименовании опускается ->, а порядок полей меняется на обратный (например, from -> to становится to from). Во-вторых, после каждого имени файла ставится NUL (ASCII 0), заменяя пробел в качестве разделителя полей и завершающий символ новой строки (однако поле состояния по-прежнему отделяется от первого имени файла пробелом). В-третьих, имена файлов со специальными символами не форматируются особым образом: кавычки и экранирование обратной косой чертой не используются.

Любые изменения подмодулей отображаются как изменённое значение M, а не как m или одиночный ?.

Формат Porcelain, версия 2

Формат версии 2 добавляет более подробную информацию о состоянии рабочего дерева и изменённых элементах. В версии 2 также определён расширяемый набор простых для разбора необязательных заголовков.

Строки заголовков начинаются с # и добавляются в ответ на определённые аргументы командной строки. Парсеры должны игнорировать незнакомые им заголовки.

Заголовки ветки

Если указан --branch, выводится последовательность строк заголовков с информацией о текущей ветке.

Строка Примечания

# branch.oid <commit> | (initial)

Текущий коммит.

# branch.head <branch> | (detached)

Текущая ветка.

# branch.upstream <upstream-branch>

Если задана вышестоящая ветка.

# branch.ab +<ahead> -<behind>

Если задана вышестоящая ветка и коммит существует.

Информация о 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>
Поле Значение

<XY>

Поле из 2 символов, содержащее значения XY для подготовленных и неподготовленных изменений, описанные в кратком формате; отсутствие изменений обозначается символом "." вместо пробела.

<sub>

Поле из 4 символов, описывающее состояние подмодуля. "N…​" — если запись не является подмодулем. S<c><m><u> — если запись является подмодулем.

  • <c> равно "C", если коммит изменился; в противном случае — ".".

  • <m> равно "M", если имеются отслеживаемые изменения; в противном случае — ".".

  • <u> равно "U", если имеются неотслеживаемые изменения; в противном случае — ".".

<mH>

Восьмеричный режим файла в HEAD.

<mI>

Восьмеричный режим файла в индексе.

<mW>

Восьмеричный режим файла в рабочем дереве.

<hH>

Имя объекта в HEAD.

<hI>

Имя объекта в индексе.

<X><score>

Оценка переименования или копирования (процент сходства между исходным и целевым объектами перемещения или копирования). Например, "R100" или "C75".

<path>

Путь. В переименованной/скопированной записи это целевой путь.

<sep>

Если используется параметр -z, два пути разделяются байтом NUL (ASCII 0x00); в противном случае они разделяются байтом TAB (ASCII 0x09).

<origPath>

Путь в коммите HEAD или в индексе. Присутствует только в переименованной/скопированной записи и указывает, откуда были взяты переименованные/скопированные данные.

Неслитые записи имеют следующий формат; первый символ — "u", отличающий их от обычных изменённых записей.

u <XY> <sub> <m1> <m2> <m3> <mW> <h1> <h2> <h3> <path>
Поле Значение

<XY>

Поле из 2 символов, описывающее тип конфликта, как указано в кратком формате.

<sub>

Поле из 4 символов, описывающее состояние подмодуля, как указано выше.

<m1>

Восьмеричный режим файла на этапе 1.

<m2>

Восьмеричный режим файла на этапе 2.

<m3>

Восьмеричный режим файла на этапе 3.

<mW>

Восьмеричный режим файла в рабочем дереве.

<h1>

Имя объекта на этапе 1.

<h2>

Имя объекта на этапе 2.

<h3>

Имя объекта на этапе 3.

<path>

Путь.

Другие элементы

После отслеживаемых записей (если это запрошено) выводится последовательность строк для неотслеживаемых, а затем игнорируемых элементов, найденных в рабочем дереве.

Неотслеживаемые элементы имеют следующий формат:

? <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 (см. описание обоих выше): указывают, что git status не должна сообщать о неотслеживаемых файлах. Это самый быстрый вариант. git status не будет выводить список неотслеживаемых файлов, поэтому вам нужно не забывать о созданных вами новых файлах и вручную выполнять для них команду git add.

  • advice.statusUoption=false (см. git-config[1]): если задать для этой переменной значение false, отключается предупреждение, выводимое в случаях, когда перечисление неотслеживаемых файлов занимает более 2 секунд. В большом проекте это может занимать больше времени, и пользователь, возможно, уже согласился на такой компромисс (например, использование -uno может быть неприемлемым вариантом). В таком случае выводить предупреждение бессмысленно, поэтому лучше его отключить.

  • core.untrackedCache=true (см. git-update-index[1]): включает кеш неотслеживаемых файлов и выполняет поиск только в каталогах, изменённых после предыдущей команды git status. Git запоминает набор неотслеживаемых файлов в каждом каталоге и предполагает, что если каталог не изменялся, то и набор неотслеживаемых файлов в нём остался прежним. Это гораздо быстрее, чем перечислять содержимое каждого каталога, но всё же требует затрат, поскольку Git всё ещё должен искать изменённые каталоги. Кеш неотслеживаемых файлов хранится в файле .git/index. Снижение затрат на поиск неотслеживаемых файлов несколько компенсируется увеличением размера индекса и затратами на его актуализацию. Обычно выигрыш во времени поиска оправдывает дополнительный размер.

  • core.untrackedCache=true и core.fsmonitor=true или core.fsmonitor=<hook-command-pathname> (см. git-update-index[1]): включают и кеш неотслеживаемых файлов, и функцию FSMonitor, а поиск выполняется только в каталогах, изменённых после предыдущей команды git status. Это быстрее, чем использовать только кеш неотслеживаемых файлов, поскольку Git может также избежать поиска изменённых каталогов. Git достаточно перечислить точный набор каталогов, которые недавно изменились. Функцию FSMonitor можно включить и без кеша неотслеживаемых файлов, но в этом случае её преимущества значительно меньше.

Обратите внимание: после включения кеша неотслеживаемых файлов и/или функции FSMonitor может потребоваться выполнить несколько команд git status, прежде чем различные кеши прогреются и вы заметите ускорение работы команд. Это нормально.

См. также

gitignore[5]

status

© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/git-status

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API