Как я могу получить разницу между всеми фиксациями, которые произошли между двумя датами, с помощью Git?

Или только все фиксации, которые произошли между двумя датами? В SVN вы можете сделать что-то вроде

svn diff -r{date}:{date}

сделать это! Кажется, я не могу найти эквивалент Git.

В частности, я ищу письмо script для отправки ежедневных писем со всем кодом, совершенным в тот день и кем.

Ответ 1

Вы можете использовать git whatchanged --since="1 day ago" -p

Он также принимает аргумент --until.

Docs

Ответ 2

Предыдущие предложения имеют некоторые недостатки. По сути, я искал что-то эквивалентное cvs diff -D"1 day ago" -D"2010-02-29 11:11". Собирая все больше и больше информации, я нашел решение.

Вещи, которые я пробовал:

  • git whatchanged --since="1 day ago" -p из здесь

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

  • git diff '[email protected]{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-cvsserver не поддерживает "cvs diff -D" (без этого это где-то задокументировано).

Ответ 3

"дата" - это немного свободное понятие в git. Конец будет иметь дату автора, которая могла бы быть в прошлом некоторое время, прежде чем кто-то действительно вытащит/зафиксирует фиксацию в своем репозитории, а также может быть переустановлена ​​и обновлена ​​фиксация, чтобы быть поверх явно более новой фиксации.

Фиксированная передача также имеет дату фиксации, которая обновляется, если фиксация будет каким-либо образом изменена или изменена. Эти коммиты с большей вероятностью будут в каком-то хронологическом порядке, но вы по-прежнему находились во власти коммиттера, имеющего правильное время, установленное на его компьютере, и, несмотря на это, немодифицированная фиксация может сидеть на ветке функций на удаленном репозитории неограниченно раньше объединяется в главную ветвь центрального хранилища.

Что, вероятно, наиболее полезно для ваших целей, это дата reflog в конкретном репозитории. Если вы включили блокировки для каждой ветки (см. git config core.logAllRefUpdates), вы можете использовать синтаксис [email protected]{date}, чтобы ссылаться на то, где была ветка в определенное время.

например.

git log -p [email protected]{2009-07-01}[email protected]{now}

Вы также можете использовать "нечеткие" описания, например:

git log -p "[email protected]{1 month ago}[email protected]{yesterday}"

Эти команды будут отображать все коммиты, которые "появились" в данной ветке репозитория, независимо от того, как они "старые" на самом деле соответствуют их дате и дате фиксации.

Обратите внимание, что рефлектор для каждой ветки специфичен для репозитория, поэтому, если вы выполняете команду журнала на клоне, и вы не тянете за (скажем) месяц, то вытащите все изменения за последний месяц сразу же, все изменения последнего месяца появятся в диапазоне @{1 hour ago}[email protected]{now}. Если вы можете запустить команду журнала на "центральной" репозитории, которую люди нажимают, тогда она может делать то, что вы хотите.

Ответ 5

Может

$ git format-patch --committer=<who> --since=yesterday --stdout

- это то, что вы хотите (с или без '--stdout')?

Ответ 6

Я считаю, что общее решение заключается в использовании:

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, но для меня это дает разные результаты, поэтому я не уверен, что он делает.

Ответ 7

Еще один простой способ, которым вы можете получить разницу всех изменений с определенной даты, - это просто найти первый commit X, который произошел после или после этой даты, затем используйте

git diff X

Это имеет то преимущество, что оно не зависит от записей reflog в новом клоне, в отличие от

git diff <reference>@{n}..
git log <reference>@{n}..

решений в

Ответ 8

Это более смешной ответ, потому что, вероятно, лучший способ. Это покажет все хеши фиксации на сегодняшний день.

git log --pretty="format:%H %ai" | grep `date +"%Y-%m-%d"` | awk {'print $1'}`

; & Мидот;)

Ответ 9

Вы также можете использовать git-format-patch для подготовки патчей (разностей) и отправки их по электронной почте.

Используйте опции [с] или [диапазон изменения], чтобы указать диапазон коммитов.

Ответ 10

Я брошу так, как я это сделаю: git log для даты дает хеши для текущей ветки. Затем я просто использую что-то вроде git diff 8fgdfg8..565k4l5, которое дает мне правильную разницу, агрегированную файлами. Надеюсь, что это поможет, не испытал много, хотя

Ответ 11

Чтобы отслеживать изменения файлов от даты к дате в вашей ветке,используйте следующую формулу:

  1. Оформите свою ветку.
  2. извлекать и обновлять изменения из удаленного хранилища
  3. смотреть разные файлы из диапазона дат

Пример:

git checkout <branch>
git pull
git diff --stat @{fromDate}[email protected]{toDate}

Обратите внимание, что даты указаны в формате ГГГГ-ММ-ДД :

git diff --stat @{2019-08-20}[email protected]{2019-08-21}

Если вы хотите наблюдать изменения в определенном файле за определенный промежуток времени (посмотреть разницу в коде), просто перейдите к текущему файлу:

Пример:

git diff @{2019-01-01}[email protected]{2019-01-02} ~/dev/myApp/package.json