Изменить временные метки при перемещении ветки git

99

Я реорганизовал коммиты в ветке до того, как они будут опубликованы, в результате чего метки времени коммитов находятся в смешанном порядке. Я бы предпочел, чтобы они все были сегодня с перерывом в несколько секунд.

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

Итак, как мне сказать git создать новые отметки времени при перемещении?

предплюсны
источник
С Git 2.29 (4 квартал 2020 г.) будет работать git rebase --rootили -i, с --reset-author-date. Смотрите мой ответ ниже
VonC

Ответы:

135
git rebase --ignore-date
Михаил Крелин - хакер
источник
2
Я пробовал это перед публикацией .. За исключением того, что я не делал это в интерактивном режиме, может это уловка? Кроме того, пробовали ли вы псевдоним --committer-date-is-author-date? Возможно, параметр --ignore-date был представлен в более поздней версии, я понятия не имею.
Михаил Крелин - хакер
2
Да, если не интерактивно, это работает. Но тогда - как всегда с rebase - не затрагивается самая первая фиксация.
tarsius
2
@ MichaelKrelin-hacker: согласно документации, --ignore-date Эти флаги передаются в git am, чтобы легко изменять даты перемещенных коммитов (см. Git-am [1]). Несовместимо с опцией --interactive.
Тим
4
@Tim У корневого коммита нет родителя, и когда я задал этот вопрос, я также захотел изменить дату этого коммита. Теперь у нас есть --root, что делает это возможным.
tarsius
3
Incompatible with the --interactive option. См. Документы
Vlastimil Ovčáčík
28

В моем случае перебазирование изменило временные метки на значение CommitDate, поэтому в gitweb несколько коммитов месячной давности показывались как 4-дневные. Я нашел последний коммит с правильной датой и сделал:

$ git rebase --committer-date-is-author-date SHA
lkraav
источник
39
Нет, это не так. На самом деле все наоборот. Из документации git rebase: « Эти флаги передаются, git amчтобы легко изменять даты перемещенных коммитов ». В git amнем говорится: --committer-date-is-author-date« [...] позволяет пользователю лгать о дате коммиттера, используя то же значение, что и дата автора », а --ignore-date« [...] позволяет пользователю лгать о дате автора, используя то же значение как дату коммиттера ".
Энрико Кампидоглио
11

Есть следующие способы

  1. Нормальное перебазирование

    git rebase --ignore-date
    
  2. Интерактивное перебазирование

    git rebase -i master
    git commit --amend --date=now
    git push origin <branch> -f
    
Умар Асгар
источник
0

Из комментариев:

Несовместимо с --interactive option

На самом деле ... он больше не несовместим с Git 2.29 (Q4 2020): " git rebase -i" ( man ) узнает немного больше возможностей .
Опции, совместимые с:

  • --interactive/-i
  • --root!

См. Commit 6160b2e (26 августа 2020 г.), автор Junio ​​C Hamano ( gitster) .
См. Commit 2712669 (17 августа 2020 г.) и commit ef484ad (13 июля 2020 г.) Рохит Ашивал ( r1walz) .
См. Commit a3894aa , commit 7573cec , commit e8cbe21 (17 августа 2020 г.) от Филиппа Вуда ( phillipwood) .
(Объединено Junio ​​C Hamano - gitster- в коммите 9c31b19 , 3 сентября 2020 г.)

rebase -i: служба поддержки --ignore-date

Автор патча: Рохит Ашивал
Подписано: Филлип Вуд

Rebase реализуется с двумя разными бэкэндами - ' apply' и ' merge', каждый из которых поддерживает свой набор параметров.

В частности, бэкэнд apply поддерживает ряд опций, реализованных ' ( man ) ', которые не реализованы в бэкэнде слияния. Это означает, что доступные параметры различаются в зависимости от того, какой сервер используется, что сбивает с толку.git am

Этот патч добавляет поддержку этой --ignore-dateопции в бэкэнд слияния.

Эта опция использует текущее время как дату автора, а не повторно использует исходную дату автора при перезаписи коммитов.
Мы заботимся о том, чтобы обрабатывать комбинацию --ignore-dateи так --committer-date-is-author-dateже, как и бэкэнд apply.

И:

rebase: Добавить --reset-author-date

Помощник: Джунио С. Хамано.
Подпись: Рохит Ашивал.

Предыдущий коммит представил --ignore-dateфлаг для rebase -i, но имя довольно расплывчатое, так как не говорит, игнорируется ли дата автора или дата коммиттера.
Добавьте псевдоним, чтобы передать точную цель.

--reset-author-date

Также:

rebase -i: support --committer-date-is-author-date

Автор патча: Рохит Ашивал
Подписано: Филлип Вуд

Этот патч добавляет поддержку этой --committer-date-is-author-dateопции в бэкэнд слияния.
Эта опция использует дату создания коммита, который переписывается, как дату коммиттера при создании нового коммита.

git rebaseтеперь включает в свою справочную страницу :

--committer-date-is-author-date:

Вместо того, чтобы использовать текущее время в качестве даты коммиттера, используйте дату создания коммита, который перебазируется в качестве даты коммиттера.
Этот вариант подразумевает --force-rebase.

git rebaseтакже включает в свою справочную страницу :

--ignore-date:

Этот флаг передается в 'git am', чтобы изменить дату создания каждого коммита с измененной базой (см. git am).

VonC
источник