确定在git中2次提交之间修改的文件

确定在git中2次提交之间修改的文件,git,version-control,rake,Git,Version Control,Rake,我正在创建一个rake任务,当文件在HEAD和HEAD^1之间更改时,它将在S3中重新上载文件。我应该使用哪个git命令来执行此操作。比较这两个对象的散列对象有意义吗?您可以使用 git log --stat HEAD^..HEAD git diff --quiet HEAD^ HEAD -- <filename> 获取已更改文件的列表。还有其他修饰符,如--raw,可以确保显示完整路径。您还可以使用--stat=200指示日志假定输出为200个字符宽,然后只截断路径 有一件事要

我正在创建一个rake任务,当文件在HEAD和HEAD^1之间更改时,它将在S3中重新上载文件。我应该使用哪个git命令来执行此操作。比较这两个对象的
散列对象
有意义吗?

您可以使用

git log --stat HEAD^..HEAD
git diff --quiet HEAD^ HEAD -- <filename>
获取已更改文件的列表。还有其他修饰符,如
--raw
,可以确保显示完整路径。您还可以使用
--stat=200
指示日志假定输出为200个字符宽,然后只截断路径

有一件事要考虑的是,有时候你不会有一个新的承诺。您必须使用
HEAD@{1}
而不是
HEAD^
来查看上次提交的内容。那么你需要使用

git diff --stat HEAD@{1}..HEAD
HEAD@{1}
被解释为“HEAD指向上次的位置”。所以
HEAD@{2}
的意思是“头在你换两次之前在哪里”。如果您查看
reflog
的文档,将在此处进一步解释

对于脚本,我将使用
--numstat
而不是
--stat
,因为它根本不缩写路径。现在,您可以使用此列表仅移动那些文件或删除任何标记为已删除的文件

您还可以比较每个提交的树对象,在那里您可以递归地看到SHA1的不同之处

要添加,如果在更新钩子中编写此脚本,钩子的参数将为您提供
oldref
newref
以及分支名称,这样您就可以确切地知道分支当前是什么以及它被设置为什么


但这并不理想。如果可以,请尝试覆盖整个工作树,省去您的麻烦。

如果您想检查一个已知文件是否被提交更改,可以使用

git log --stat HEAD^..HEAD
git diff --quiet HEAD^ HEAD -- <filename>
git diff——安静头部^HEAD--
然后检查退出代码以确定其是否已更改,如果已更改,则退出代码将为1如果未更改,则退出代码将为0。使用此方法,您无需解析输出以查看它是否提到您关心的文件


Adam建议使用
HEAD@{1}
而不是
HEAD^
在这种情况下仍然值得考虑。

Hey Adam。。谢谢你的回复。你能详细介绍一下HEAD@{1}吗?这是什么意思?检查reflog文档。