Setup and Config
Getting and Creating Projects
Basic Snapshotting
Branching and Merging
Sharing and Updating Projects
Inspection and Comparison
Patching
Debugging
External Systems
Server Admin
Guides
- gitattributes
- Command-line interface conventions
- Everyday Git
- Frequently Asked Questions (FAQ)
- Glossary
- Hooks
- gitignore
- gitmodules
- Revisions
- Submodules
- Tutorial
- Workflows
- All guides...
Administration
Plumbing Commands
- 2.53.0 → 2.54.0 no changes
-
2.52.0
2025-11-17
-
2.51.2
2025-10-27
- 2.45.4 → 2.51.1 no changes
-
2.45.3
2024-11-26
- 2.45.1 → 2.45.2 no changes
-
2.45.0
2024-04-29
- 2.44.1 → 2.44.4 no changes
-
2.44.0
2024-02-23
- 2.43.1 → 2.43.7 no changes
-
2.43.0
2023-11-20
- 2.42.1 → 2.42.4 no changes
-
2.42.0
2023-08-21
- 2.41.1 → 2.41.3 no changes
-
2.41.0
2023-06-01
- 2.39.4 → 2.40.4 no changes
-
2.39.3
2023-04-17
- 2.39.1 → 2.39.2 no changes
-
2.39.0
2022-12-12
- 2.37.3 → 2.38.5 no changes
-
2.37.2
2022-08-11
- 2.33.1 → 2.37.1 no changes
-
2.33.0
2021-08-16
- 2.31.1 → 2.32.7 no changes
-
2.31.0
2021-03-15
- 2.30.1 → 2.30.9 no changes
-
2.30.0
2020-12-27
- 2.29.1 → 2.29.3 no changes
-
2.29.0
2020-10-19
- 2.27.1 → 2.28.1 no changes
-
2.27.0
2020-06-01
- 2.25.1 → 2.26.3 no changes
-
2.25.0
2020-01-13
- 2.23.1 → 2.24.4 no changes
-
2.23.0
2019-08-16
- 2.22.1 → 2.22.5 no changes
-
2.22.0
2019-06-07
- 2.19.1 → 2.21.4 no changes
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 no changes
-
2.18.0
2018-06-21
- 2.17.0 → 2.17.6 no changes
-
2.16.6
2019-12-06
-
2.15.4
2019-12-06
- 2.14.6 no changes
-
2.13.7
2018-05-22
-
2.12.5
2017-09-22
-
2.11.4
2017-09-22
-
2.10.5
2017-09-22
-
2.9.5
2017-07-30
-
2.8.6
2017-07-30
- 2.6.7 → 2.7.6 no changes
-
2.5.6
2017-05-05
-
2.4.12
2017-05-05
- 2.3.10 no changes
-
2.2.3
2015-09-04
-
2.1.4
2014-12-17
-
2.0.5
2014-12-17
НАЗВАНИЕ
git-rev-parse — выделение и преобразование параметров
ОБЗОР
git rev-parse [<параметры>] <аргумент>…​
ОПИСАНИЕ
Многие команды Git (фарфороподобные) принимают смесь флагов (т.е. параметров, начинающихся с дефиса -) и параметров, предназначенных для нижележащей команды git rev-list, которую они используют внутренне, а также флагов и параметров для других команд, которые они используют после git rev-list. Основная цель этой команды — позволить вызывающим программам различать их. Существует несколько других режимов работы, не связанных с вышеупомянутой "помощью в анализе параметров командной строки".
Если не указано иное, большинство параметров и режимов работы требуют, чтобы вы запускали эту команду внутри репозитория git или рабочего каталога, находящегося под управлением репозитория git, и в противном случае выдадут критическую ошибку.
ПАРАМЕТРЫ
Режимы работы
Каждый из этих параметров должен появляться первым в командной строке.
- --parseopt
-
Использовать git rev-parse в режиме анализа параметров (см. раздел PARSEOPT ниже). Команда в этом режиме может использоваться вне репозитория или рабочего каталога, контролируемого репозиторием.
- --sq-quote
-
Использовать git rev-parse в режиме цитирования оболочки (см. раздел SQ-QUOTE ниже). В отличие от параметра
--sqниже, этот режим только добавляет кавычки. Больше ничего не делается с вводом команды. Команда в этом режиме может использоваться вне репозитория или рабочего каталога, контролируемого репозиторием.
Параметры для --parseopt
- --keep-dashdash
-
Имеет смысл только в режиме
--parseopt. Указывает анализатору параметров выводить первый встреченный--вместо его пропуска. - --stop-at-non-option
-
Имеет смысл только в режиме
--parseopt. Позволяет анализатору параметров останавливаться на первом аргументе, не являющемся параметром. Это можно использовать для анализа подкоманд, которые сами принимают параметры. - --stuck-long
-
Имеет смысл только в режиме
--parseopt. Выводить параметры в их длинной форме, если доступно, и с прикреплёнными аргументами.
Параметры для фильтрации
- --revs-only
-
Не выводить флаги и параметры, не предназначенные для команды git rev-list.
- --no-revs
-
Не выводить флаги и параметры, предназначенные для команды git rev-list.
- --flags
-
Не выводить параметры, не являющиеся флагами.
- --no-flags
-
Не выводить параметры-флаги.
Параметры для вывода
- --default <аргумент>
-
Если пользователь не указал параметр, использовать вместо него <аргумент>.
- --prefix <аргумент>
-
Вести себя так, как если бы git rev-parse был вызван из подкаталога <аргумент> рабочего каталога. Любые относительные имена файлов разрешаются так, как если бы к ним был добавлен префикс <аргумент>, и будут выведены в этой форме.
Это можно использовать для преобразования аргументов команды, запускаемой в подкаталоге, чтобы их можно было использовать после перемещения на верхний уровень репозитория. Например:
префикс=$(git rev-parse --show-prefix) cd "$(git rev-parse --show-toplevel)" # rev-parse предоставляет --, необходимый для 'set' eval "set $(git rev-parse --sq --prefix "$префикс" -- "$@")"
- --verify
-
Проверить, что предоставлен ровно один параметр и что он может быть преобразован в необработанный 20-байтовый SHA-1, который можно использовать для доступа к базе данных объектов. Если это так, вывести его в стандартный вывод; в противном случае завершиться ошибкой.
Если вы хотите убедиться, что вывод действительно именует объект в вашей базе данных объектов и/или может использоваться как определённый тип объекта, который вам требуется, вы можете добавить к параметру оператор снятия шелухи ^{тип}. Например,
gitrev-parse"$VAR^{commit}"гарантирует, что$VARименует существующий объект, являющийся указателем коммита (т.е. коммит или аннотированную метку, указывающую на коммит). Чтобы убедиться, что$VARименует существующий объект любого типа, можно использоватьgitrev-parse"$VAR^{object}".Обратите внимание, что если вы проверяете имя из недоверенного источника, разумно использовать
--end-of-options, чтобы аргумент имени не был принят за другой параметр. - -q
- --quiet
-
Имеет смысл только в режиме
--verify. Не выводить сообщение об ошибке, если первый аргумент не является допустимым именем объекта; вместо этого молча завершиться с ненулевым статусом. SHA-1 для допустимых имён объектов выводятся в stdout в случае успеха. - --sq
-
Обычно вывод состоит из одной строки на флаг и параметр. Этот параметр делает вывод одной строкой, правильно заключённой в кавычки для использования оболочкой. Полезно, когда вы ожидаете, что ваш параметр будет содержать пробелы и символы новой строки (например, при использовании pickaxe
-Sс git diff-*). В отличие от параметра--sq-quote, ввод команды по-прежнему интерпретируется как обычно. - --short[=<длина>]
-
То же, что и
--verify, но сокращает имя объекта до уникального префикса длиной не менее длина символов. Минимальная длина — 4, значение по умолчанию — эффективное значение переменной конфигурацииcore.abbrev(см. git-config[1]). - --not
-
При показе имён объектов добавлять к ним префикс ^ и удалять префикс ^ из имён объектов, которые уже имеют его.
- --abbrev-ref[=(strict|loose)]
-
Неоднозначное короткое имя объекта. Параметр core.warnAmbiguousRefs используется для выбора строгого режима сокращения.
- --symbolic
-
Обычно имена объектов выводятся в форме SHA-1 (с возможным префиксом ^); этот параметр заставляет выводить их в форме, максимально близкой к исходному вводу.
- --symbolic-full-name
-
Это похоже на --symbolic, но опускает ввод, который не является ссылками (т.е. имена веток или меток; или более явно устраняющая неоднозначность форма "heads/master", когда вы хотите назвать ветку "master", когда существует неудачно названная метка "master"), и показывает их как полные имена ссылок (например, "refs/heads/master").
- --output-object-format=(sha1|sha256|storage)
-
Разрешить ввод oid из любого формата объектов, который поддерживает текущий репозиторий.
Указание «sha1» переводит при необходимости и возвращает oid sha1.
Указание «sha256» переводит при необходимости и возвращает oid sha256.
Указание «storage» переводит при необходимости и возвращает oid, закодированный в алгоритме хеша хранения.
Параметры для объектов
- --all
-
Показать все ссылки, найденные в
refs/. - --branches[=<шаблон>]
- --tags[=<шаблон>]
- --remotes[=<шаблон>]
-
Показать все ветки, метки или отслеживаемые внешние ветки соответственно (т.е. ссылки, найденные в
refs/heads,refs/tagsилиrefs/remotesсоответственно).Если указан шаблон, показываются только ссылки, соответствующие данному glob-шаблону оболочки. Если шаблон не содержит символа подстановки (?,
*или [), он превращается в сопоставление префикса путём добавления/*. - --glob=<шаблон>
-
Показать все ссылки, соответствующие glob-шаблону оболочки шаблон. Если шаблон не начинается с
refs/, это добавляется автоматически. Если шаблон не содержит символа подстановки (?,*или [), он превращается в сопоставление префикса путём добавления/*. - --exclude=<glob-шаблон>
-
Не включать ссылки, соответствующие <шаблон-glob>, которые в противном случае учитывались бы следующим параметром
--all,--branches,--tags,--remotesили--glob. Повторения этого параметра накапливают шаблоны исключения до следующего параметра--all,--branches,--tags,--remotesили--glob(другие параметры или аргументы не очищают накопленные шаблоны).Заданные шаблоны не должны начинаться с
refs/heads,refs/tagsилиrefs/remotesпри применении к--branches,--tagsили--remotesсоответственно, и они должны начинаться сrefs/при применении к--globили--all. Если подразумевается завершающий /*, он должен быть указан явно. -
Не включать ссылки, которые были бы скрыты
git-fetch,git-receive-packилиgit-upload-packпутём обращения к соответствующей конфигурацииfetch.hideRefs,receive.hideRefsилиuploadpack.hideRefsвместе сtransfer.hideRefs(см. git-config[1]). Этот параметр влияет на следующий параметр псевдоссылки--allили--globи очищается после их обработки. - --disambiguate=<prefix>
-
Показать каждый объект, имя которого начинается с указанного префикса. <префикс> должен иметь длину не менее 4 шестнадцатеричных цифр, чтобы случайно не перечислить каждый объект в репозитории.
Параметры для файлов
- --local-env-vars
-
Перечислить переменные среды GIT_*, которые являются локальными для репозитория (например, GIT_DIR или GIT_WORK_TREE, но не GIT_EDITOR). Перечисляются только имена переменных, а не их значения, даже если они установлены.
- --path-format=(absolute|relative)
-
Управляет поведением некоторых других параметров. Если указано как absolute, пути, выводимые этими параметрами, будут абсолютными и каноническими. Если указано как relative, пути будут относительными относительно текущего рабочего каталога, если это возможно. Значение по умолчанию зависит от параметра.
Этот параметр может быть указан несколько раз и влияет только на аргументы, которые следуют за ним в командной строке, либо до конца командной строки, либо до следующего экземпляра этого параметра.
Следующие параметры изменяются с помощью --path-format:
- --git-dir
-
Показать
$GIT_DIR, если определён. В противном случае показать путь к каталогу .git. Показанный путь, если он относительный, является относительным относительно текущего рабочего каталога.Если
$GIT_DIRне определён и текущий каталог не обнаружен в репозитории Git или рабочем каталоге, вывести сообщение в stderr и завершиться с ненулевым статусом. - --git-common-dir
-
Показать
$GIT_COMMON_DIR, если определён, иначе$GIT_DIR. - --resolve-git-dir <путь>
-
Проверить, является ли <путь> допустимым репозиторием или git-файлом, указывающим на допустимый репозиторий, и вывести местоположение репозитория. Если <путь> является git-файлом, выводится разрешённый путь к реальному репозиторию.
- --git-path <путь>
-
Разрешает "$GIT_DIR/<путь>" и учитывает другие переменные перемещения путей, такие как $GIT_OBJECT_DIRECTORY, $GIT_INDEX_FILE…​ Например, если $GIT_OBJECT_DIRECTORY установлен в /foo/bar, то "git rev-parse --git-path objects/abc" вернёт /foo/bar/abc.
- --show-toplevel
-
Показать (по умолчанию абсолютный) путь к верхнему каталогу рабочего каталога. Если рабочего каталога нет, сообщить об ошибке.
- --show-superproject-working-tree
-
Показать абсолютный путь к корню рабочего каталога суперпроекта (если существует), который использует текущий репозиторий в качестве своего подмодуля. Не выводит ничего, если текущий репозиторий не используется в качестве подмодуля ни одним проектом.
-
Показать путь к общему файлу индекса в режиме разделённого индекса или пустую строку, если не в режиме разделённого индекса.
На следующие параметры --path-format не влияет:
- --absolute-git-dir
-
Как
--git-dir, но его вывод всегда является канонизированным абсолютным путем. - --is-inside-git-dir
-
Если текущий рабочий каталог находится ниже каталога репозитория, вывести "true", в противном случае "false".
- --is-inside-work-tree
-
Если текущий рабочий каталог находится внутри рабочего каталога репозитория, вывести "true", в противном случае "false".
- --is-bare-repository
-
Если репозиторий голый, вывести «true», в противном случае «false».
- --is-shallow-repository
-
Если репозиторий частичный, вывести «true», в противном случае «false».
- --show-cdup
-
Когда команда вызывается из подкаталога, показать путь к верхнему каталогу относительно текущего каталога (обычно последовательность "../" или пустая строка).
- --show-prefix
-
Когда команда вызывается из подкаталога, показать путь текущего каталога относительно верхнего каталога.
- --show-object-format[=(storage|input|output|compat)]
-
Показать формат объекта (алгоритм хеша), используемый для репозитория для хранения внутри каталога
.git, ввода, вывода или совместимости. Для ввода может быть выведено несколько алгоритмов, разделённых пробелами. Если запрошенcompatи не включён ни один алгоритм совместимости, выводится пустая строка. Если не указано, по умолчанию используется «storage». - --show-ref-format
-
Показать формат хранения ссылок, используемый во внешнем репозитории.
Другие параметры
- --since=<строка-даты>
- --after=<строка-даты>
-
Проанализировать строку даты и вывести соответствующий параметр --max-age= для git rev-list.
- --until=<строка-даты>
- --before=<строка-даты>
-
Проанализировать строку даты и вывести соответствующий параметр --min-age= для git rev-list.
- <аргумент>…​
-
Флаги и параметры для анализа.
УКАЗАНИЕ РЕДАКЦИЙ
Параметр редакции <ред> обычно (но не обязательно) указывает на объект-коммит. Он использует так называемый синтаксис расширенного SHA-1. Вот различные способы указания имён объектов. Те, которые перечислены ближе к концу этого списка, указывают на деревья и blob-объекты, содержащиеся в коммите.
|
Note
|
В этом документе показан «сырой» синтаксис, каким его видит git. Оболочка и другие пользовательские интерфейсы могут потребовать дополнительного заключения в кавычки для защиты специальных символов и предотвращения разделения слов. |
- <sha1>, например dae86e1950b1277e545cee180551750029cfe735, dae86e
-
Полное имя объекта SHA-1 (40-байтовая шестнадцатеричная строка) или ведущая подстрока, уникальная в пределах репозитория. Например, dae86e1950b1277e545cee180551750029cfe735 и dae86e оба указывают на один и тот же объект-коммит, если в вашем репозитории нет другого объекта, чьё имя начинается с dae86e.
- <describeOutput>, например v1.7.4.2-679-g3bee7fb
-
Вывод
gitdescribe; т.е. ближайшая метка, за которой могут следовать дефис, количество коммитов, затем дефис, g и сокращённое имя объекта. - <имя-ссылки>, например master, heads/master, refs/heads/master
-
Символическое имя ссылки. Например, master обычно означает объект-коммит, на который ссылается refs/heads/master. Если у вас есть и heads/master, и tags/master, вы можете явно указать heads/master, чтобы сообщить Git, какую вы имеете в виду. В случае неоднозначности <имя-ссылки> однозначно идентифицируется путём поиска первого совпадения по следующим правилам:
-
Если существует $GIT_DIR/<имя-ссылки>, то это то, что вы имеете в виду (обычно это полезно только для
HEAD,FETCH_HEAD,ORIG_HEAD,MERGE_HEAD,REBASE_HEAD,REVERT_HEAD,CHERRY_PICK_HEAD,BISECT_HEADиAUTO_MERGE); -
в противном случае, refs/<имя-ссылки>, если существует;
-
в противном случае, refs/tags/<имя-ссылки>, если существует;
-
в противном случае, refs/heads/<имя-ссылки>, если существует;
-
в противном случае, refs/remotes/<имя-ссылки>, если существует;
-
в противном случае, refs/remotes/<имя-ссылки>/HEAD, если существует.
-
HEAD -
указывает на коммит, на основе которого вы внесли изменения в рабочем каталоге.
-
FETCH_HEAD -
записывает ветку, которую вы получили (fetch) из внешнего репозитория вашим последним вызовом
gitfetch. -
ORIG_HEAD -
создаётся командами, которые радикально перемещают ваш
HEAD(gitam,gitmerge,gitrebase,gitreset), чтобы записать положениеHEADдо их выполнения, чтобы вы могли легко вернуть верхушку ветки в состояние, предшествующее их выполнению. -
MERGE_HEAD -
записывает коммит(ы), которые вы сливаете в свою ветку, когда вы выполняете
gitmerge. -
REBASE_HEAD -
во время перемещения (rebase) записывает коммит, на котором операция в данный момент остановлена, либо из-за конфликтов, либо из-за команды
editв интерактивном перемещении. -
REVERT_HEAD -
записывает коммит, который вы отменяете (revert) при выполнении
gitrevert. -
CHERRY_PICK_HEAD -
записывает коммит, который вы копируете (cherry-pick) при выполнении
gitcherry-pick. -
BISECT_HEAD -
записывает текущий коммит для тестирования, когда вы выполняете
gitbisect--no-checkout. -
AUTO_MERGE -
записывает объект-дерево, соответствующий состоянию, которое стратегия слияния ort записала в рабочий каталог, когда операция слияния привела к конфликтам.
-
Обратите внимание, что любой из вышеперечисленных случаев refs/* может поступать либо из каталога
$GIT_DIR/refs, либо из файла$GIT_DIR/packed-refs. Хотя кодировка имени ссылки не указана, предпочтительнее UTF-8, так как некоторая обработка вывода может предполагать имена ссылок в UTF-8. -
- @
-
@ само по себе является сокращением для
HEAD. - [<имя-ссылки>]@{<дата>}, например master@{yesterday}, HEAD@{5 minutes ago}
-
Ссылка, за которой следует суффикс @ со спецификацией даты, заключённой в фигурные скобки (например, {yesterday}, {1 month 2 weeks 3 days 1 hour 1 second ago} или {1979-02-26 18:30:00}), указывает значение ссылки в предыдущий момент времени. Этот суффикс может использоваться только непосредственно после имени ссылки, и для ссылки должен существовать журнал ($GIT_DIR/logs/<ссылка>). Обратите внимание, что это ищет состояние вашей локальной ссылки в заданное время; например, что было в вашей локальной ветке master на прошлой неделе. Если вы хотите просмотреть коммиты, сделанные в определённое время, см.
--sinceи--until. - <имя-ссылки>@{<n>}, например master@{1}
-
Ссылка, за которой следует суффикс @ с порядковой спецификацией, заключённой в фигурные скобки (например, {1}, {15}), указывает n-е предыдущее значение этой ссылки. Например, master@{1} — это непосредственно предыдущее значение master, а master@{5} — это 5-е предыдущее значение master. Этот суффикс может использоваться только непосредственно после имени ссылки, и для ссылки должен существовать журнал ($GIT_DIR/logs/<имя-ссылки>).
- @{<n>}, например @{1}
-
Вы можете использовать конструкцию @ с пустой частью ссылки, чтобы получить запись журнала ссылок (reflog) текущей ветки. Например, если вы находитесь в ветке blabla, то @{1} означает то же, что и blabla@{1}.
- @{-<n>}, например @{-1}
-
Конструкция @{-<n>} означает <n>-ю ветку/коммит, переключенные перед текущим.
- [<имя-ветки>]@{upstream}, например master@{upstream}, @{u}
-
Ветка B может быть настроена для построения поверх ветки X (настраивается с помощью
branch.<имя>.merge) во внешнем репозитории R (настраивается с помощьюbranch.<имя>.remote). B@{u} ссылается на отслеживаемую внешнюю ветку для ветки X, взятую из внешнего репозитория R, обычно находящуюся вrefs/remotes/R/X. - [<имя-ветки>]@{push}, например master@{push}, @{push}
-
Суффикс @{push} сообщает ветку «куда мы бы отправили», если бы
gitpushбыл выполнен, когда имя-ветки была переключена (или текущийHEAD, если имя ветки не указано). Как и для @{upstream}, мы сообщаем отслеживаемую внешнюю ветку, которая соответствует этой ветке во внешнем репозитории.Вот пример, чтобы прояснить:
$ git config push.default current $ git config remote.pushdefault myfork $ git switch -c mybranch origin/master $ git rev-parse --symbolic-full-name @{upstream} refs/remotes/origin/master $ git rev-parse --symbolic-full-name @{push} refs/remotes/myfork/mybranchОбратите внимание в примере, что мы настроили треугольный рабочий процесс, в котором мы извлекаем (pull) из одного места и отправляем в другое. В нетреугольном рабочем процессе @{push} совпадает с @{upstream}, и нет необходимости в нём.
Этот суффикс также принимается, если написан в верхнем регистре, и означает то же самое независимо от регистра.
- <ред>^[<n>], напр., HEAD^, v1.5.1^0
-
Суффикс ^ у параметра редакции означает первого родителя этого объекта-коммита. ^<n> означает <n>-го родителя (т.е. <ред>^ эквивалентно <ред>^1). По особому правилу <ред>^0 означает сам коммит и используется, когда <ред> является именем объекта-метки, которая ссылается на объект-коммит.
- <ред>~[<n>], например HEAD~, master~3
-
Суффикс ~ у параметра редакции означает первого родителя этого объекта-коммита. Суффикс ~<n> у параметра редакции означает объект-коммит, который является предком <n>-го поколения указанного объекта-коммита, следуя только первым родителям. Т.е. <ред>~3 эквивалентно <ред>^^^, что эквивалентно <ред>^1^1^1. Ниже приведена иллюстрация использования этой формы.
- <ред>^{<тип>}, например v0.99.8^{commit}
-
Суффикс ^, за которым следует имя типа объекта, заключённое в фигурные скобки, означает рекурсивное разыменование объекта по адресу <ред> до тех пор, пока не будет найден объект типа <тип> или объект больше не может быть разыменован (в этом случае происходит ошибка). Например, если <ред> является указателем коммита (commit-ish), <ред>^{commit} описывает соответствующий объект-коммит. Аналогично, если <ред> является указателем дерева (tree-ish), <ред>^{tree} описывает соответствующий объект-дерево. <ред>^0 является сокращением для <ред>^{commit}.
<ред>^{object} можно использовать, чтобы убедиться, что <ред> указывает на существующий объект, не требуя, чтобы <ред> был меткой, и без разыменования <ред>; поскольку метка уже является объектом, её не нужно разыменовывать даже один раз, чтобы добраться до объекта.
<ред>^{tag} можно использовать, чтобы гарантировать, что <ред> идентифицирует существующий объект-метку.
- <ред>^{}, например v0.99.8^{}
-
Суффикс ^, за которым следует пустая пара фигурных скобок, означает, что объектом может быть метка, и рекурсивно разыменовывать метку до тех пор, пока не будет найден объект, не являющийся меткой.
- <ред>^{/<текст>}, например HEAD^{/fix nasty bug}
-
Суффикс ^ у параметра редакции, за которым следует пара фигурных скобок, содержащих текст, начинающийся с косой черты, аналогичен синтаксису :/fix nasty bug ниже, за исключением того, что он возвращает самый молодой соответствующий коммит, который достижим из <ред> перед ^.
- :/<текст>, например :/fix nasty bug
-
Двоеточие, за которым следует косая черта, а затем текст, указывает коммит, сообщение которого соответствует указанному регулярному выражению. Это имя возвращает самый молодой соответствующий коммит, который достижим из любой ссылки, включая HEAD. Регулярное выражение может соответствовать любой части сообщения коммита. Чтобы сопоставить сообщения, начинающиеся со строки, можно использовать, например, :/^foo. Специальная последовательность :/! зарезервирована для модификаторов сопоставления. :/!-foo выполняет отрицательное сопоставление, а :/!!foo сопоставляет буквальный символ !, за которым следует foo. Любая другая последовательность, начинающаяся с :/!, пока зарезервирована. В зависимости от заданного текста правила разделения слов оболочки могут потребовать дополнительного заключения в кавычки.
- <ред>:<путь>, напр., HEAD:README, master:./README
-
Суффикс :, за которым следует путь, указывает на blob-объект или дерево по заданному пути в объекте-указателе-дерева, названном частью перед двоеточием. Путь, начинающийся с ./ или ../, является относительным к текущему рабочему каталогу. Заданный путь будет преобразован в относительный относительно корневого каталога рабочего каталога. Это наиболее полезно для обращения к blob-объекту или дереву из коммита или дерева, которое имеет ту же структуру дерева, что и рабочий каталог.
- :[<n>:]<путь>, например :0:README, :README
-
Двоеточие, за которым может следовать номер этапа (от 0 до 3) и двоеточие, а затем путь, указывает на blob-объект в индексе по заданному пути. Отсутствующий номер этапа (и следующее за ним двоеточие) указывает на запись этапа 0. Во время слияния этап 1 — это общий предок, этап 2 — версия целевой ветки (обычно текущей ветки), а этап 3 — версия из ветки, с которой выполняется слияние.
Вот иллюстрация от Джона Лёлигера. Оба узла коммитов B и C являются родителями узла коммита A. Родительские коммиты упорядочены слева направо.
G H I J
\ / \ /
D E F
\ | / \
\ | / |
\|/ |
B C
\ /
\ /
A
A = = A^0 B = A^ = A^1 = A~1 C = = A^2 D = A^^ = A^1^1 = A~2 E = B^2 = A^^2 F = B^3 = A^^3 G = A^^^ = A^1^1^1 = A~3 H = D^2 = B^^2 = A^^^2 = A~2^2 I = F^ = B^3^ = A^^3^ J = F^2 = B^3^2 = A^^3^2
УКАЗАНИЕ ДИАПАЗОНОВ
Команды обхода истории, такие как git log, работают с набором коммитов, а не только с одним коммитом.
Для этих команд указание одной редакции с использованием обозначений, описанных в предыдущем разделе, означает набор коммитов, достижимых из указанного коммита.
Указание нескольких редакций означает набор коммитов, достижимых из любого из указанных коммитов.
Достижимое множество коммита — это сам коммит и коммиты в его цепочке предков.
Существует несколько обозначений для указания набора связанных коммитов (называемого «диапазоном редакций»), проиллюстрированных ниже.
Исключения коммитов
- Обозначение ^<ред> (циркумфлекс)
-
Для исключения коммитов, достижимых из коммита, используется префикс ^. Например, ^r1 r2 означает коммиты, достижимые из r2, но исключает коммиты, достижимые из r1 (т.е. r1 и его предков).
Обозначения диапазонов с точками
- Обозначение диапазона .. (две точки)
-
Операция над множествами ^r1 r2 встречается так часто, что для неё существует сокращение. Когда у вас есть два коммита r1 и r2 (названных в соответствии с синтаксисом, объяснённым в разделе УКАЗАНИЕ РЕВИЗИЙ выше), вы можете запросить коммиты, достижимые из r2, исключая те, которые достижимы из r1, с помощью ^r1 r2, и это может быть записано как r1..r2.
- Обозначение симметрической разности ... (три точки)
-
Похожее обозначение r1...r2 называется симметрической разностью r1 и r2 и определяется как r1 r2 --not $(git merge-base --all r1 r2). Это набор коммитов, которые достижимы либо из r1 (левая сторона), либо из r2 (правая сторона), но не из обоих.
В этих двух сокращённых обозначениях вы можете опустить один конец, и он будет по умолчанию равен HEAD. Например, origin.. является сокращением для origin..HEAD и спрашивает: «Что я сделал с тех пор, как ответвился от ветки origin?» Аналогично, ..origin является сокращением для HEAD..origin и спрашивает: «Что сделал origin с тех пор, как я от него ответвился?» Обратите внимание, что .. будет означать HEAD..HEAD, что является пустым диапазоном, который одновременно и достижим, и недостижим из HEAD.
Существуют команды, специально предназначенные для приёма двух различных диапазонов (например, «git range-diff R1 R2» для сравнения двух диапазонов), но они являются исключениями. Если не указано иное, все команды «git», которые работают с набором коммитов, работают с одним диапазоном редакций. Другими словами, запись двух обозначений «диапазона из двух точек» рядом друг с другом, например.
$ git log A..B C..D
для большинства команд не указывает два диапазона редакций. Вместо этого она будет указывать один связный набор коммитов, т.е. те, которые достижимы либо из B, либо из D, но не достижимы ни из A, ни из C. В линейной истории, подобной этой:
---A---B---o---o---C---D
поскольку A и B достижимы из C, диапазон редакций, указанный этими двумя диапазонами с точками, представляет собой единственный коммит D.
Другие сокращённые обозначения родителей <ред>^
Существуют три других сокращения, особенно полезных для коммитов слияния, для обозначения набора, образованного коммитом и его родительскими коммитами.
Обозначение r1^@ означает всех родителей r1.
Обозначение r1^! включает коммит r1, но исключает всех его родителей. Само по себе это обозначение обозначает единственный коммит r1.
Обозначение <ред>^-[<n>] включает <ред>, но исключает <n>-го родителя (т.е. сокращение для <ред>^<n>..<ред>), причём <n> = 1, если не указано. Обычно это полезно для коммитов слияния, где вы можете просто передать <коммит>^-, чтобы получить все коммиты в ветке, которая была слита в коммите слияния <коммит> (включая сам <коммит>).
В то время как <rev>^<n> касался указания одного родителя коммита, эти три обозначения также учитывают его родителей. Например, вы можете сказать HEAD^2^@, но не можете сказать HEAD^@^2.
Сводка по диапазонам редакций
- <rev>
-
Включить коммиты, достижимые из <ред> (т.е. <ред> и его предков).
- ^<rev>
-
Исключить коммиты, достижимые из <ред> (т.е. <ред> и его предков).
- <rev1>..<rev2>
-
Включить коммиты, достижимые из <ред2>, но исключить те, которые достижимы из <ред1>. Если <ред1> или <ред2> опущены, по умолчанию используется
HEAD. - <rev1>...<rev2>
-
Включить коммиты, достижимые из <ред1> или <ред2>, но исключить те, которые достижимы из обоих. Если <ред1> или <ред2> опущены, по умолчанию используется
HEAD. - <ред>^@, например HEAD^@
-
Суффикс ^, за которым следует символ @, означает то же, что и перечисление всех родителей <ред> (т.е. включить всё, что достижимо из его родителей, но не сам коммит).
- <ред>^!, например HEAD^!
-
Суффикс ^, за которым следует восклицательный знак, означает то же, что и указание коммита <ред> и всех его родителей с префиксом ^, чтобы исключить их (и их предков).
- <ред>^-<n>, например HEAD^-, HEAD^-2
-
Эквивалентно <ред>^<n>..<ред>, причём <n> = 1, если не указано.
Вот несколько примеров с использованием иллюстрации Лёлигера выше, где каждый шаг развёртывания и выбора обозначения тщательно расписан:
Аргументы Развёрнутые аргументы Выбранные коммиты D G H D D F G H I J D F ^G D H D ^D B E I J F B ^D B C E I J F B C C I J F C B..C = ^B C C B...C = B ^F C G H D E B C B^- = B^..B = ^B^1 B E I J F B C^@ = C^1 = F I J F B^@ = B^1 B^2 B^3 = D E F D G H E F I J C^! = C ^C^@ = C ^C^1 = C ^F C B^! = B ^B^@ = B ^B^1 ^B^2 ^B^3 = B ^D ^E ^F B F^! D = F ^I ^J D G H D F
PARSEOPT
В режиме --parseopt git rev-parse помогает преобразовывать параметры, предоставляя сценариям оболочки те же возможности, что и встроенные функции C. Он работает как нормализатор параметров (например, разделяет одиночные переключатели, агрегирует значения), немного похоже на getopt(1).
Он принимает из стандартного ввода спецификацию параметров для анализа и понимания и выводит в стандартный вывод строку, подходящую для eval sh(1), чтобы заменить аргументы нормализованными. В случае ошибки он выводит использование в стандартный поток ошибок и завершается с кодом 129.
Примечание: Убедитесь, что вы заключаете результат в кавычки при передаче его в eval. Пример см. ниже.
Формат ввода
Формат ввода git rev-parse --parseopt полностью основан на тексте. Он имеет две части, разделённые строкой, содержащей только --. Строки перед разделителем (должна быть одна или несколько) используются для описания использования. Строки после разделителя описывают параметры.
Каждая строка параметров имеет следующий формат:
<спецификация-параметра><флаги>*<подсказка-аргумента>? SP+ справка LF
- <opt-spec>
-
её формат: символ короткого параметра, затем длинное имя параметра, разделённые запятой. Обе части не обязательны, хотя необходима хотя бы одна. Не может содержать ни одного из символов <флаги>.
h,help,dry-runиfявляются примерами правильной <спецификация-параметра>. - <flags>
-
<флаги> могут быть
*,=, ? или!.-
Используйте
=, если параметр принимает аргумент. -
Используйте ?, чтобы указать, что параметр принимает необязательный аргумент. Вероятно, вы захотите использовать режим
--stuck-long, чтобы иметь возможность однозначно анализировать необязательный аргумент. -
Используйте
*, чтобы указать, что этот параметр не должен перечисляться в использовании, генерируемом для аргумента-h. Он показывается для--help-all, как описано в gitcli[7]. -
Используйте
!, чтобы не делать доступным соответствующий отрицающий длинный параметр.
-
- <arg-hint>
-
<подсказка-аргумента>, если указана, используется как имя аргумента в выводе справки для параметров, принимающих аргументы. <подсказка-аргумента> завершается первым пробелом. Принято использовать дефис для разделения слов в многословной подсказке аргумента.
Остаток строки после удаления пробелов используется как справка, связанная с параметром.
Пустые строки игнорируются, а строки, не соответствующие этой спецификации, используются как заголовки групп параметров (начинайте строку с пробела, чтобы намеренно создать такие строки).
Пример
СПЕЦИФИКАЦИЯ_ПАРАМЕТРОВ="\ некоторая-команда [<параметры>] <аргументы>... некоторая-команда делает foo и bar! -- h,help! показать справку foo какой-то отличный параметр --foo bar= какой-то классный параметр --bar с аргументом baz=arg другой классный параметр --baz с именованным аргументом qux?path qux может принимать аргумент пути, но имеет значение сам по себе Заголовок группы параметров C? параметр C с необязательным аргументом" eval "$(echo "$СПЕЦИФИКАЦИЯ_ПАРАМЕТРОВ" | git rev-parse --parseopt -- "$@" || echo exit $?)"
Текст использования
Когда "$@" в приведённом выше примере равно -h или --help, будет показан следующий текст использования:
использование: некоторая-команда [<параметры>] <аргументы>...
некоторая-команда делает foo и bar!
-h, --help показать справку
--[no-]foo какой-то отличный параметр --foo
--[no-]bar ... какой-то классный параметр --bar с аргументом
--[no-]baz <arg> другой классный параметр --baz с именованным аргументом
--[no-]qux[=<путь>] qux может принимать аргумент пути, но имеет значение сам по себе
Заголовок группы параметров
-C[...] параметр C с необязательным аргументом
SQ-QUOTE
В режиме --sq-quote git rev-parse выводит в стандартный вывод одну строку, подходящую для eval sh(1). Эта строка создаётся путём нормализации аргументов, следующих за --sq-quote. Ничего, кроме добавления кавычек к аргументам, не делается.
Если вы хотите, чтобы ввод команды по-прежнему интерпретировался как обычно git rev-parse перед тем, как вывод будет заключён в кавычки оболочкой, см. параметр --sq.
Пример
$ cat >ваш-git-сценарий.sh <<\EOF #!/bin/sh args=$(git rev-parse --sq-quote "$@") # заключить в кавычки предоставленные пользователем аргументы command="git frotz -n24 $args" # и использовать его внутри # сконструированной командной строки eval "$command" EOF $ sh ваш-git-сценарий.sh "a b'c"
ПРИМЕРЫ
-
Вывести имя объекта текущего коммита:
$ git rev-parse --verify HEAD
-
Вывести имя объекта коммита из редакции в переменной оболочки $REV:
$ git rev-parse --verify --end-of-options $REV^{commit}Это завершится ошибкой, если $REV пуст или не является допустимой редакцией.
-
Аналогично вышеизложенному:
$ git rev-parse --default master --verify --end-of-options $REV
но если $REV пуст, будет выведено имя объекта коммита из master.
GIT
Является частью пакета git[1]