Как проверить в Git по дате?

Я работаю над регрессией в исходном коде. Я хотел бы сказать Git: "проверить источник на основе параметризованной даты/времени". Это возможно?

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

Ответ 1

Чтобы сохранить ваши текущие изменения

Вы можете хранить свою работу подальше, не передавая ее, с помощью git stash. Вы могли бы использовать git stash pop чтобы получить его обратно. Или вы можете (как сказал Карлито) сделать git commit в отдельной ветке.

Оформить заказ по дате, используя rev-parse

Вы можете оформить коммит к определенной дате, используя rev-parse следующим образом:

git checkout '[email protected]{1979-02-26 18:30:00}'

Более подробную информацию о доступных опциях можно найти в git-rev-parse.

Как отмечено в комментариях, этот метод использует reflog, чтобы найти коммит в вашей истории. По умолчанию эти записи истекают через 90 дней. Хотя синтаксис использования reflog менее подробный, вы можете вернуться только на 90 дней назад.

Оформить заказ по дате, используя rev-list

Другой вариант, который не использует reflog, состоит в том, чтобы использовать rev-list для получения фиксации в определенный момент времени с помощью:

git checkout 'git rev-list -n 1 --first-parent --before="2009-07-27 13:37" master'

Обратите внимание на --first-parent, если вам нужна только ваша история, а не версии, внесенные слиянием. Это то, что вы обычно хотите.

Ответ 2

Решение Andy не работает для меня. Здесь я нашел другой способ:

git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`

Git: проверка по дате

Ответ 3

Похоже, вам нужно что-то в этом роде: Git проверка по дате

Другими словами, вы используете rev-list для поиска фиксации, а затем используете checkout для на самом деле получить его.

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

Изменить: ссылка не работает, поэтому команда:

git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`

Ответ 4

Для тех, кто предпочитает команду для подстановки подстановки

git rev-list -n1 --before=2013-7-4 master | xargs git checkout

Ответ 5

В моем случае -n 1 не работает. В Windows я обнаружил, что следующая последовательность команд работает нормально:

git rev-list -1 --before="2012-01-15 12:00" master

Это возвращает соответствующий SHA коммита для данной даты, а затем:

git checkout SHA

Ответ 6

Идем дальше с опцией rev-list, если вы хотите найти последнее объединение слияния из своей основной ветки в свою производственную ветвь (как чисто гипотетический пример):

git checkout `git rev-list -n 1 --merges --first-parent --before="2012-01-01" production`

Мне нужно было найти код, который был на рабочих серверах на определенную дату. Это нашло это для меня.

Ответ 7

Решение git rev-parse, предложенное @Andy, отлично работает, если интересующая вас дата - дата фиксации. Если вы хотите проверить на основе даты автора, rev-parse не будет работать, потому что он не предлагает вариант использовать эту дату для выбора коммитов. Вместо этого вы можете использовать следующее.

git checkout $( git log --reverse --author-date-order --pretty=format:'%ai %H' master | awk '{hash = $4} $1 >= "2016-04-12" {print hash; exit 0 } )

(Если вы также хотите указать время использования $1 >= "2016-04-12" && $2 >= "11:37" в предикате awk.)

Ответ 8

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

Другие ответы содержат методы возврата репозитория к последнему фиксации в ветки на определенное время - но они могут быть не всегда достаточными. Например, если вы создаете из ветки, а затем удаляете ветвь или создаете из ветки, которая позже будет пересоздана, сборка, которую вы построили, может стать "недостижимой" в git из любой текущей ветки. Недостижимые объекты в git могут быть удалены, когда репозиторий уплотнен.

Помещение тега в фиксацию означает, что он никогда не становится недоступным, независимо от того, что вы делаете с ветвями после этого (запрет на удаление тега).

Ответ 9

git rev-list -n 1 --before="2009-07-27 13:37" origin/master

возьмите печатную строку (например, XXXX) и выполните:

git checkout XXXX