Имеет ли смысл выполнять git rebase
, сохраняя отметки времени коммита?
Я считаю, что следствием этого будет то, что новая ветвь не обязательно будет иметь даты фиксации в хронологическом порядке. Это теоретически возможно вообще? (например, используя сантехнические команды; просто любопытно здесь)
Если это теоретически возможно, то возможно ли на практике с перебазированием не изменять временные метки?
Например, предположим, у меня есть следующее дерево:
master <jun 2010>
|
:
:
: oldbranch <feb 1984>
: /
oldcommit <jan 1984>
Теперь, если я перебазироваться oldbranch
на master
, дата фиксации изменений с февраля 1984 по июнь 2010 Можно ли изменить это поведение так , что фиксация метки времени не меняется? В итоге я бы получил:
oldbranch <feb 1984>
/
master <jun 2010>
|
:
Будет ли это иметь смысл вообще? Разрешено ли даже в git иметь историю, в которой старый коммит имеет более свежий коммит в качестве родителя?
источник
git rebase --committer-date-is-author-date SHA
. Смотрите мой отредактированный ответ нижеОтветы:
Обновление, июнь 2014 года: Дэвид Фрейзер упоминает в комментариях решение, подробно описанное в разделе « Изменение временных меток при перебазировании ветки git », с использованием параметра
--committer-date-is-author-date
(впервые представлен в январе 2009 года в коммите 3f01ad6.Смотрите
git am
:(Оригинальный ответ, июнь 2012 г.)
Вы можете попробовать, для неинтерактивного перебазирования
(из этого ТАКОГО ответа )
Это передается
git am
, который упоминает:Для
git rebase
этого параметра «Несовместимо с параметром --interactive».Поскольку вы можете по желанию изменить временную метку старой даты фиксации (с помощью
git filter-branch
), я полагаю, вы можете организовать свою историю Git с любым порядком дат фиксации, который вы хотите / нуждаетесь, даже установить его на будущее! ,Как упоминает Оливье в своем вопросе, дата автора никогда не изменяется путем перебазирования;
Из Pro Git Book :
Чтобы быть более ясным, в данном случае, как отмечает Оливье:
источник
git rebase --ignore-date
не работает. Это изменяет даты перебазированных коммитов.--ignore-date
, что я пытался достичь, противоположно тому, чего я пытался достичь! А именно, он стирает метку времени автора и заменяет ее метками времени коммитов! Таким образом, правильный ответ на мой вопрос: ничего не делать, такgit rebase
как на самом деле не изменяет метки времени авторов по умолчанию.--committer-date-is-author-date
опция, похоже, оставляет метку времени автора и устанавливает метку времени коммиттера такой же, как оригинальная метка времени автора, чего и хотел Оливье ...Если вы уже испортили даты фиксации (возможно, с перебазированием) и хотите сбросить их до соответствующих дат автора, вы можете запустить:
git filter-branch --env-filter 'GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE; export GIT_COMMITTER_DATE'
источник
WARNING: Ref 'refs/heads/master' is unchanged
. Я использую git версии 1.7.9.5 в Linux (64-разрядная версия)git rebase --committer-date-is-author-date <base_branch>
таким образом, git сбрасывает дату фиксации только для коммитов, примененных к <base_branch> (что, вероятно, то же название ветки, которое вы использовали, когда облажались).Решающий вопрос фон C помог мне понять , что происходит: когда ваш перебазироваться, в коммиттера изменения временной метки, но не автора метка времени, которая вдруг все имеет смысл. Так что мой вопрос был недостаточно точным.
Ответ в том, что rebase на самом деле не меняет метки автора (вам ничего не нужно для этого делать), что мне подходит.
источник
По умолчанию git rebase устанавливает метку времени коммиттера на время создания нового коммита, но сохраняет метку времени автора без изменений. В большинстве случаев это желаемое поведение, но в некоторых случаях мы не хотим изменять метку времени коммитера. Как мы можем сделать это? Ну, вот трюк, который я обычно делаю.
Во-первых, убедитесь, что каждый коммит, который вы собираетесь перебазировать, имеет уникальное сообщение о коммите и отметку времени автора (здесь уловка нуждается в улучшении, хотя в настоящее время она соответствует моим потребностям).
Перед перебазированием запишите метку времени коммиттера, метку автора и сообщение о коммите всех коммитов, которые будут перебазированы в файл.
Затем позвольте фактической перезагрузке иметь место.
Наконец, мы заменяем временную метку текущего коммиттера на метку, записанную в файле, если сообщение о фиксации совпадает с использованием
git filter-branch
.Если что-то пойдет не так, просто проверьте
git reflog
или всеrefs/original/
ссылки.Furthormore, вы можете сделать то же самое с отметкой времени автора.
Например, если временная метка автора некоторых коммитов не в порядке, и без перестановки этих коммитов мы просто хотим, чтобы метка времени автора показывалась по порядку, тогда помогут следующие команды.
источник