Я работаю над регрессом в исходном коде. Я хотел бы сказать Git: «извлечение источника на основе параметризованной даты / времени». Это возможно?
У меня также есть изменения в моем текущем представлении, которые я не хочу терять. В идеале я хотел бы переключаться между текущим источником и какой-либо интересующей меня версией, основываясь на предыдущей дате.
git
git-checkout
Амир Афганский
источник
источник
git bisect good
точки.tags
.Ответы:
Чтобы сохранить ваши текущие изменения
Вы можете хранить свою работу подальше, не передавая ее, с
git stash
. Вы бы, чем использовать,git stash pop
чтобы вернуть его. Или вы можете (как сказал Карлито )git commit
это в отдельную ветку.Оформить заказ по дате, используя rev-parse
Вы можете оформить коммит к определенной дате, используя
rev-parse
вот так:Более подробную информацию о доступных опциях можно найти в
git-rev-parse
.Как отмечено в комментариях, этот метод использует reflog, чтобы найти коммит в вашей истории. По умолчанию срок действия этих записей истекает через 90 дней . Хотя синтаксис использования reflog менее подробный, вы можете вернуться только на 90 дней назад.
Оформить заказ по дате, используя rev-list
Другой вариант, который не использует reflog, это использовать
rev-list
для получения фиксации в определенный момент времени с помощью:Обратите внимание на --first-parent, если вам нужна только ваша история, а не версии, внесенные слиянием. Это то, что вы обычно хотите.
источник
git co 'master@{2 days ago}'
.git rev-list -n 1 --before="2009-07-27 13:37" master
$(...)
являются предпочтительными.Решение Энди не работает для меня. Здесь я нашел другой способ:
Git: оформить заказ по дате
источник
error: unknown switch `n'
идеи, как обойти это?Похоже, вам нужно что-то вроде этого: Git checkout на основе даты
Другими словами, вы используете,
rev-list
чтобы найти коммит, а затем используете checkout, чтобы фактически получить его.Если вы не хотите потерять свои поэтапные изменения, проще всего будет создать новую ветку и зафиксировать их в этой ветке. Вы всегда можете переключаться между ветвями.
Изменить: ссылка не работает, поэтому вот команда:
источник
git checkout branch@{date}
перестает работать, когда истекает reflog, но вы можете использоватьgit checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`
.Тем, кто предпочитает трубу командной подстановке
источник
В моем случае
-n 1
опция не работает. В Windows я обнаружил, что следующая последовательность команд работает нормально:Это возвращает SHA соответствующего коммита на указанную дату, а затем:
источник
git rev-parse
Решение , предложенное @Andy работает нормально , если дата вас интересует это совершить дату . Однако, если вы хотите оформить заказ на основе даты автора ,rev-parse
не будет работать, потому что он не предлагает возможность использовать эту дату для выбора фиксаций. Вместо этого вы можете использовать следующее.(Если вы также хотите указать время, используемое
$1 >= "2016-04-12" && $2 >= "11:37"
в предикате awk .)источник
rev-list
Если вы хотите найти самую последнюю фиксацию слияния из вашей основной ветви в вашу производственную ветвь (в качестве чисто гипотетического примера), перейдем далее к опции:Мне нужно было найти код, который был на производственных серверах на определенную дату. Это нашло это для меня.
источник
Если вы хотите иметь возможность вернуться к точной версии репозитория во время сборки, лучше всего пометить коммит, из которого вы делаете сборку.
Другие ответы предоставляют методы для возврата хранилища в самый последний коммит в ветке на определенное время, но их не всегда достаточно. Например, если вы строите из ветки, а затем удаляете ветку, или строите из ветки, которая позже была перебазирована, созданный вами коммит может стать «недоступным» в git из любой текущей ветки. Недоступные объекты в git могут в конечном итоге быть удалены при сжатии хранилища.
Помещение тега в коммит означает, что он никогда не станет недоступным, независимо от того, что вы делаете с ветками впоследствии (за исключением удаления тега).
источник
возьмите напечатанную строку (например, XXXX) и выполните:
источник