123

或者只是两个日期之间发生的所有提交?在 SVN 中,你可以做类似的事情

svn diff -r{date}:{date}

去做吧!我似乎找不到与此等效的 Git。

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

4

11 回答 11

175

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

它也需要一个--until论据。

文档

于 2009-07-21T20:40:53.650 回答
65

前面的建议有一些缺点。基本上,我一直在寻找与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-cvsserver 不支持“cvs diff -D”(没有它记录在某处)。

于 2010-03-16T14:54:33.367 回答
24

“日期”在 git 中是一个有点松散的概念。提交将有一个作者日期,该日期可能是在某人实际将提交拉入/提交到他们的存储库之前的某个时间,而且提交可能会被重新设置并更新到明显较新的提交之上。

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

对您的目的最有用的可能是相关特定存储库上的 reflog 日期。如果您启用了每个分支的引用日志(请参阅 参考资料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 命令,那么它可能会执行您想要的操作。

于 2009-07-21T20:58:34.737 回答
18
git diff --stat @{2013-11-01}..@{2013-11-30}

或者

git diff --stat @{2.weeks.ago}..@{last.week}
于 2013-11-24T04:37:51.023 回答
5

也许

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

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

于 2009-07-21T21:12:18.937 回答
3

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

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

a ref如果没有 --first-parent,您可能会从后来合并到但尚未合并的分支中获得提交a date string

这是使用--childrenandgrep代替的替代方法-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在阅读此问答之前我并不熟悉,但它给我的结果非常不同,所以我不确定它在做什么。

于 2012-05-21T21:10:28.267 回答
3

另一种简单的方法可以让您获得自某个日期以来所有更改的差异,即简单地找到X在该日期或之后发生的第一个提交,然后使用

git diff X

这样做的好处是它不依赖于新克隆中的 reflog 条目,不像

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

中的解决方案

于 2014-07-22T03:59:31.190 回答
3

为了在您的分支上查看Git 文件的最新变化,请使用以下公式:

  1. 检查你的分支。
  2. 从远程存储库中提取和更新更改
  3. 从日期到日期范围查看差异文件

公式

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

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

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

如果您想观察特定时间范围内特定文件的变化(观察代码中的差异),只需导航当前文件:

示例

git diff @{2019-01-01}..@{2019-01-02} ~/dev/myApp/package.json
于 2019-08-27T12:30:51.453 回答
2

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

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

;·)

于 2009-07-21T20:57:46.033 回答
2

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

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

于 2009-07-21T21:03:48.923 回答
0

我会按照我的方式进行操作: git log日期为您提供当前分支的提交哈希。然后我只是使用类似的东西git diff 8fgdfg8..565k4l5给我按文件聚合的适当差异。希望这会有所帮助,虽然没有经过太多测试

于 2016-06-16T12:54:25.350 回答