如何使用git stash检索未跟踪的文件

16

所以我使用了stash命令来储藏一些未被跟踪的文件

git stash --include-untracked

然后切换到另一个分支。

如果我查看被存储的更改:

backend/infinispan-rar/pom.xml                     |   12 ++++++++++--
backend/pom.xml                                    |   13 +++++++++++--
backend/test/pom.xml                               |    3 +--
.../main/resources/com/mojiva/testDbContext.xml    |    6 +++---
data/mojiva.xml                                    |    2 +-
dbmigration/pom.xml                                |   16 ++++++++++------
.../main/resources/db/changelogs/issue-17544.xml   |    4 ++--
pom.xml                                            |   11 +++++++++++

我接着尝试使用以下方法检索这些文件:

git stash pop

并获得这个:

backend/activator/effective.pom already exists, no checkout
backend/adverter/src/test/java/com/mojiva/presenter/RequestParamReplacerTest.java already exists, no checkout
backend/dao/.cpath already exists, no checkout
backend/dao/.e0 already exists, no checkout
backend/dao/PutObjectStoreDirHere/defaultStore/Recovery/TransactionStatusManager/#22#/0_ffffc0a86465_cfd2_5016b5cb_1 already exists, no checkout
backend/dao/dep.tree already exists, no checkout
backend/feeds-test/.e0 already exists, no checkout
backend/feeds-test/dep.tree already exists, no checkout
data/wurfl-patch.xml already exists, no checkout
run/linksDB.log already exists, no checkout
run/linksDB.properties already exists, no checkout
run/linksDB.script already exists, no checkout
Could not restore untracked files from stash

注意到这些文件都不相同了吗?

这里发生了什么?

谢谢!


1
可能是重复的问题:无法将暂存内容应用于工作目录 - Wilfred Hughes
4个回答

12

以下是如何应用使用-a而不是-u创建的暂存的博客:

查找此暂存的提交记录:

git log --graph --all --decorate --oneline

看一下吧

git checkout <sha>

重置父级:

git reset HEAD~1

创建干净的Stash:

git stash -u
你现在可以结账 master 并应用新的存储。

https://blog.tfnico.com/2012/09/git-stash-blooper-could-not-restore.html#!


7
今天我也试了同样的方法,但没有找到有用的帮助。 所以我用了这个技巧:
  • git checkout stash
这将创建一个临时分支。然后你可以在它上面应用stash。
  • git stash apply

  • 手动将所有更改的文件复制到安全位置。

  • 忽略临时分支并检出到原始分支。

  • 将文件粘贴到它们最初的位置。

完成。
这个问题已经很久了。但答案可能会帮助像我一样的人。所以...

3
git stash apply 步骤出现与问题中完全相同的错误提示:无法从存储区恢复未跟踪的文件 - Thierry
对我来说,这并没有解决 already exists, no checkout 问题。我在这里发布了一个可行的解决方案。 - Erik Koopmans
谢谢,在经过几个小时的搜索之后,我找到了解决方法。我的未跟踪文件没有“应用”,而我可以在列表中看到它们。即使查看贮藏中所有文件的内容,也无法显示出来。这是救星,为我节省了几个小时的工作时间。 - GBrooksy

1

Git 2.34解决了另一种导致“无法从存储中恢复未跟踪的文件”的情况:

"git stash"(man),其中试图更改目录为文件(或反之亦然)的临时更改已得到纠正,这在Git 2.34(2021年第四季度)中已得到纠正。

请查看 提交 bee8691, 提交 3d40e37, 提交 4dbf7f3 (2021年9月10日) 由 Elijah Newren (newren) 提交。
(由 Junio C Hamano -- gitster -- 合并于 提交 4a6fd7d, 2021年10月3日)

stash:恢复已跟踪文件后再恢复未跟踪文件

签名:Elijah Newren

如果用户删除一个文件并放置一组未跟踪的文件目录,然后对所有这些更改进行存储,那么在删除相应的文件之前无法恢复未跟踪的文件目录。
因此,在恢复未跟踪的文件之前,先恢复已跟踪文件的更改。

使用者删除未跟踪的文件并添加跟踪文件以取代它时不需要担心任何对应问题。
Git不会跟踪未跟踪的文件,因此将不知道未跟踪的文件被删除,并且因此无法存储该文件的删除操作。


在Git 2.35(2022年第一季度)之前, "git stash apply"(man) 在无法恢复已跟踪更改时,忘记尝试恢复未跟踪的文件。

请看 提交 71cade5(2022年1月4日)由Elijah Newren (newren)提交。
(由Junio C Hamano -- gitster --提交 6e22345中合并,2022年1月10日)

stash: 在还原未跟踪的文件之前不要返回

报告者:AJ Henderson
测试用例作者:Randall S. Becker
签署者:Elijah Newren

提交bee8691(“stash: restore untracked files AFTER restoring tracked files”,2021年9月10日,Git v2.34.0-rc0 -- merge列在批次#10中),我们正确地确定应该先还原跟踪文件的更改,然后再尝试还原未跟踪的文件,并相应地将还原未跟踪文件的代码向下移动了几行。
不幸的是,在介于这些行之间的代码中有一些早期返回语句,这意味着在某些情况下我们突然停止了还原未跟踪的文件。 即使在上一个提交之前,当前代码仍存在另一个可能的问题--在恢复存储库后运行的后处理状态 'git status'(man)在遇到冲突(或其他错误条件)时被跳过,这似乎有点不一致。 通过保存返回状态并在返回之前让其他功能运行来修复这两个问题。

-3

你应该忽略日志和其他不是源代码的文件。无论如何,你可以添加--force来覆盖它们。

在你的情况下发生的事情是,当弹出存储的文件时,它们将尝试覆盖你已经在工作文件夹中拥有的文件。如果你在那里有重要的工作,git会保险起见,不会盲目地覆盖它们。

最好的建议是清理你的设置:

  1. 将不是源代码的文件(如日志文件)添加到你的.gitignore文件中。
  2. 配置文件应该抽象连接字符串,这样每次切换分支或环境时都不会更改(在不同的机器上使用repo)。请参阅progit.org/book中的git属性章节中的smudge/clean脚本。

如果你是新手,请在webchat.freenode.net上保持#git IRC频道开放 :)


我没有看到任何选项可以在git stash pop中使用--force - Thomas David Baker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接