Что такое выражение ревизии Git?

Итак, я использую Git GUI для создания репозитория. Но я не могу найти никаких следов в Google, документации или где-либо еще, что такое "выражение ревизии", и требуется создать новую ветку.

кроме того, кажется, что это используется во многих других местах в программе, поэтому я считаю, что это важно знать.

Я нашел вопрос на этом на StackOverflow, но парень так и не получил ответа.

Мне просто нужно знать: что такое ревизия Выражение?

4 ответов


git должен иметь возможность идентифицировать фиксацию во время ряда общих операций

существует несколько способов идентификации фиксации. Вы можете использовать ветку, тег, фиксацию sha1 или выражения. Например:

git log HEAD

HEAD в конечном итоге решает определенную фиксацию, и вам будет предоставлен журнал для этого. Вы также можете сказать:

git log master

master является ветвью, и это также разрешится для конкретного совершать.

git log fd72e9c99312

теперь это фактическая фиксация.


приведенная ниже документация-это то, что вы ищете. Взято из git-rev-parse командная документация на http://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html.

УКАЗАНИЕ ИЗМЕНЕНИЙ

параметр ревизии обычно, но не обязательно, называет объект фиксации. Они используют так называемый расширенный синтаксис SHA1. Вот различные способы написания имен объектов. В конце этого списка перечислены деревья и капли, содержащиеся в фиксации.

полное имя объекта SHA1 (40-байтовая шестнадцатеричная строка) или подстрока такого, который является уникальным в репозитории. Например. dae86e1950b1277e545cee180551750029cfe735 и dae86e называют один и тот же объект фиксации, если в вашем репозитории нет другого объекта, имя которого начинается с dae86e.

вывод из git-describe; т. е. ближайший тег, при необходимости за ним следует тире и ряд коммитов, а затем тире, g и сокращенное имя объекта.

символическое имя ref. Например. master обычно означает объект фиксации, на который ссылается $GIT_DIR/refs/heads / master. Если у вас есть heads/master и tags/master, вы можете явно сказать heads/master, чтобы сказать git, какой из них вы имеете в виду. Когда неоднозначно, a устраняется, принимая первое совпадение в следующих правилах:

если существует $использование переменной git_dir/, то есть что вы имеете в виду (обычно это полезно только для HEAD, FETCH_HEAD, ORIG_HEAD и MERGE_HEAD);

в противном случае $GIT_DIR / refs / if существует;

в противном случае $GIT_DIR / refs / tags / if существует;

в противном случае $GIT_DIR / refs / heads / if существует;

в противном случае $GIT_DIR / refs / remotes / if существует;

в противном случае $GIT_DIR/refs/remotes//HEAD если существует.

имена заголовков фиксация изменений в рабочем дереве основана на. FETCH_HEAD записывает ветку, которую вы извлекли из удаленного репозитория с последним вызовом git-fetch. ORIG_HEAD создается командами, которые радикально перемещают вашу голову, чтобы записать положение головы перед их работой, чтобы вы могли изменить кончик ветви обратно в состояние, прежде чем вы их легко запустили. MERGE_HEAD записывает коммиты, которые вы объединяете в свою ветку при запуске git-merge.

ссылка, за которой следует суффикс @ со спецификацией даты, заключенной в пара скобок (например, {вчера}, {1 месяц 2 недели 3 дня 1 час 1 секунда назад} или {1979-02-26 18:30: 00}), чтобы указать значение ref в предыдущий момент времени. Этот суффикс может использоваться только сразу после имени ссылки, и ссылка должна иметь существующий журнал ($GIT_DIR/logs/). Обратите внимание, что это просматривает состояние вашего локального ref в данный момент времени; например, что было в вашей локальной главной ветви на прошлой неделе. Если вы хотите посмотреть на коммиты, сделанные в определенное время, видеть, --так и --до.

ссылка, за которой следует суффикс @ с порядковой спецификацией, заключенной в пару скобок (например, {1}, {15}), чтобы указать n-е Предыдущее значение этой ссылки. Например, master@{1} является непосредственным значением master, а master@{5} - 5-м значением master. Этот суффикс может использоваться только сразу после имени ссылки, и ссылка должна иметь существующий журнал ($GIT_DIR/logs/).

вы можете использовать @ Construct с пустой Реф частью, чтобы получить в reflog из в текущей ветке. Например, если вы находитесь на ветке blabla, то @{1} означает то же, что и blabla@{1}.

специальная конструкция @ { - } означает, что ветвь Th проверена до текущей.

суффикс ^ к параметру ревизии означает первого родителя этого объекта фиксации. ^ означает Th родителя (т. е. rev^ эквивалентно rev^1). Как специальное правило, rev^0 означает фиксацию и используется, когда rev-это имя объекта объекта тега, который ссылается на фиксацию объект.

суффикс ~ к параметру ревизии означает объект commit, который является прародителем Th поколения именованного объекта commit, следующего только за первым родителем. Т. е. rev~3 эквивалентно rev^^^, что эквивалентно rev^1^1^1. Ниже приведена иллюстрация использования этой формы.

суффикс ^, за которым следует имя типа объекта, заключенное в пару скобок (например, v0.99.8^{commit}) означает, что объект может быть тегом, а разыменование тега рекурсивно до объект этого типа или объекта не может быть разыменован (в этом случае, рвота). Рэв^0 познакомил представляет собой для Об^{совершить}.

суффикс ^, за которым следует пустая пара скобок (например, v0.99.8^ {}) означает, что объект может быть тегом, и разыменование тега рекурсивно, пока не будет найден объект без тега.

двоеточие, за которым следует косая черта, за которой следует текст: это имя фиксации, сообщение фиксации которой начинается с указанного текста. Это имя возвращает самая молодая соответствующая фиксация, которая доступна из любого ref. Если сообщение фиксации начинается с a !, вы должны повторить это; специальная последовательность :/! а потом еще что-то ! пока зарезервировано.

суффикс: за ним следует путь; это имена blob или дерева на заданном пути в объекте дерева, названном частью перед двоеточием.

двоеточие, необязательно с последующим номером этапа (от 0 до 3) и двоеточием, за которым следует путь; это имя объекта blob в индекс по заданному пути. Отсутствующий номер этапа (и двоеточие, которое следует за ним) называет запись этапа 0. Во время слияния Этап 1 является общим предком, Этап 2-версией целевой ветви (обычно текущей ветви), а Этап 3-версией из объединяемой ветви.

вот иллюстрация, Джон Loeliger. Оба узла фиксации 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  = 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

gahooa дает исчерпывающий ответ. Общий случай:

  • название существующей ветви (например,master)
  • первые несколько цифр контрольной суммы SHA1, лучше всего захваченной из gitk или git log

Добро пожаловать в удивительный мир git. TMI является par для курса...


другой случай, при использовании Emacs: просто введите Ctrl-x v l перечислить все ревизии. Для новичка в git (но не в Emacs/CVS) я был удивлен, увидев, что изменения перечислены как:

commit 8d5ab12cd76d5e6098e5894c8713ec605fd9f153

Это определенно освежающее изменение от Major.minor.bugfix.build нотации.

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

Так суммируйте, когда Emacs запрашивает ревизию, просто введите это 40 шестнадцатизначное число.


когда вы пытаетесь создать ветвь в первый раз, Git GUI запрашивает выражение ревизии, из моего понимания я думаю, что git уже создана и зафиксирована ветвь, чтобы отслеживать вновь внесенные изменения, такие как (новая ветвь /модификация в файлах), чтобы сравнить его с чем-то(здесь главная ветвь).