或者只获取在两个日期之间发生的所有提交记录?在SVN中,你可以这样做:
svn diff -r{date}:{date}
做这件事情!我找不到Git的同等方法。
具体而言,我正在考虑编写一个脚本,每天发送包含当天提交的所有代码以及提交者的电子邮件。
之前的建议有一些缺点。基本上,我在寻找与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 diff $(git rev-list -n1 --before="1 day ago" master)
看起来是可行的,并且是一种默认的类似操作的方式,虽然比我想象的要复杂。有趣的是,git-cvsserver并不支持“cvs diff -D”(没有文档说明)。
git rev-list
得到了 "+1" 的评价,它在解决我遇到的非常相似的问题时发挥了很大作用。 - me_andgit diff 'master@{1 day ago}..master
语法的意思是“检查 引用日志 并找出分支 master
在 1 天前
指向 本地仓库 中的位置”。具体来说,它不会使用当前分支 master
的实际提交历史记录。这很少是你真正想要的东西。 - Mikko Rantalainen--before="midnight"
。 - Tomáš Hübelbauer"date"在Git中是一个比较宽泛的概念。一个提交会有一个作者日期,可能在很久以前就被提交到了某个仓库中,然后才被拉取或者提交到另一个仓库中;同时,这个提交可能会被rebase并更新到一个表面上较新的提交之上。
一个提交还有一个提交日期,如果提交被rebase或修改,那么该日期也会随之更新。这些提交更可能处于某种时间顺序,但你仍然要看提交者在他的计算机上设置的时间是否准确;此外,即使提交没有修改,它也可能在远程仓库的一个分支上无限期地坐等,直到被合并到中央仓库的主分支中。
对于你的目的而言,最有用的可能是特定仓库的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}"
这些命令将显示给定代码库分支中出现的所有提交,而不管它们根据作者和提交日期实际上有多“旧”。@{1 hour ago}..@{now}
范围内。如果能够在人们推送到的“中央”代码库上运行日志命令,则可能会达到您想要的效果。@ {time spec}
语法始终是指您本地的reflog,而不是实际的提交历史记录(DAG)。如果你不理解这个区别,请不要使用这个语法! - Mikko Rantalainengit diff --stat @{2013-11-01}..@{2013-11-30}
或git diff --stat @{2.weeks.ago}..@{last.week}
@{time spec}
语法始终指的是您本地的reflog。它不是指实际的提交历史记录(DAG)。如果您不了解差异,请不要使用此语法! - Mikko Rantalainen$ git format-patch --committer=<who> --since=yesterday --stdout
你想要的是这个吗(带或不带'--stdout')?
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
我认为一般的解决方法是使用:
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 log --pretty="format:%H %ai" | grep `date +"%Y-%m-%d"` | awk {'print $1'}`
;·)
该命令主要是出于历史原因而保留的;许多在git log诞生之前通过阅读Linux内核邮件列表学习Git的人都已经习惯了输入它。
因此,文档鼓励使用git log
而不是git whatchanged
;后者也使用了git log
的--no-merge选项,所以它们输出相同的结果。 - Ramsesgit whatchanged
已弃用。所有git whatchanged
所实现的功能都可以使用git log
来实现,而且为了历史原因,仅保留git whatchanged
。详情请参见https://git-scm.com/docs/git-whatchanged/2.21.0。 - Devy