1

我有一个关于 git 的项目。我的项目有如下文件:

file1.js
file2.html
file3.js
file4.css
file5.html
file6.jpg
file7.html
file8.js
file9.css

我为所有文件做了一个 git -rm 文件名并提交了它们,直到我剩下

file1.js
file2.html

我需要取回我的 file6.jpg

我如何获得 file6.jpg 所以我的回购将有

file1.js
file2.html
file6.jpg
4

4 回答 4

2
git checkout HEAD~N -- file6.jpg

在哪里存在N的时间提交的数量在哪里file6.jpg

于 2013-04-05T19:04:07.960 回答
1

git checkout可能是单个文件最简单的选项。

  1. 用于git log查看您的提交历史记录。在删除相关文件之前找到提交的哈希值。例如:

    commit 5faff7e3f74c3408985acecd1dbb90feeb7b1d75 <--- "hash"
    Author: Nick Tomlin <myemail@email.com>
    Date:   Fri Apr 5 11:34:03 2013 -0500
    
  2. 然后运行git checkout <hash> path/to/file6.jpg替换<hash>上面的字符串(您通常只需要最后 5 个左右,但为了安全起见,现在让我们全部使用它们。如果您在file6.jpg驻留的目录中,您可以这样做git checkout <hash> file6.jpg

这是一种访问提交的更长形式的方法,可以只使用HEAD~6,但在引用比HEAD~3. 使用相对引用更容易引用错误的提交~,我最终会查看我的日志以找出我需要的确切提交:)。

于 2013-04-05T19:03:48.520 回答
0
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'

现在它会通知您它所做的事情,并向您显示它从中恢复文件的提交。

于 2013-04-06T00:16:32.113 回答
-1

假设 file6.jpg 之前已提交,您可以通过以下方式在 git 存储库中获取 file6.jpg 的所有修订:

git rev-list --objects --all | grep file6.jpg

然后你可以使用恢复文件

git cat-file {sha} > file6.jpg

添加文件并提交。

另请参阅有关如何从 git 存储库获取所有对象的答案:https ://stackoverflow.com/a/7350019

还有这个关于 git 对象内部的网站:http: //git-scm.com/book/en/Git-Internals-Git-Objects

于 2013-04-05T19:05:42.150 回答