Или просто все коммиты, произошедшие между двумя датами? В SVN вы можете сделать что-то вроде
svn diff -r{date}:{date}
сделать это! Кажется, я не могу найти аналог этого Git.
В частности, я собираюсь написать сценарий для ежедневной рассылки электронных писем со всем кодом, зафиксированным в тот день, и кем.
The command is kept primarily for historical reasons; fingers of many people who learned Git long before git log was invented by reading Linux kernel mailing list are trained to type it.
Итак, в документации рекомендуется использоватьgit log
вместоgit whatchanged
; эта последняя команда также использует параметр --no-merge в git log, поэтому они выводят те же результаты.git whatchanged
устарело в последней версии 2.21.0. Всеgit whatchanged
достигнутое можно достичь,git log
и это сохраняется только по историческим причинам. См. Подробности git-scm.com/docs/git-whatchanged/2.21.0Предыдущие предложения имеют некоторые недостатки. В принципе, я искал что-то эквивалентное
cvs diff -D"1 day ago" -D"2010-02-29 11:11"
. Собирая все больше и больше информации, я нашел решение.Вещи, которые я пробовал:
git whatchanged --since="1 day ago" -p
от сюдаНо это дает разницу для каждого коммита, даже если в одном файле есть несколько коммитов. Я знаю, что понятие «свидание» в git несколько расплывчатое , я подумал, что должен быть какой-то способ сделать это.
git diff 'master@{1 day ago}..master
дает некоторое предупреждениеwarning: Log for 'master' only goes back to Tue, 16 Mar 2010 14:17:32 +0100.
и не показывает все различия.git format-patch --since=yesterday --stdout
мне ничего не дает.revs=$(git log --pretty="format:%H" --since="1 day ago");git diff $(echo "$revs"|tail -n1) $(echo "$revs"|head -n1)
работает как-то, но кажется сложным и не ограничивается текущей веткой.В заключение:
git diff $(git rev-list -n1 --before="1 day ago" master)
похоже, работает и используется по умолчанию для подобных вещей , хотя и более сложный, чем я думал.Как ни странно, git-cvsserver не поддерживает "cvs diff -D" (без этого он где-то задокументирован).
источник
git rev-list
, что во многом помогло решить очень похожую проблему, которую я видел.git diff 'master@{1 day ago}..master
средства синтаксиса «проверить на reflog и выяснить , где ветвьmaster
используется для точки в локальном хранилище1 day ago
». В частности, не будет использоваться фактическая история фиксации текущей веткиmaster
. Это очень редко то, что вам действительно нужно.«Дата» - это немного растяжимое понятие в git. У коммита будет дата автора, которая может быть когда-то давно в прошлом, прежде чем кто-то фактически вытянет / зафиксирует фиксацию в своем репозитории, также фиксация может быть перебазирована и обновлена, чтобы быть поверх явно более новой фиксации.
У фиксации также есть дата фиксации, которая обновляется, если фиксация изменена или изменена каким-либо образом. Эти коммиты, скорее всего, будут в каком-то хронологическом порядке, но вы по-прежнему зависите от того, что коммиттер имеет правильное время, установленное на его компьютере, и даже в этом случае немодифицированный коммит может находиться в функциональной ветке в удаленном репозитории неопределенно долго до объединяются в главную ветвь центрального репозитория.
Что, вероятно, наиболее полезно для ваших целей, - это дата рефлога в конкретном рассматриваемом репозитории. Если у вас включены рефлоги для каждой ветки (см. Раздел "Ресурсы"
git config core.logAllRefUpdates
), вы можете использоватьref@{date}
синтаксис, чтобы указать, где ветвь находилась в определенное время.Например
Вы также можете использовать «нечеткие» описания, например:
Эти команды покажут все коммиты, которые «появились» в данной ветке репозитория, независимо от того, насколько они «стары» в соответствии с их автором и датами фиксации.
Обратите внимание, что журнал ссылок для каждой ветки специфичен для репозитория, поэтому, если вы запускаете команду журнала на клоне и не тянете (скажем) в течение месяца, тогда извлеките все изменения за последний месяц сразу, тогда все изменения за последний месяц появятся в
@{1 hour ago}..@{now}
диапазоне. Если вы можете запустить команду log в «центральном» репосторе, на который люди нажимают, тогда он может делать то, что вы хотите.источник
@{time spec}
синтаксис всегда ссылается на ваш локальный журнал ссылок . Это не относится к фактической истории фиксации (DAG). Если вы не понимаете разницу, не используйте этот синтаксис!или
источник
@{time spec}
синтаксис всегда ссылается на ваш локальный журнал ссылок . Это не относится к фактической истории фиксации (DAG). Если вы не понимаете разницу, не используйте этот синтаксис!возможно
это то, что вы хотите (с параметром --stdout или без него)?
источник
Я считаю, что общее решение - использовать:
Без --first-parent вы можете получить фиксацию из ветки, которая была позже объединена,
a ref
но не была объединена сa date string
.Вот альтернатива с использованием
--children
иgrep
вместо-n1
:Я не был знаком с этим
git whatchanged
до того, как прочитал этот вопрос и ответ, но он дает для меня совсем другие результаты, поэтому я не уверен, что он делает.источник
Еще один простой способ получить различие всех изменений с определенной даты - просто найти первую фиксацию,
X
которая произошла в эту дату или после нее, а затем использоватьЭто имеет то преимущество, что он не зависит от записей рефлога в новом клоне, в отличие от
решения в
источник
Чтобы отслеживать изменения файлов Git в вашей ветке, используйте следующую формулу:
Формула :
Обратите внимание, что даты на формате ГГГГ-ММ-ДД :
Если вы хотите наблюдать изменения в конкретном файле в определенном временном диапазоне (смотрите разницу в коде), просто перейдите к текущему файлу:
Пример :
источник
Это более забавный ответ, потому что, вероятно, есть способ получше. Это покажет все хэши коммитов на сегодня.
; ·)
источник
Вы также можете использовать git-format-patch для подготовки исправлений (различий) и отправки их по электронной почте.
Используйте параметры [с] или [диапазон ревизий], чтобы указать диапазон фиксации.
источник
Я добавлю способ, которым я это делаю:
git log
дата дает вам хэши фиксации для текущей ветки. Затем я просто использую что-то вроде того,git diff 8fgdfg8..565k4l5
что дает мне правильную разницу, агрегированную по файлам. Надеюсь, это поможет, хотя и не тестировалось.источник