如何从 Git 中的特定修订版检索单个文件?

2024-02-05

我有一个 Git 存储库,我想看看一些文件几个月前的样子。我在那个日期找到了修订版;它是27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8。我需要查看一个文件的样子,并将其另存为(“新”)文件。

我设法使用查看该文件gitk,但它没有保存它的选项。我尝试使用命令行工具,最接近的是:

git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt

但是,此命令显示差异,而不是文件内容。我知道我以后可以使用类似的东西PAGER=cat并将输出重定向到文件,但我不知道如何获取实际的文件内容。

基本上,我正在寻找类似的东西svn cat.


Using git show

为了完成你自己的答案,语法确实是

git show object
git show $REV:$FILE
git show somebranch:from/the/root/myfile.txt
git show HEAD^^^:test/test.py

该命令采用通常的修订风格,这意味着您可以使用以下任意命令:

  1. 分支名称(如建议 https://stackoverflow.com/review/suggested-edits/3041393 by ash https://stackoverflow.com/users/17708/ash)
  2. HEAD+ x 数量^人物
  3. 给定修订版的 SHA1 哈希值
  4. 给定 SHA1 哈希值的前几个(可能是 5)个字符

Tip重要的是要记住,当使用“git show", 始终指定存储库根目录的路径,不是您当前的目录位置。

(虽然迈克·莫尔蒂 https://stackoverflow.com/users/179675/mike-morearty提到,至少在 git 1.7.5.4 中,您可以通过输入“来指定相对路径”./" 在路径的开头。例如:

git show HEAD^^:./test.py

)

Using git restore

使用 Git 2.23+(2019 年 8 月),您还可以使用git restore https://git-scm.com/docs/git-restore它取代了令人困惑的git checkout command https://stackoverflow.com/a/57066202/6309

git restore -s <SHA1>     -- afile
git restore -s somebranch -- afile

这将仅在工作树上恢复存在于“来源” (-s)提交 SHA1 或分支somebranch.
还要恢复索引:

git restore -s <SHA1> -SW -- afile

(-SW: 短缺--staged --worktree)


如中所述评论 https://stackoverflow.com/questions/610208/how-to-retrieve-a-single-file-from-a-specific-revision-in-git/610315#comment120557219_610315 by 星球大战 https://stackoverflow.com/users/3249197/starwarswii

它允许您将内容通过管道传输到文件中,如果您只想快速比较提交中的文件,这非常有用。

例如。你可以做:

git show 1234:path/to/file.txt > new.txt 
git show 1234~:path/to/file.txt > old.txt

然后比较它们。


使用低级 git 管道命令

在 git1.5.x 之前,这是通过一些管道完成的:

git ls-tree <rev>
显示提交中一个或多个“blob”对象的列表

git cat-file blob <file-SHA1>
cat 文件,因为它已在特定修订版中提交(类似于 svn 猫)。 使用git ls-tree检索给定文件 sha1 的值

git cat-file -p $(git-ls-tree $REV $file | cut -d " " -f 3 | cut -f 1)::

git-ls-tree列出对象 ID$file修订中$REV,这被从输出中删除并用作参数git-cat-file,这实际上应该被称为git-cat-object,然后简单地将该对象转储到stdout.


注意:从 Git 2.11(2016 年第 4 季度)开始,您可以将内容过滤器应用于git cat-file output.

See commit 3214594 https://github.com/git/git/commit/321459439e19517c412cab1cfbb64a2749f272c9, commit 7bcf341 https://github.com/git/git/commit/7bcf341453572a227036afec76bdab451b798870 (09 Sep 2016), commit 7bcf341 https://github.com/git/git/commit/7bcf341453572a227036afec76bdab451b798870 (09 Sep 2016), and commit b9e62f6 https://github.com/git/git/commit/b9e62f60115c75c5be5de593862925c8b8d7e683, commit 16dcc29 https://github.com/git/git/commit/16dcc2992b80d30f99c41fd7cc858e9d1c9dbca3 (24 Aug 2016) by Johannes Schindelin (dscho) https://github.com/dscho.
(Merged by Junio C Hamano -- gitster -- https://github.com/gitster in commit 7889ed2 https://github.com/git/git/commit/7889ed25ac709624446b0b4d887dd3633e81f44a, 21 Sep 2016)

git config diff.txt.textconv "tr A-Za-z N-ZA-Mn-za-m <"
git cat-file --textconv --batch

Note: "git cat-file --textconv最近(2017 年)开始出现段错误,该问题已在 Git 2.15(2017 年第 4 季度)中得到纠正

See commit cc0ea7c https://github.com/git/git/commit/cc0ea7c9e5c3d3bf9623415737b595c9d26b9b6d (21 Sep 2017) by Jeff King (peff) https://github.com/peff.
(Merged by Junio C Hamano -- gitster -- https://github.com/gitster in commit bfbc2fc https://github.com/git/git/commit/bfbc2fccfdff0fe189337de67e16fc132b8ee2a5, 28 Sep 2017)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 Git 中的特定修订版检索单个文件? 的相关文章

  • git diff 在尖括号中显示 unicode 符号

    我有一个带有 unicode 符号 俄语文本 的文件 当我修复一些拼写错误时 我使用git diff color words 看看我所做的改变 如果是 unicode 西里尔文 符号 尖括号会造成一些混乱 如下所示 cat p1 cat p
  • 重新打包存储库对于大型二进制文件有用吗?

    我正在尝试将大量历史记录从 Perforce 转换为 Git 并且一个文件夹 现在是 git 分支 包含大量大型二进制文件 我的问题是运行时内存不足git gc aggressive 我的主要问题是重新打包存储库是否可能对大型二进制文件产生
  • SSH 到 Openshift 服务器失败

    我正在 openshift 服务器上使用 jboss catridge 我希望与其他人共享此实例并添加其他用户的公钥 id rsa pub 当其他人尝试访问该实例时 他会收到以下错误 我在他的实例中尝试了同样的方法 但看到了同样的错误 与
  • IntelliJ:查看本地和 git 提交/分支之间所有已更改文件的差异

    使用 IntelliJ 的 diff 查看器是检查代码的一种非常好的方法 因为您可以使用 IntelliJ 代码编辑器的所有功能 重构 完成等 在本地版本中进行更改 不幸的是 我还没有弄清楚当你在 IntelliJ 中进行代码审查时如何做最
  • 代表 Git 存储库的数学结构是什么

    我正在学习 Git 如果我能描述一下代表 Git 存储库的数学结构 那就太好了 例如 它是一个有向无环图 它的节点代表提交 它的节点有代表分支等的标签 每个节点最多一个标签 没有标签使用两次 我知道这个描述不正确 我只是想解释我正在寻找的内
  • 如何从 android.googlesource.com 或 github.com 下载单个目录?

    我想下载 https android googlesource com platform frameworks base git master tools aapt https android googlesource com platfo
  • 在 github 上的 fork 中跟踪上游的最佳实践

    摘要 对于要维护一组本地更改的上游存储库 处理长期运行跟踪的最佳实践是什么 我想让 github 上的 fork 与上游保持同步 但仍然允许清晰跟踪 fork 特有的更改 对于本次讨论 假设upstream指向主项目存储库并且origin指
  • 有没有办法让 git flow 显示它在幕后执行的命令?

    有什么方法可以让 git flow 提前告诉我当我执行 flow 命令时它将执行的确切 git 命令吗 或者告诉我它是东吗 我只能看到输出和摘要吗 你可以使用Git的GIT TRACE 环境变量 http git scm com docs
  • 格里特:! [远程拒绝] HEAD -> refs/publish/master (没有新的更改)

    我做了一些更改 提交了它们并将分支推送到 Gerrit git push gerrit 现在我的更改没有出现在 Gerrit 中 我认为这是因为我手动推送更改而不是使用git 审查 https github com openstack in
  • 第一次使用node.js - “ReferenceError:节点未定义”

    我刚刚安装了node js 我尝试编写应该检查版本的node v 但它不起作用 这是输出 gt node v ReferenceError node is not defined at repl 1 2 at REPLServer self
  • Ansible bitbucket 克隆存储库配置 ssh 错误

    我之前发布过这个问题 但那里的答案不再有效 总之 当使用 Ansible 配置我的 vagrant box 时 在尝试使用 ssh 克隆我的 bitbucket 私有存储库时 我遇到了一个神秘的错误 该错误指出 权限被拒绝 公钥 然而 如果
  • 在 Windows 7 上的 Sourcetree 中比较 Word docx 文件

    我一直在尝试获取在 Windows 7 上的 Sourcetree 中工作的 Word docx 文件的文本差异 我已按照此处的说明进行操作将 Microsoft Word 与 git 结合使用 http blog martinfenner
  • 如何在 macOS 上将 Git 升级到最新版本?

    我刚刚购买了一台装有 OS X Lion 的新 Mac 我在终端中检查了默认安装的 git 版本 我得到了答案 git version gt git version 1 7 5 4 我想将 git 升级到最新版本 1 7 8 3 因此我下载
  • 如何让 Aptana Studio 记住 git ssh 密码

    我找不到任何有关如何获得 Aptana Studio 的内置 git 支持来记住执行推 拉操作的 ssh 密码的指南 信息 有人有什么想法吗 Aptana Studio 实际上是内置的 GIT 程序 它将在 Windows 上的 C Use
  • Git - 如何将整个目录恢复到特定提交(删除任何添加的文件)

    我想恢复 git 中的目录 恢复其中的所有文件 并删除自该提交以来添加的所有文件 进行结账似乎只能满足我的第一个要求 但不会删除任何文件 我想出了最简单的解决方案 git rm path to dir git checkout
  • Git 更改丢失 - 为什么?

    我们的开发团队正在使用 git 最近我们至少两次丢失了文件更改 我们正在使用私人 Github 存储库 在当前情况下 我们可以返回 Github 上的日志并查看我对文件所做的一些更新 后来 另一位团队成员更改了文件的不同部分 它似乎破坏了我
  • 仅使用 Git grep 的文件名

    我只想查看文本中包含特定单词的不同文件 current directory git grep word 显示文件中具有匹配单词的每一行 所以我尝试了这个 current directory git grep word files with
  • 使用 gitignore 嵌套存储库。

    我想嵌套 2 个 git 存储库 我一直在阅读子模块 有一段时间我认为它很棒 我想我可能想要其他东西 这是我的情况 首先 我想我应该提到我的所有服务器都托管网站 并以 staging domain com 和 domain com 实时 模
  • git merge 冲突的不同场景

    我试图了解 git 合并后可能发生 git 冲突的情况以及如何避免它们 我创建了一个 git 存储库并向其中添加了一个文本文件 我已将 1 添加到文本文件中并将其提交给 master 我已经从 master 创建了一个新分支 分支 2 并将
  • 有没有一个简单的命令可以将分支转换为标签?

    我即将完成将 哑快照 转换为 git 的繁琐过程 这个过程进展得非常顺利 感谢这个重命名过程 https stackoverflow com questions 6628539 how to tell git that its the sa

随机推荐