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

Chr*_*ris 110 git diff git-diff git-log

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

svn diff -r{date}:{date}
Run Code Online (Sandbox Code Playgroud)

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

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

set*_*eth 155

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

它也需要一个--until论点.

文件

  • @brbob我知道很久以前就已经回答了这个问题,但是对于那些偶然发现的人(正如我所做的那样),Git帮助说:"这个命令主要是出于历史原因; 很多人在阅读Linux内核邮件列表发明git log之前很久就学会了Git的手指都经过训练才能输入它.因此,文档鼓励使用`git log`而不是`git whatchanged`; 这最后一个命令也使用git log的--no-merge选项,因此它们输出相同的结果. (17认同)
  • 你应该把这个作为你选择的答案,这样才能得到一些业力. (5认同)
  • 这应该标记为已接受的答案.:) (3认同)
  • 从当前最新版本 2.21.0 起,不推荐使用 `git whatchanged`。所有`git whatchanged`实现的都可以通过`git log`实现,并且只是由于历史原因而保留。查看详情 https://git-scm.com/docs/git-whatchanged/2.21.0 (3认同)
  • git whatchanged是根据[git log的文档](http://git-scm.com/docs/git-whatchanged)的git log命令的别名 (2认同)

Wei*_*nde 59

以前的建议有一些缺点.基本上,我正在寻找相当于的东西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"(没有它在某处记录).

  • @ctford,在我看来,这是不正确的.它可能会报告一个文件的多个差异,而不是每个文件的一个差异为svn/cvs diff. (6认同)
  • 为'git rev-list` +1,这对解决我遇到的非常相似的问题大有帮助. (4认同)
  • `git diff 'master@{1 day ago}..master` 语法的意思是“检查 **reflog** 并找出分支 `master` 用于指向 **本地存储库** `1 day ago` 的位置”。具体来说,不会使用当前分支“master”的实际提交历史记录。这很少是你真正想要的东西。 (2认同)

CB *_*ley 22

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

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

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

例如

git log -p master@{2009-07-01}..master@{now}
Run Code Online (Sandbox Code Playgroud)

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

git log -p "master@{1 month ago}..master@{yesterday}"
Run Code Online (Sandbox Code Playgroud)

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

请注意,每个分支的reflog特定于存储库,因此如果您在克隆上运行log命令,并且您没有拉(例如)一个月,那么立即拉出上个月的所有更改,那么所有上个月的变化都将出现在一个@{1 hour ago}..@{now}范围内.如果您能够在人们推送的"中央"存储库上运行日志命令,那么它可以执行您想要的操作.

  • @hasen j:从技术上讲,你是对的.提交是不可改变的.当您重新定义或修改提交并创建新提交时,通常会从旧提交中复制现有提交消息,作者详细信息和作者日期,因此它是_like_您使用新的提交ID和提交日期更新提交. (2认同)

AA.*_*AA. 14

git diff --stat @{2013-11-01}..@{2013-11-30}
Run Code Online (Sandbox Code Playgroud)

要么

git diff --stat @{2.weeks.ago}..@{last.week}
Run Code Online (Sandbox Code Playgroud)

  • 是的,这完全取决于引用日志。是的,这仅适用于本地复制历史记录,但它是一个方便的命令。 (2认同)

Jak*_*ski 5

也许

$ git format-patch --committer=<who> --since=yesterday --stdout
Run Code Online (Sandbox Code Playgroud)

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