查找当前版本和上一个版本之间的差异
Posted
技术标签:
【中文标题】查找当前版本和上一个版本之间的差异【英文标题】:Finding diff between current and last version 【发布时间】:2012-04-11 19:27:47 【问题描述】:使用 Git,如何找到当前版本和上一个版本之间的差异?
git diff last version:HEAD
【问题讨论】:
如果您使用 GitHub 作为存储库的云位置,这非常简单:导航到您的项目并单击显示您的项目的表格中的标题“commits” 真正应该在问题中澄清“当前和最新版本”的含义。 【参考方案1】:假设“当前版本”是工作目录(未提交的修改),“最后一个版本”是HEAD
(当前分支的最后提交修改),只需这样做
git diff HEAD
以下内容归功于用户 Cerran
。
如果你在提交时总是使用-a
跳过暂存区,那么你可以简单地使用git diff
。
总结
git diff
显示未分阶段的更改。
git diff --cached
显示阶段性更改。
git diff HEAD
显示所有更改(分阶段和未分阶段)。
来源:git-diff(1) 手册页 - Cerran
【讨论】:
如果你在提交时总是用-a
跳过暂存区,那么你可以简单地使用git diff
。 git diff
显示 unstaged 更改。 git diff --cached
显示分阶段的变化。 git diff HEAD
显示所有 更改(分阶段和未分阶段)。来源:git-diff(1) Manual Page
git中“当前未暂存版本”的名称是什么?真的有名字吗?【参考方案2】:
我不太明白“最新版本”的含义。
由于可以使用 HEAD^ 访问上一个提交,我认为您正在寻找类似的内容:
git diff HEAD^ HEAD
这也可以申请 :commithash
git diff $commithash^ $commithash
从 Git 1.8.5 开始,@
是 HEAD
的别名,因此您可以使用:
git diff @~..@
以下也将起作用:
git show
如果您想知道 head 和任何可以使用的提交之间的差异:
git diff commit_id HEAD
这将启动您的视觉差异工具(如果已配置):
git difftool HEAD^ HEAD
由于与 HEAD 的比较是默认设置,因此您可以省略它(正如 Orient 所指出的那样):
git diff @^
git diff HEAD^
git diff commit_id
警告
@ScottF 和@Panzercrisis 在 cmets 中解释说,在 Windows 上必须使用~
字符而不是 ^
。
【讨论】:
我想要提交版本和之前的版本...git diff head head-1 从 Git 1.8.5 开始,@
是 HEAD
的别名。而且由于~
和^
在只返回一个提交时是相同的,我发现git diff @~..@
更容易输入。
@Andrew git show
更容易,因为@~..@
是默认显示的内容。
git show
的问题在于,如果HEAD
是一个合并提交,您将不会得到您期望的结果,因为合并提交本身可能没有任何更改。 git diff HEAD^ HEAD
将显示版本之间的实际变化
备注:对于 Windows 命令提示符,^
是转义字符。可以输入^^
来表示^
【参考方案3】:
你也可以这样做:
与上一次提交比较
git diff --name-status HEAD~1..HEAD
比较当前和之前的两次提交
git diff --name-status HEAD~2..HEAD
【讨论】:
【参考方案4】:如果您已添加但尚未提交,请使用 cached
标志:
git diff --cached --color
【讨论】:
这正是我发现这个问题时所寻找的。谢谢!【参考方案5】:最后一次提交和最后一次提交之间的差异(加上当前状态,如果有的话):
git diff HEAD~
甚至(更容易输入)
git diff @~
其中@
是当前分支的HEAD
的同义词,~
表示“给我提到的修订版的父级”。
【讨论】:
我很喜欢git diff HEAD^
(而不是等价的HEAD~
形式)。对于像我这样的“老 git”来说,记住它要容易一些 ;-)
胡萝卜在某些终端中是个问题。很高兴有这个选项
可以通过解释~
和@
的含义来改进答案。
如果我们只想检查上次提交中提交的内容,请不要使用它(因为脏更改会影响差异)。真正diff HEAD^ HEAD
的较短语法应该是git diff @^!
。对于r1^!
,请参阅git-scm.com/docs/gitrevisions
@JohnnyWong 谢谢你的澄清。我提到“当前状态”是为了不让读者感到困惑。【参考方案6】:
正如amalloy 在comment 中指出的那样,如果“当前和最后一个版本”是指最后一次提交和之前的提交,你可以简单地使用
git show
【讨论】:
使用git show HEAD~1
显示最后一个提交,使用git show HEAD~2
等显示较旧的提交。通过git show HEAD~2 my_file
仅显示一个文件。【参考方案7】:
首先,使用“git log
”列出存储库的日志。
现在,选择与这两个提交相关的两个提交 ID。您想查看差异(示例 - 最多的提交和一些较旧的提交(根据您对当前版本和一些旧版本的期望))。
接下来,使用:
git diff <commit_id1> <commit_id2>
或
git difftool <commit_id1> <commit_id2>
【讨论】:
【参考方案8】:快速简单,假设你是大师:
git diff (checkout_id):file.txt file.txt
例子:
git diff asdfioei91819280din198:file.txt file.txt
【讨论】:
请注意,在(checkout_id):
之后,您需要从 repo 的根目录到文件名的相对路径。对我来说,我从文件所在的目录尝试了上述操作,但失败了,直到我将其更改为 git diff 3d44feb544150cf35b2a99d5917e294e10596f8e:./file.txt file.txt
此外,OP 的初衷尚不清楚,但如果您想要“当前版本和上一个版本之间的差异”的文件。我最初尝试过git diff HEAD~1 -- file.txt
,但没有成功,因为对该文件的最后一次更改是在 10 次提交之前。【参考方案9】:
我将Bitbucket 与安装了Eclipse EGit 插件的Eclipse IDE 一起使用。
我比较文件历史的任何版本(如SVN)。
菜单项目资源管理器 → 文件 → 右键单击 → 团队 → 在历史中显示。
这将带来该文件所有更改的历史记录。 现在Ctrl点击并选择任意两个版本→“相互比较”。
【讨论】:
【参考方案10】:这也适用于标签(如果您需要查看所有更改,请删除下面的“uniq”和其他部分):
git diff v1.58 HEAD
以下内容相同,这可能对 continuous integration (CI) 用于单体存储库中的微服务有用:
git diff v1.58 HEAD --name-only | sort -u | awk 'BEGIN FS="/" print $1' | uniq
<Folder Name>
(信用 - https://dzone.com/articles/build-test-and-deploy-apps-independently-from-a-mo)
【讨论】:
【参考方案11】:如果 HEAD 指向顶部提交,那么您可以执行以下操作:
commit1 -> HEAD
commit2 -> HEAD~1
commit3 -> HEAD~2
第一次和第二次提交的区别:
git diff HEAD~1 HEAD
第一次和第三次提交的区别:
git diff HEAD~2 HEAD
第二次和第三次提交的区别:
git diff HEAD~2 HEAD~1
等等……
【讨论】:
【参考方案12】:在提交中显示个人更改,指向头部。
git show Head~0
在提交中显示累积的更改,指向头部。
git diff Head~0
其中 0 是所需的提交次数。
【讨论】:
【参考方案13】:如果最新版本表示最后一个标签,当前版本表示HEAD(当前状态),它只是与最后一个标签的差异:
寻找tags:
$ git tag --list
...
v20.11.23.4
v20.11.25.1
v20.11.25.2
v20.11.25.351
最后一个标签是:
$ git tag --list | tail -n 1
v20.11.25.351
把它放在一起:
tag=$(git tag --list | tail -n 1)
git diff $tag
【讨论】:
【参考方案14】:如果您想要最后一次n
提交的更改,您可以使用以下内容:
git diff HEAD~n
因此,对于当前提交的最后 5 次提交(包括当前提交的计数),它将是:
git diff HEAD~5
【讨论】:
以上是关于查找当前版本和上一个版本之间的差异的主要内容,如果未能解决你的问题,请参考以下文章
在每个当前行和上一行 BigQuery 之间查找 MAX、AVG
当前行和上一行之间的秒数差异,并使用 google bigquery 将值存储在单独的列中