【问题标题】:Git diff of a file compared to a specific date文件与特定日期相比的 Git 差异
【发布时间】:2021-04-23 19:12:48
【问题描述】:

我这样做是为了在新的克隆存储库中获取某个文件的所有更改

git diff HEAD 'HEAD@{2020-01-01 ago}' -- file

但我得到的是warning: Log for 'HEAD' only goes back to,而不是所有的变化。

我做错了什么?

编辑:

感谢所有建议。 我得到了一些不错的结果:git diff $(git rev-list -n1 --until="timestamp" HEAD --) file

【问题讨论】:

标签: git


【解决方案1】:

Marek R's answer 的 TL;DR 版本是 @{date} 语法无法执行您想要的操作;不要尝试将其用于此目的。

evolutionxbox's comment 中的link 涉及一个相当古老的问题,其答案包含您需要的大部分内容,尽管git whatchanged 已被git log --raw 弃用。接受的答案有一个关键概念:--since(和--until,如果你愿意的话)是按日期限制提交的方法。

但您确实也指定了某个文件(使用-- <em>pathspec</em> 选项)。请注意,当将其与 git log 一起使用时,Git 将执行历史简化,这将在遍历 Git 提交图时修剪整个子图。从本质上讲,在遇到合并时,Git 将剪除任何 与文件当前版本匹配的合并分支,除非它占用了合并的所有分支。也就是说,假设我们有:

...--o--o--◎
            \
             M--o--...
            /
...--o--o--●

提交 合并为提交M。在提交M 中,有一个名为file 的文件。该文件同时出现在 中。但是, 中的副本完全匹配M 中的副本,而 中的副本则不同。 git log 命令,在默认历史简化打开的情况下,将跟随此图表的 top 行并完全忽略 bottom 行。

这是因为 Git 认为您正在寻找导致您在提交 M 中看到的文件版本的提交。即:我们如何获得文件的 this 版本?我们得到它是因为提交 M完全忽略了导致出现在提交 中的版本的分支,所以 git log 同样应该忽略该分支。

如果这是你想要的,那就太好了!如果没有,请务必使用额外的git log 选项来控制或破坏历史简化。 (最直接的选项是--full-history,它会按照它说的做。)

【讨论】:

    【解决方案2】:

    Git - gitrevisions Documentation

    @

    @ 单独是HEAD 的快捷方式。

    []@{},例如master@{yesterday}HEAD@{5 minutes ago}

    后缀 @ 的 ref 带有括在大括号对中的日期规范(例如 {yesterday}{1 月 2 周 3 天 1小时 1 秒前}{1979-02-26 18:30:00}) 指定 ref 在先前时间点的值。此后缀只能紧跟在 ref 名称之后使用,并且 ref 必须具有现有日志 ($GIT_DIR/logs/)。请注意,这会在给定时间查找 local 参考的状态;例如,上周您当地的 master 分支中的内容。如果您想查看特定时间的提交,请参阅 --since--until

    请注意,该文档说的是“本地”参考。 基本上,您可以使用此表达式来引用本地存储库中分支的reflog。 Reflog 不与远程存储库共享,因此在克隆期间未下载。

    因此,当您有存储库的新克隆时,您可以使用表达式HEAD@{date},仅当日期在克隆完成后引用。您只能使用在本地存储库上更新特定分支的日期。 这就是你得到这个warning: Log for 'HEAD' only goes back to 的原因,因为新鲜克隆的reflog 只有一个HEAD 条目(克隆日期)。

    基本上你必须通过其他方式引用所需的提交(例如:使用提交的哈希)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-17
      • 2010-12-20
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      • 2012-04-26
      • 2012-02-17
      相关资源
      最近更新 更多