git checkout $(git log -1 --pretty='%h' -- <path>)^ -- <path>
分解
用于git log
查找影响所需文件的最后一次提交
$(git log -1 --pretty='%h' -- <path>)
- 使用仅显示哈希的格式运行
git log
命令。--pretty
- 使用
--
分隔符显式指定文件而不是提交引用。
- 后面是我们要检索的文件的路径和文件名。
- 把所有这些都包装进去,
$()
这样我们就可以像变量一样将它嵌入到另一个 git 命令中。
- 这将返回删除给定文件的提交。
$()
如果您只是想知道该文件何时被删除,这当然可以单独使用- 更改或删除漂亮的格式将为您提供有关它找到的提交的更多信息。
用于检索git checkout
给定提交中的文件
git checkout <ref>^ -- <path>
git checkout
使用提交并指定路径运行。
- 当指定路径时,git 只需在提供的引用处重新创建该路径的状态。
- 通过在引用中添加胡萝卜
^
,我们实际上指向了直接祖先。
- 我们想要直接的祖先,因为我们从日志中获得的提交将没有文件——因为它是删除文件的提交。
将它们放在一起,您就可以在文件被删除之前检查该文件的提交状态。如果您在尚未删除的文件上运行此命令,它将撤消最近对该文件所做的任何更改。
别名
git config --global alias.unrm '!COMMIT=$(git log -1 --pretty='%h' -- "$1"); git checkout $COMMIT^ -- "$1"'
我创建了一个名为 的别名unrm
,就像在 un-remove 中一样。如果你运行上面的命令,从那时起你只需要运行..
git unrm <path>
编辑:我在命令中添加了一些反馈。
git config --global alias.unrm '!COMMIT=$(git log -1 --pretty='%h' -- "$1"); git checkout $COMMIT^ -- "$1"; echo "File: $1, was restored from commit $COMMIT"; git show -s $COMMIT'
现在它会通知您它所做的事情,并向您显示它从中恢复文件的提交。