Скажем, 2 компьютера нажимают на одно и то же репозиторий git, компьютер A имеет текущую дату и время, а компьютер B имеет дату и время, установленную на 1 год раньше.

Скажем, компьютер A отправил несколько коммитов, а компьютер B проверил их и добавил еще несколько коммитов на основе той же ветки и нажал.

*A (dated 2020-07-28 by computer A push) ----> *B (dated 2019-07-28 by computer B)

Что случится? Обеспечивает ли git отметку времени фиксации дочернего элемента позже, чем фиксация родительского элемента?

git
3
James Lin 28 Июл 2020 в 06:59

1 ответ

Лучший ответ

Нет ограничений на временные метки в коммитах.

Коммит явно хранит идентификатор своего родителя (ей), а git позволяет фиксации иметь временную метку меньше, чем у одного из родителей.

На самом деле фиксация имеет 2 отметки времени:

  • дата создания, называемая "датой автора"
  • дата изменения, называемая "дата коммиттера"

Некоторые функции git позволяют вам переписывать историю репо (git rebase, git cherry-pick, git commit --amend, git filter-branch ...), и в результате все чередования временных меток возможный.

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


Вы можете просмотреть две отметки времени с помощью нескольких команд:

  • для одного коммита:

    # will display timestamps rendered in human format :
    git show -s --format=fuller <branch or commit id>   # default is head
    
    # will display raw unix timestamps as stored in the commit :
    git cat-file -p <branch or commit id>
    git cat-file -p HEAD
    
  • для каждой фиксации в ветке:

    git log --format=fuller
    git log --format=fuller branch1 branch2 ...
    
  • с параметрами рендеринга git log или git for-each-ref: см. абзац --format для каждой из этих команд

Большинство интерфейсов GUI для git (например, gitk, git-kraken, git-extensions, sourcetree ...) также будут отображать две временные метки в деталях фиксации.

1
LeGEC 29 Июл 2020 в 10:02