如何查看 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 存储中未跟踪的文件 的相关文章

  • 如何终止当前正在运行的git进程? [复制]

    这个问题在这里已经有答案了 git commit m 45 fatal Unable to create F SoftifyBD Projects proj 4 CMS Latest contentmanagementsystem git
  • Git 子模块在 Windows 上更新缓慢

    Git 子模块在 Windows 上似乎非常慢 为了测试性能 我创建了 3 个裸存储库并向它们提交了 3 条独立消息 未存储文件 然后 我将每个裸存储库作为子模块添加到新的 git 存储库中 并执行子模块更新 花费了 5 秒多的时间 当使用
  • git push origin 分支名总是推送到 master

    我搜索了一下 但似乎找不到答案 在我可以访问的两个盒子上 当我执行 git push dry run origin mytestbranch 时 我得到以下结果 To email protected cdn cgi l email prot
  • 如何列出 Git 1.7+ 中的所有远程分支?

    我试过了git branch r 但这仅列出我在本地跟踪的远程分支 如何找到我没有的列表 命令是否列出对我来说并不重要all远程分支或仅那些未跟踪的分支 For the vast majority 1 of visitors here th
  • Hudson 结帐卡在“git fetch”处

    我正在使用 git 版本 1 6 2 2 1669 g7eaf8 在 Hudson 1 314 上使用 Hudson Git 插件 0 7 3 当我触发构建时 Hudson 执行 git fetch 但它永远不会返回 我把一只卡在那里14天
  • Git ref master 现在为空,如何恢复?

    我不完全确定发生了什么 但由于某种原因 我的 git 存储库的主引用文件现在是空的 我们在 Dropbox 上托管存储库 所以也许与此有关 但现在我无法从中提取 它是这么说的 Your configuration specifies to
  • 如何在 Android Studio 中比较两个 Git 分支?

    我不确定是否可以将主分支 或任何其他分支 与当前功能分支进行比较 例如GIT does 我想要两个分支 主分支和功能分支 之间的差异 以便我可以在合并之前比较差异 我发现 Git UI 对用户不太友好 就像在 AS 中一样 我可以遍历代码并
  • Git 拉回 master 中的提交?

    一位同事 我们称之为亚伦 被指派翻新网站的一部分作为长期项目 他创建了一个新的 Git 分支 名为aaron 他所有的改变都是在这个分支上进行的 当他工作时 我继续维护整个网站 将我的更改提交给master 最终 Aaron 将他的分支合并
  • 由于合并而不允许 git revert 但未给出 -m 选项

    我正在尝试使用 revert 命令恢复到 git 中的某个 哈希 号 我正在使用以下命令 git revert c14609d74eec3ccebafc73fa875ec58445471765 但是 我得到以下返回 错误 提交 c14609
  • Git 中的专有+开源设置? (例如铬/铬)

    您将如何设置一个拥有专有版本和开源版本 例如 Chrome 和 Chromium 的代码存储库 对于 Git 您会使用两个分支还是两个存储库 您如何使 私有 版本与开源版本保持同步 如果是我 我会有两个存储库 这样 您就可以对每个版本拥有不
  • 使用 GIT 自动增加 AssemblyFileVersion

    好吧 我知道这可能不是传统的 但除此之外 我使用 AssemblyFileVersion 作为我的 构建名称 字符串 它的格式如下 File Version information for an assembly consists of t
  • 在两个单独的分支或存储库中管理项目后端和前端?

    我启动了一个移动应用程序项目 该项目将具有服务器端和应用程序本身 所以 在master分支我创建了2个项目myapp server and myapp然后我创建了另外 2 个分支backend and frontend我只想将与它们相对应的
  • Gerrit 安装后无法克隆所有项目存储库

    我有一个新设置的 Gerrit 实例 目前只有两个存储库 所有项目 binutils 测试 尝试克隆所有项目时 我收到以下错误 git clone ssh user hostname 29418 All Projects Initializ
  • 在 git repo 中查找超过 x MB 且 HEAD 中不存在的文件

    我有一个 Git 存储库 用于存储随机的内容 主要是随机脚本 文本文件 我设计的网站等 随着时间的推移 我删除了一些大型二进制文件 通常为 1 5MB 这些文件会增加存储库的大小 而我在修订历史记录中不需要这些文件 基本上我希望能够做到 m
  • 使用 TFS 个人访问令牌克隆 Git 存储库

    我正在尝试以编程方式克隆 git 存储库 我的 ASP NET MVC 应用程序正在创建并启动一个进程 处理进程的代码工作正常 但是当尝试使用本地 TFS PAT 克隆 git 存储库时 身份验证失败 我无法使用 NTLM 或要求用户输入凭
  • 相当于“svn update -r”的 git 是什么?

    我是最近的 git 转换者 能够使用 git svn 将我的分支保留在本地而不干扰 svn 服务器真是太棒了 最新版本的代码中存在一个错误 我想确定一个它起作用的时间 以便我可以使用 git bisect 我找不到正确的命令来及时返回 谢谢
  • 重新打包存储库对于大型二进制文件有用吗?

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

    当我尝试推送本地提交时遇到问题 这可能是在 Android Studio 崩溃时发生的 这是错误 update ref 引用 refs remotes origin master 失败 无法锁定 ref refs remotes origi
  • 如何从 android.googlesource.com 或 github.com 下载单个目录?

    我想下载 https android googlesource com platform frameworks base git master tools aapt https android googlesource com platfo
  • git push heroku master 权限被拒绝

    我正在关注 ruby railstutorial 我运行命令 git push heroku master 它吐出了这个错误 Permission denied publickey fatal Could not read from rem

随机推荐

  • 代码段的时间复杂度

    从在线笔记中 我读到了以下用于反转字符串的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 但幸运的是 在弹出隐藏代码时不会忽略它们 这使得似乎不可