Как я могу получить разницу между всеми коммитами, которые произошли между двумя датами с Git?
Или просто все коммиты, которые произошли между двумя датами? В SVN вы могли бы сделать что-то вроде
svn diff -r{date}:{date}
сделать это! Я не могу найти Git, эквивалентный этому.
В частности, я смотрю на написание сценария для ежедневной рассылки электронных писем со всем кодом, совершенным в тот день и кем.
10 ответов
Вы могли бы использовать git whatchanged --since="1 day ago" -p
Это также занимает --until
аргумент.
Предыдущие предложения имеют некоторые недостатки. По сути, я искал что-то эквивалентное 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. Для коммита будет указана дата создания автора, которая может пройти довольно давно, прежде чем кто-то на самом деле извлечет / зафиксирует коммит в своем хранилище, также коммит может быть перебазирован и обновлен, чтобы быть поверх явно нового коммита.
У фиксации также есть дата фиксации, которая обновляется, если фиксация была перебазирована или изменена каким-либо образом. Эти коммиты, скорее всего, будут в каком-то хронологическом порядке, но вы все еще находитесь в зависимости от коммиттера, у которого на компьютере установлено правильное время, и даже в этом случае неизмененный коммит может находиться в ветви функций в удаленном репозитории бесконечно долго быть объединенным с главной ветвью центрального хранилища.
Что, вероятно, наиболее полезно для ваших целей, это дата рефлога для конкретного репозитория. Если у вас включены повторные журналы для каждой ветви (см. git config core.logAllRefUpdates
) тогда вы можете использовать ref@{date}
синтаксис, чтобы указать, где была ветвь в определенное время.
Например
git log -p master@{2009-07-01}..master@{now}
Вы также можете использовать "нечеткие" описания, такие как:
git log -p "master@{1 month ago}..master@{yesterday}"
Эти команды покажут все коммиты, которые "появились" в данной ветви репозитория, независимо от того, насколько "старым" они на самом деле являются их автор и даты коммитов.
Обратите внимание, что reflog для каждой ветви специфичен для репозитория, поэтому, если вы запускаете команду log на клоне и не тянете (скажем) месяц, то извлекаете все изменения за последний месяц сразу, тогда все изменения за последний месяц появятся в @{1 hour ago}..@{now}
спектр. Если вы можете запустить команду log в "центральном" репозитории, куда люди толкают, он может делать то, что вы хотите.
git diff --stat @{2013-11-01}..@{2013-11-30}
или же
git diff --stat @{2.weeks.ago}..@{last.week}
Возможно
$ git format-patch --committer=<who> --since=yesterday --stdout
это то, что вы хотите (с или без '--stdout')?
Чтобы отслеживать изменения файлов Git в вашей ветке, используйте следующую формулу:
- проверить свой филиал.
- извлекать и обновлять изменения из удаленного репозитория
- смотреть файлы различий от даты до диапазона дат
Формула:
git checkout <branch>
git pull
git diff --stat @{fromDate}..@{toDate}
Обратите внимание, что даты указаны в формате ГГГГ-ММ-ДД:
git diff --stat @{2019-08-20}..@{2019-08-21}
Если вы хотите наблюдать за изменениями в конкретном файле в определенном временном диапазоне (смотрите разницу в коде), просто перейдите к текущему файлу:
Пример:
git diff @{2019-01-01}..@{2019-01-02} ~/dev/myApp/package.json
Другой простой способ получить различие всех изменений с определенной даты - просто найти первый коммит. X
что произошло в эту дату или после этой даты, затем используйте
git diff X
Это имеет то преимущество, что не зависит от записей reflog в новом клоне, в отличие от
git diff <reference>@{n}..
git log <reference>@{n}..
решения в
- /questions/36355831/kak-ya-mogu-poluchit-raznitsu-mezhdu-vsemi-kommitami-kotoryie-proizoshli-mezhdu-dvumya-datami-s-git/36355846#36355846
- /questions/36355831/kak-ya-mogu-poluchit-raznitsu-mezhdu-vsemi-kommitami-kotoryie-proizoshli-mezhdu-dvumya-datami-s-git/36355850#36355850
- /questions/36355831/kak-ya-mogu-poluchit-raznitsu-mezhdu-vsemi-kommitami-kotoryie-proizoshli-mezhdu-dvumya-datami-s-git/36355858#36355858
Я считаю, что общее решение заключается в использовании:
git rev-list -n1 --first-parent --until=<a date string> <a ref>
Без --first-parent вы могли бы получить коммит из ветви, которая позже была объединена в a ref
но не был объединен с a date string
,
Вот альтернативное использование --children
а также grep
вместо -n1
:
mlm_git_ref_as_of() {
# # Examples #
#
# Show all commits between two dates:
#
# git log $(mlm_git_ref_as_of '2012-05-21 09:00:00-0400')..$(mlm_git_ref_as_of '2012-05-21 17:00:00-0400')
#
# Show diffs of all commits between two dates:
#
# git diff $(mlm_git_ref_as_of '2012-05-21 09:00:00-0400')..$(mlm_git_ref_as_of '2012-05-21 17:00:00-0400')
local as_of="$1"
local ref="${2:-HEAD}"
# Get the most recent commit (--children, grep -v ' ') that was on
# the given branch ($ref, --first-parent) as of a given date
# ($as_of)
git rev-list --children --first-parent --until="$as_of" "$ref" | grep -v ' '
}
Я не был знаком с git whatchanged
перед прочтением этого Q&A, но это дает совсем другие результаты для меня, поэтому я не уверен, что он делает.
Это более забавный ответ, потому что, вероятно, есть лучший способ. Это покажет все совершенные хеши на сегодня.
git log --pretty="format:%H %ai" | grep `date +"%Y-%m-%d"` | awk {'print $1'}`
; ·)
Вы также можете использовать git-format-patch для подготовки патчей (различий) и отправки их по электронной почте.
Используйте опции [с] или [диапазон ревизий], чтобы указать диапазон коммитов.
Я добавлю, как я это делаю: git log
на дату дает вам зафиксировать хэши для текущей ветви. Тогда я просто использую что-то вроде git diff 8fgdfg8..565k4l5
что дает мне правильную разницу, агрегированную по файлам. Надеюсь, что это помогает, но не проверено много