确定在git中2次提交之间修改的文件
我正在创建一个rake任务,当文件在HEAD和HEAD^1之间更改时,它将在S3中重新上载文件。我应该使用哪个git命令来执行此操作。比较这两个对象的确定在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个字符宽,然后只截断路径 有一件事要
散列对象
有意义吗?您可以使用
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文档。