如何使用Git获取两个日期之间发生的所有提交之间的差异?

时间:2009-07-21 20:35:14

标签: git diff git-diff git-log

或者只是两个日期之间发生的所有提交?在SVN中,您可以执行类似

的操作
svn diff -r{date}:{date}

去做!我似乎无法找到与此相当的Git。

具体来说,我正在编写一个脚本来发送每日电子邮件,其中包含当天和由谁执行的所有代码。

11 个答案:

答案 0 :(得分:149)

您可以使用git whatchanged --since="1 day ago" -p

它还需要--until个参数。

Docs

答案 1 :(得分:56)

以前的建议有一些缺点。基本上,我正在寻找相当于cvs diff -D"1 day ago" -D"2010-02-29 11:11"的东西。在收集越来越多的信息时,我找到了一个解决方案。

我尝试过的事情:

    来自here

  • git whatchanged --since="1 day ago" -p

    但即使一个文件中有多个提交,这也会为每个提交提供一个差异。我知道"date" is a bit of a loose concept in 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-cvsserver不支持“cvs diff -D”(没有它在某处记录)。

答案 2 :(得分:21)

“日期”在git中有点松散的概念。提交将具有一个作者日期,在某人实际将提交提交到其存储库之前可能已经过了一段时间,也可以将提交重新定义并更新为基于明显更新的提交。

提交还有一个提交日期,如果以任何方式重新提交或修改提交,则更新提交日期。这些提交更有可能按照某种时间顺序排列,但是你仍然受到计算机上设置了正确时间的提交者的支配,即使如此,未经修改的提交也可以无限期地位于远程存储库的功能分支上被合并到中央存储库的主分支。

对您的目的而言,最有用的是相关特定存储库上的reflog日期。如果您启用了每个分支的reflog(请参阅git config core.logAllRefUpdates),那么您可以使用ref@{date}语法来指代分支在特定时间的位置。

E.g。

git log -p master@{2009-07-01}..master@{now}

您还可以使用“模糊”描述,例如:

git log -p "master@{1 month ago}..master@{yesterday}"

这些命令将显示在存储库的给定分支中“出现”的所有提交,而不管它们的作者和提交日期实际上是多么“老”。

请注意,每个分支的reflog特定于一个存储库,所以如果你在一个克隆上运行log命令,并且你没有拉(比如说)一个月,那么就拉上个月的所有更改马上,所有上个月的更改都会显示在@{1 hour ago}..@{now}范围内。如果您能够在人们推送的“中央”存储库上运行日志命令,那么它可以执行您想要的操作。

答案 3 :(得分:14)

git diff --stat @{2013-11-01}..@{2013-11-30}

git diff --stat @{2.weeks.ago}..@{last.week}

答案 4 :(得分:4)

也许

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

是你想要的(有没有'--stdout')?

答案 5 :(得分:3)

我相信一般的解决方案是使用:

git rev-list -n1 --first-parent --until=<a date string> <a ref>

如果没有--first-parent,您可能会从后来合并到a ref但从a date string开始合并但尚未合并的分支进行提交。

以下是使用--childrengrep代替-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 ' '
}

在阅读此Q&amp; A之前,我对git whatchanged并不熟悉,但它为我提供了截然不同的结果,所以我不确定它在做什么。

答案 6 :(得分:3)

另一种简单的方法是,您可以在特定日期之后获得所有更改的差异,只需查找在该日期或之后发生的第一个提交X,然后使用

git diff X

不同,它的优势在于它不依赖于新克隆中的reflog条目。
git diff <reference>@{n}..
git log <reference>@{n}..

中的

解决方案

答案 7 :(得分:2)

这是一个有趣的答案,因为可能有更好的方法。这将显示今天的所有提交哈希。

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

<强>;·)

答案 8 :(得分:2)

您还可以使用git-format-patch准备补丁(差异)并通过电子邮件发送。

使用选项[since]或[revision range]指定提交范围。

答案 9 :(得分:0)

我会按照我的方式投掷: git log日期为您提供当前分支的提交哈希值。然后我只使用类似git diff 8fgdfg8..565k4l5的东西,它给出了由文件聚合的正确差异。希望这有帮助,但没有经过多少测试

答案 10 :(得分:0)

为了观看文件在分支机构中的最新更改,使用以下公式

  1. 结帐您的分支机构。
  2. 从远程存储库中拉出并更新更改
  3. 观看日期范围内的差异文件

示例:

git checkout <branch>
git pull
git diff --stat @{fromDate}..@a{toDate}

请注意日期采用 YYYY-MM-DD 格式:

git diff --stat @{2019-08-20}..@a{2019-08-21}

如果您想观察特定时间范围内特定文件的更改(观看代码中的差异),只需浏览当前文件即可:

示例:

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