【发布时间】:2012-04-11 19:27:47
【问题描述】:
使用 Git,如何找到当前版本和上一个版本之间的差异?
git diff last version:HEAD
【问题讨论】:
-
如果您使用 GitHub 作为存储库的云位置,这非常简单:导航到您的项目并单击显示您的项目的表格中的标题“commits”
-
真正应该在问题中澄清“当前和最新版本”的含义。
标签: git
使用 Git,如何找到当前版本和上一个版本之间的差异?
git diff last version:HEAD
【问题讨论】:
标签: git
假设“当前版本”是工作目录(未提交的修改),“最后一个版本”是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
我不太明白“最新版本”的含义。
由于可以使用 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
~ 字符而不是 ^。【讨论】:
@ 是 HEAD 的别名。而且由于~ 和^ 在只返回一个提交时是相同的,我发现git diff @~..@ 更容易输入。
git show 更容易,因为@~..@ 是默认显示的内容。
git show 的问题在于,如果HEAD 是一个合并提交,您将不会得到您期望的结果,因为合并提交本身可能没有任何更改。 git diff HEAD^ HEAD 将显示版本之间的实际变化
^ 是转义字符。可以输入^^ 来表示^
你也可以这样做:
与上一次提交比较
git diff --name-status HEAD~1..HEAD
比较当前和之前的两次提交
git diff --name-status HEAD~2..HEAD
【讨论】:
如果您已添加但尚未提交,请使用 cached 标志:
git diff --cached --color
【讨论】:
最后一次提交和最后一次提交之间的差异(加上当前状态,如果有的话):
git diff HEAD~
甚至(更容易输入)
git diff @~
其中@ 是当前分支的HEAD 的同义词,~ 表示“给我提到的修订版的父级”。
【讨论】:
git diff HEAD^(而不是等价的HEAD~形式)。对于像我这样的“老 git”来说,记住它要容易一些 ;-)
~ 和@ 的含义来改进答案。
diff HEAD^ HEAD 的较短语法应该是git diff @^!。对于r1^!,请参阅git-scm.com/docs/gitrevisions
首先,使用“git log”列出存储库的日志。
现在,选择与这两个提交相关的两个提交 ID。您想查看差异(示例 - 最多的提交和一些较旧的提交(根据您对当前版本和一些旧版本的期望))。
接下来,使用:
git diff <commit_id1> <commit_id2>
或
git difftool <commit_id1> <commit_id2>
【讨论】:
快速简单,假设你是大师:
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 次提交之前。
这也适用于标签(如果您需要查看所有更改,请删除下面的“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)
【讨论】:
如果 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
等等……
【讨论】:
在提交中显示个人更改,指向头部。
git show Head~0
在提交中显示累积的更改,指向头部。
git diff Head~0
其中 0 是所需的提交次数。
【讨论】:
如果最新版本表示最后一个标签,当前版本表示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
【讨论】:
如果您想要最后一次n 提交的更改,您可以使用以下内容:
git diff HEAD~n
因此,对于当前提交的最后 5 次提交(包括当前提交的计数),它将是:
git diff HEAD~5
【讨论】: