Как проверить в 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