"git log" не совпадает с "git log tag.."

Я всегда предполагал, что "git log" - это источник всей правды, показывающий вещи действительно хронологически. Но я столкнулся с противоречием с опцией git log range. Я полагал, что опция 'tag..' даст мне все, что есть между тегом и HEAD в конкретной ветке, в которой я работаю.

Например, я использую git log --oneline --decorate и получить

df43779 (HEAD -> myBranch) commit o
5aeb672 commit n
34cc390 (tag: myTag) commit k
060e7ee commit i
7b6607a commit f
08a3fea commit d
467aea3 commit b
aa4c5dd commit a

И я ожидаю, что когда я сделаю git log myTag.. --oneline --decorate я бы получил

af43779 (HEAD -> myBranch) commit o
5aeb672 commit n

Тем не менее, когда я бегу git log myTag.. --oneline --decorate Я получаю это вместо этого:

df43779 (HEAD -> myBranch) commit o
5aeb672 commit n
060e7ee commit i
08a3fea commit d

Если предположить, git log говорит правду, по каким причинам моя команда диапазона может давать мне коммиты, выходящие за пределы указанного диапазона коммитов?

Я знаю, что для ответа на этот вопрос может быть полезна дополнительная информация, такая как время фиксации и информация о сложности ветвления. Но я думаю, что то, что я действительно хочу знать, является более теоретическим: журнал git отображает вещи в истинном хронологическом порядке или это не так просто, как кажется? И делает ли опция 'tag..' что-то кроме моего простого объяснения того, что он сделал? По каким причинам примеры не совпадают, как я думал?

Другими словами, какой журнал является "истинным журналом" и почему?

1 ответ

Решение

git log myTag.. действительно git log myTag..HEAD, Он запрашивает все коммиты, доступные из HEAD исключая те, которые достижимы из myTag, Это отвечает на вопрос "что я сделал с тех пор myTag?"Смотрите gitrevisions " Точечные обозначения диапазона ".

oа также n очевидно, они после myTag, Но почему iа также dкоторые, кажется, раньше myTag? Трудно узнать только от твоегоgit log,git logпредставляет линейный взгляд на историю, но история Git не линейна. Ветви реальны и коммиты могут быть связаны несколькими способами.

По умолчанию,git log представляет историю в обратном хронологическом порядке, а также следит за тем, чтобы родители и дети были в правильном порядке. Тебе нужно бежатьgit log --graphчтобы увидеть истинные связи. Возьмите за привычку использовать его или визуализатор журнала Git, напримерtig,

Вот один из способов, которым это могло произойти...

        o HEAD
        |
        n
        |\
  myTag k |
        | i
        f |
        | d
        |/
        b
        |
        a

Порядок обратной даты по-прежнему o-n-k-i-f-d-b-a, но теперь мы видим, что ветка была сделана в b и слились в n, myTag не вижу o-n впереди, но он также не может видеть i-d в другой ветке. myTag а также HEADистория воссоединяется b, Так git log myTag..HEAD дает тебе o-n-i-d,

Другие вопросы по тегам