Answers:
The command is kept primarily for historical reasons; fingers of many people who learned Git long before git log was invented by reading Linux kernel mailing list are trained to type it.
因此,文档鼓励使用git log
而不是git whatchanged
;最后一条命令还使用git log的--no-merge选项,因此它们输出相同的结果。
git whatchanged
从最新的最新版本2.21.0开始不推荐使用。所有git whatchanged
实现的目标都可以实现,git log
并且仅出于历史原因可以保留。查看详细信息git-scm.com/docs/git-whatchanged/2.21.0
先前的建议有一些缺点。基本上,我正在寻找与相等的东西cvs diff -D"1 day ago" -D"2010-02-29 11:11"
。在收集越来越多的信息的同时,我找到了解决方案。
我尝试过的事情:
git whatchanged --since="1 day ago" -p
从这里
但是,即使一个文件中有多个提交,这也会为每个提交提供差异。我知道git中的“ date”有点松散,我认为必须有某种方法可以做到这一点。
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”(除非在某处有记录)。
git rev-list
,这对于解决我所看到的非常相似的问题大有帮助。
git diff 'master@{1 day ago}..master
语法的意思是“检查的引用日志,并找出其中的分支master
用来点在本地资源库 1 day ago
”。具体来说,将不使用当前branch的实际提交历史记录master
。这是您真正想要的东西很少。
“日期”在git中有点宽松。提交的作者日期可能早在某人实际将提交/提交到其存储库中之前的某个时间,而且提交可能会被重新建立基础并更新为明显新的提交之上。
提交还具有提交日期,如果以某种方式对提交进行了重新设置或修改,则提交日期将被更新。这些提交更有可能按照某种时间顺序排列,但是您仍然受提交者的支配,因为他在计算机上设置了正确的时间,即使如此,未经修改的提交也可以无限期地坐在远程存储库中的功能分支上被合并到中央存储库的master分支中。
对您而言,最有用的是特定存储库中的更新日志日期。如果启用了每个分支的刷新日志(请参阅参考资料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命令,那么它可能会做您想要的。
@{time spec}
语法始终引用您的本地reflog。它不引用实际的提交历史记录(DAG)。如果您不了解它们之间的区别,请不要使用此语法!
git diff --stat @{2013-11-01}..@{2013-11-30}
要么
git diff --stat @{2.weeks.ago}..@{last.week}
@{time spec}
语法始终引用您的本地reflog。它不引用实际的提交历史记录(DAG)。如果您不了解它们之间的区别,请不要使用此语法!
也许
$ git format-patch --committer=<who> --since=yesterday --stdout
是您想要的(带有或不带有'--stdout')?
我相信一般的解决方案是使用:
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
在阅读此问答之前,我并不熟悉,但是它给我带来了截然不同的结果,因此我不确定它在做什么。
可以获取自某个日期以来所有更改的差异的另一种简单方法是,简单地找到X
在该日期或之后发生的第一次提交,然后使用
git diff X
这样做的好处是,它不依赖于新克隆中的刷新日志条目,这与
git diff <reference>@{n}..
git log <reference>@{n}..
解决方案
您还可以使用git-format-patch准备补丁(差异)并通过电子邮件发送它们。
使用选项[自]或[修订范围]来指定提交范围。
为了观看分支上Git文件的最新变化,请使用以下公式:
配方:
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
我将以这种方式进行抛出:
git log
因为日期为您提供了当前分支的提交哈希值。然后,我只使用类似的东西git diff 8fgdfg8..565k4l5
,使我可以通过文件汇总适当的差异。希望这会有所帮助,尽管测试不多