如何查看 Git 存储中未跟踪的文件

2024-03-14

我经常将我完成的工作隐藏在新的(未跟踪的)文件中,并且我希望以后能够找到这项工作。找到它的明显方法似乎是git show.

我刚刚发现Git在我使用时完全省略了这些文件git show(但幸运的是,在弹出隐藏代码时不会忽略它们),这使得似乎不可能可靠地找到隐藏代码。

为了使这个更具体,假设我有

On branch feature/request-reappointment
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   app/models/job.rb
    modified:   config/initializers/environmental_email_interceptor.rb

Untracked files:
  (use "git add <file>..." to include in what will be committed)
    app/models/receipt.rb
    db/migrate/20200130091050_create_receipts.rb

no changes added to commit (use "git add" and/or "git commit -a")

如果我表演

git stash save -u 'miscellaneous improvements'
git show stash@{0}

Git 将忽略未跟踪的文件。这不仅是 Git 在命令行中的行为,而且像 Fork 和 GitKraken 这样的 GUI 工具也有同样的问题,大概是继承自 Git 的。

我怎样才能显示actual藏匿的内容,包括未跟踪的文件?

UPDATE:

尽管 GitKraken 和 Fork 未能显示任何存储中未跟踪的文件,但 Tower 2(旧版本,因为我拒绝切换到他们基于订阅的定价模型)成功了。我必须给予他们一些信任,如果不是因为价格,我今天就会买一本新的。


TL;DR

要查看文件名,请使用git ls-tree -r stash^3;要查看其内容,请使用git show stash^3.

Long

我怎样才能显示actual藏匿的内容,包括未跟踪的文件?

未跟踪的文件通常不在藏匿处。有一个例外,而您正在使用它,所以我稍后会讨论它。但显示这些文件很棘手。使用它们更加困难。这git stash在我看来,前端需要做一些工作。

First, though, it's important to understand how Git works internally. A Git repository is primarily a pair of databases. One—the biggest one, almost always—holds commits and other Git objects. A smaller database holds names: branch names like master, tag names like v2.1, remote-tracking names like origin/master, and so on. Branch names and tag names and the like are specific forms of the general purpose ref or reference. A ref holds a single Git hash ID, most commonly a commit hash ID.1

每个提交本身也可以保存一个或多个先前提交的哈希 ID。这些是parents提交的。对于正常(非存储)提交,​​这些通常形成一个很好的简单链:最后一个提交会记住倒数第二个提交作为其父级。倒数第二次提交会记住its父母——最后一次提交的祖父母——祖父母还记得另一个父母,依此类推。根据定义,具有两个父项的提交是合并提交。

因此,分支名称仅保存我们想说的提交的哈希 ID,这是该分支的最后一次提交。多个名称可以选择相同的哈希 ID,和/或哈希 ID 可以是可达的从某个分支开始,从其尖端提交并向后工作。因此,在 Git 中,提交通常位于多个分支上。

提交本身包含所有(跟踪的)文件的快照。 Git 通过将跟踪的文件写入 Git 来制作它们index然后使用git write-tree,它将文件写入内部树对象,然后是git commit-tree,它使用由以下代码编写的树写入提交对象git write-tree。因此,所有提交都源自索引。并且,根据定义,索引中的任何文件都会被跟踪。所以这让我们有点困惑。


1Branch names and remote-tracking names are required to hold only commit hash IDs; tag names are more flexible.


藏品

The special ref refs/stash, if it exists, points to one commit. That is the stash@{0} commit. (Its reflog entries in stash@{1} on up also point to one commit each.) So the stash, when it exists, consists of commits. These commits are on no branch:2 they're found through refs/stash instead.

一个普通的储藏室有form合并提交,但不是相同的内容。什么git stash所做的是使用非常低级别的进行两次提交git write-tree and git commit-tree方法如上所述。第一次此类提交,基于运行时索引中的内容git stash save or git stash push, 简单:git write-tree已经只写入索引中的任何内容,因此这两个命令放在一起,使该索引提交,我称之为i(以及git stash文档调用I).

第二次提交比较棘手,但本质上是什么git stash确实是运行git add -u(虽然没有实际使用git add -u从而在各个版本中引入错误git stash,其中一些在某些情况下会产生错误的工作树提交)。这会更新索引,以便它保存所有跟踪文件在工作树中的状态。然后git write-tree其次是git commit-tree为您的工作树制作一个很好的快照,当然减去任何未跟踪的文件。

Because git stash使用低级命令,它可以使工作树提交——我称之为w——与它选择的任何一对父母。它使这两个提交i and HEAD作为它的两个父母:

...--o--o   <-- branch (HEAD)
        |\
        i-w

The i提交看起来就像任何普通的提交,并且w提交类似于合并。它实际上并不是合并,它只是添加到索引中的工作树的快照,但它的第一个父级是当前分支的提示提交,第二个父级是提交i.

做好这个藏品后,git stash save does a git reset --hard,以便您的索引和工作树匹配HEAD. The HEAD其本身永远不会移动,未跟踪的文件不会保存且不受影响。

When you do a git stash save -u or git stash save -a, however, Git makes a third commit, which I call u. This third commit uses an index that is cleared of all tracked files, and is then loaded with some or all of your untracked files, as if by git add --force on specific file names.3 The set of files that go into this third commit depends on whether you used -u or -a: -u enumerates untracked files that are not ignored, and -a enumerates all untracked files, even if they are ignored. Git copies those files into the (well, an) index and makes this u commit, with no parent at all, before it makes the final w commit. Then it makes the w commit with u as its third parent:

...--o--o   <-- branch (HEAD)
        |\
        i-w
         /
        u

Thus, w^1是分支顶端的提交,w^2是索引提交i, and w^3 is the u犯罪。w仍然类似于合并提交(这次是章鱼合并),但其快照与任何两次提交存储相同。

做了一个u犯罪,git stash save or git stash push now removes从您的工作树中的所有文件u犯罪。如果某些文件在u也被忽略,它们仍然被删除。

如果 Git 无法提取,应用三提交存储将会失败u提交到您当前的工作树中。所以了解第三个内容绝对有用u犯罪。但没有git stash ____(用动词填空)显示是否提交u甚至存在,更不用说里面有什么了。因此,我们必须求助于较低级别的 Git 命令。

特别是,自从u is a 根提交, git show将其与空树 https://stackoverflow.com/q/9765453/1256452。您可以使用git show --name-only or git ls-tree -r获取文件列表(如果您不需要完整的差异)。到name commit u,我们可以命名任何存储提交——任何w提交指向的对象refs/stash或它的引用日志条目之一 - 并添加^3后缀表示的意思第三父母。如果藏匿处只有w and i, the ^3将失败:没有第三个父母,因此没有什么可显示的。


2You can, if you like, actually get them onto a branch, but the result is ... ugly at best.

3Internally, git stash uses a temporary index instead of the real / main index, to make this easier. It does that for the w commit too. While there is one special index, the index, that tracks your work-tree, you can create a temporary index at any time, put its path name into GIT_INDEX_FILE, and use Git commands with that temporary index instead of using the distinguished index. That's handy for any command that needs to create a commit—which requires using the index—that doesn't want to disturb the index in the process.

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

如何查看 Git 存储中未跟踪的文件 的相关文章

  • 如何仅对最新合并后的提交进行变基?

    考虑以下场景 我从master那里检查了一个分支 我做了一些承诺 我合并了更新的master 我做了更多的承诺 现在我想要从第 4 点开始变基提交 以便从第 2 点开始的提交不受影响 所以如果我最初有 1 2 x x x x x x x m
  • 测量大型源树中的“接近度”

    作为我之前提出的问题的一部分找到两个来源之间的最佳匹配 https stackoverflow com questions 13898659 finding what git commit some code spawned from 其中
  • 将各种提交合并为一而不合并

    是否可以加入各种提交 这是我的情况 我的应用程序在 OSX 10 6 和 10 7 中运行 我已经修复了 10 6 的一些内容 然后提交了 更改为 10 7 并再次修复修复程序 以便它们兼容 然后再次提交 然后返回到 10 6 并再次检查并
  • libgit2 返回:Refspec 'refs/heads/origin/HEAD' 在 TortoiseGit 中未找到错误

    启动 TortoiseGit 时出现此错误 无法获取所有参考文献 libgit2 返回 未找到 Refspec refs heads origin HEAD 虽然很烦人 但这并不妨碍我使用 TortoiseGit 然而 我想让它消失 因为它
  • 包括来自raw.github.com的js

    我有一个 github com 演示页面 链接到https raw github com master file js https raw github com master file js这样我就不需要总是复制 js文件转移到gh pag
  • 为什么我使用某些 git 命令后终端变得无响应?

    我经常 真的每次 使用该命令后git log我的终端对进一步的输入没有响应 这是在 OSX 上 是否有一个我不知道的命令将使终端再次激活 而不是仅仅退出终端并重新开始 您正在使用一个无需滚动即可显示日志的程序 很可能less 可以通过按q
  • 无法使用 Git Bash 对 Visual Studio Team Services 进行身份验证

    由于身份验证失败 我无法对 Visual Studio Team Services VSTS 上的远程存储库运行任何命令 我可以通过 Visual Studio 进行拉取等操作 但只能通过 Visual Studio 不通过 Git Bas
  • 将更改从通用差异导入 git 存储库

    我正在尝试将更改从一个源代码控制系统 专有且复杂 导入到 git 存储库中 我目前正在通过运行一个脚本来执行此操作 该脚本只是按顺序同步到每个修订版并将其提交到 git 存储库 但由于各种原因 这已变得不可行 对于每个修订版 我都可以获得描
  • 禁止 Gerrit 推送到 refs/for/master

    我已经更新了所有项目昨天获得访问权限 人们说他们今天早上无法将更改推送到存储库 当我恢复访问权限后 他们仍然无法将更改推送到存储库 只能clone工作正常 在将更改推送到远程存储库时 它表示 remote rejected HEAD gt
  • ssh:连接到主机 bitbucket.org 端口 22:连接超时

    一切都工作得很好 做了一些git pushes 没有问题 今天我决定将我的框架更新到最新版本 因此它稍微改变了我项目的目录结构 因此 在 Bitbucket 中 我创建了一个新的存储库 dev1 project com 并将我的项目文件夹重
  • 我可以将我的heroku git repo导入bitbucket吗?如何?

    我的笔记本电脑坏了 我需要从另一台计算机上编码 我正在使用 Heroku 我想将最新版本的代码从 Heroku 获取到另一台机器 据我了解 强烈建议使用 GitHub 或 BitBucket 获取适当的远程存储库 我决定尝试一下 BitBu
  • Azure Devops Pipeline YAML 中的 Git 标记名称

    Summary 如何获取 Azure Devops Pipeline YAML 文件中当前 git 标签的名称 我想做什么 我正在 Azure Devops 中设置构建管道 创建新的 git 标签时会触发管道 然后我想构建 docker 镜
  • git 工作目录中的更改拒绝恢复

    我的 git 工作目录中有五个文件git status显示为已修改 当我git diff他们 整个文件显示为已更改 我有core autocrlf true但似乎没有效果 当我试图从同事那里获取更改时 真正的问题出现了 修改 的文件之一会被
  • 从远程获取上个月在 git 分支上提交的文件列表

    我正在尝试获取上个月在 master 分支的 github 存储库上更改的所有文件的列表 我的本地克隆没有可以追溯到那么远的日志 因此当我运行以下命令时 git diff stat 1 month ago 我收到一条警告消息和一小部分更改
  • Git:如何维护项目的两个分支并仅合并共享数据?

    假设我有一个项目的两个分支 IMClient MacOS 和 IMClient Windows 它们的代码仅 比方说 一个目录 main 有所不同 所有其他目录都包含与系统无关的代码并且可以互换 有些工作人员在 Windows 版本上工作
  • 如何设置“阅读文档”以使 Sphinx autodoc 选项发挥作用?

    我的项目不是使用 autodoc 构建的 我遇到了关于我的项目未在 autodoc 中构建的常见问题 https read the docs readthedocs org en latest faq html my project isn
  • 返回到 Github Desktop 中的上一个提交

    我正在尝试使用 GitHub Desktop 即 GUI 应用程序 而不是命令行 返回到先前的提交 在同一分支上 我认为这是一个核心功能 因为它是首先使用源代码控制的主要原因 我可以看到可以恢复提交 但这并不是我真正想要的 因为它创建了一个
  • 从 Eclipse 的历史视图中删除 ORIG_HEAD 和 FETCH_HEAD

    我最近开始使用 Eclipse Kepler 和 EGit 插件 这些分支不是我习惯的 有没有办法永久阻止这些分支的创建 我尝试手动删除它们 但它不起作用 并且我不想在下次获取或变基时保留它们 据我从对您问题的评论中了解到 您只希望这些参考
  • Azure git 部署 - 第二个程序集中缺少引用

    我正在尝试将 Bitbucket 部署设置到 Azure 网站 我成功链接了 Bitbucket 和 Azure 但是当我推送到 Bitbucket 时 我在 Azure 站点上收到以下错误 如果我单击 查看日志 它会显示以下编译错误 D
  • 如何与其他用户共享 bitbucket 存储库?

    我正在使用 Bit 存储桶 并且我想与一位朋友分享我的存储库 我用的是免费的个人账户 似乎有一个选项可以在位桶中创建团队 但它说它将把我的帐户从个人帐户转换为团队帐户 我不要那个 我如何授予其他用户访问此存储库的权限 有一个共享链接选项 如

随机推荐

  • 代码段的时间复杂度

    从在线笔记中 我读到了以下用于反转字符串的java代码片段 据称该代码片段具有二次时间复杂度 在我看来 i 的 for 循环只是迭代 s 的整个长度 它如何导致二次时间复杂度 public static String reverse Str
  • 将项目上传到 Azure Devops

    我正在尝试将现有的 Visual Studio 项目代码推送到 Azure DevOps 服务器 第一次 所有教程都从在 AzureDevops 上创建一个新项目开始 然后克隆到 Visual Studio 谁能告诉我如何将现有项目推送到服
  • Apache Shiro EhCache初始化异常:同一VM中已存在另一个未命名的CacheManager

    我正在尝试将 EhCache 配置为处理启用 Apache Shiro 的 Web 服务中的授权缓存 目前我收到以下异常 org apache shiro cache CacheException net sf ehcache CacheE
  • Android 应用内结算返回服务器响应代码 2。这是什么意思?

    我正在使用应用内结算 V3 当我尝试购买时 我收到服务器响应代码 2 我已经搜索过 但找不到有关此响应代码含义的文档 如果你看官方的话应用内结算参考 IAB 版本 3 http developer android com google pl
  • 从 Git 子模块存储库导入 React 组件

    我有一个用 React 开发的父存储库 其中有一个子子模块 也是由 React 开发的 项目文件夹结构如下所示 parent git nodemodule src subModules childProject git src js x j
  • 在 ANTLR 3 中,如何在运行时而不是提前生成词法分析器(和解析器)?

    我想在运行时生成 antlr 词法分析器 也就是说 生成语法并从语法生成词法分析器类及其在运行时的支持位 我很高兴将它输入到 java 编译器中 它可以在运行时访问 这是一种快速但肮脏的方法 生成一个combined ANTLR 语法 g给
  • 与单进程场景​​相比,多进程场景中的访问时间意外缩短

    我正在从program1访问共享库 共享数组数据结构 并找到读取该数组的所有元素的访问时间 当只有 Program1 单独执行时 我得到了大约 17000 个时钟周期 现在 当我首先在另一个选项卡中执行program2 具有空的while循
  • 使用 Travis-CI 推送 Git 存储库

    我想每次推送到主服务器时都执行一个脚本 该脚本将创建一些我想要提交和推送的文件 Travis 构建的日志似乎正在添加文件 提交和推送 但没有任何反应 我的 travis yml 是这样的 before install openssl aes
  • 通过交集和并集组合 NSArray

    我有两个 NSArrays A 和 B 它们共享一些共同的元素 例如 A 1 2 3 4 5 B 4 5 6 7 我想创建一个新的 NSArray 其中包含两个 NSArray 之间常见的内容 并与第二个 NSArray 的内容相连接 同时
  • 如何在.net core 2启动时访问IConfigurationRoot?

    我写了一个自定义ConfigurationProvider与实体框架 因为我还想让它在运行时可更新 所以我创建了一个IWritableableOption https stackoverflow com a 42705862 2441442
  • 批处理文件双击可以正常运行,但无法在 Windows 计划任务中运行

    我的 C 驱动器上有一个 archive pst 文件 我在 Outlook 中使用它来备份我的电子邮件 但我的C 不是每晚都备份的 因此 我想将 pst 文件复制到我的网络驱动器 以便持续备份 出于多种原因 我不希望 Outlook 直接
  • 为什么用于标点符号的 R gsub (或 regexp)不能获取所有标点符号?

    我正在清理基于文本的数据文件 但无法弄清楚为什么gsub punct X1 没有给出所有标点符号的匹配 不幸的是 我无法在这里复制这个问题 这让我认为这是一个字符编码问题 有问题的标点符号的外观与标准 ASCII 明显不同 这是我读入文件后
  • 在 Python 中生成一周中的日期?

    我需要从一个日期生成一周的星期一的日期 例如 2015 10 22 并生成接下来几天的日期 星期一 星期二 星期三 星期四 星期五 星期六 星期日 Java 示例 初始日期 2015 10 22 周一 date set Calendar D
  • 在 Spring Security 中传播 AccessDeniedException

    在我的 Web 应用程序中 我使用 Spring Security 和 Spring MVC 我已经使用了几种方法 Secured注释并以这样一种方式配置 Spring Security 当没有适当角色的情况下访问其中一个方法时 用户将被带
  • 获取 magento 商店列表

    如何获取 Magento 网站下的商店组列表 然后获取该商店组中的商店列表 尝试这样直接获取对象 Mage app gt getWebsites lt in file gt app code core Mage Core Model App
  • iOS 5、xcode 4.2、故事板中的主页按钮

    iOS 5 0 代码 4 2 我正在做一份多步骤调查问卷 每个分支大约有10个问题 并且还有子分支 但逻辑是相当线性的 大多数是 否答案 但也有一些多选选项 调查问卷将得出结论页 在此结论页面上 我想要一个显示 HOME 的按钮 这会将用户
  • 作为本地化字符串的字符串常量

    我想本地化我的常量 常量按通常的方式定义和声明 extern NSString const kStringName NSString const kStringName Whatever 如何使其可本地化 这根本行不通 NString co
  • NOCHECK 不禁用外键引用

    表创建脚本 CREATE TABLE dbo details id int NULL details varchar max NULL CREATE TABLE dbo name id int IDENTITY 1 1 NOT FOR RE
  • 如何自动更新 Subversion 工作副本?

    有谁知道我如何自动运行svn update 如果有人有脚本或类似的东西 你能给我举个例子吗 我正在使用 TortoiseSVN 在生产服务器上 我有一个运行以下批处理文件的计划任务 CD C Program Files TortoiseSV
  • 如何查看 Git 存储中未跟踪的文件

    我经常将我完成的工作隐藏在新的 未跟踪的 文件中 并且我希望以后能够找到这项工作 找到它的明显方法似乎是git show 我刚刚发现Git在我使用时完全省略了这些文件git show 但幸运的是 在弹出隐藏代码时不会忽略它们 这使得似乎不可