"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
,