ChatGPT解决这个技术问题 Extra ChatGPT

您如何存储未跟踪的文件?

我对一个文件进行了更改,加上一个新文件,并希望在切换到另一个任务时使用 git stash 将它们收起来。但是 git stash 本身只存储对现有文件的更改;新文件保留在我的工作树中,使我未来的工作变得混乱。如何存储这个未跟踪的文件?

请注意,如果您的存储中只有未跟踪的文件,它将看起来像是一个空文件,因为 git stash show 不返回任何内容,您可能会想删除它(就像我刚刚在它包含我编写的有用脚本时所做的那样几个月前 → how to recover a dropped stash)

N
Neuron

要存储您的工作目录,包括未跟踪的文件(尤其是 .gitignore 中的文件),您可能需要使用此 cmd:

git stash --include-untracked

或者,您可以使用简写 -u 而不是 --include-untracked,或者简单地使用 git stash --all 来存储所有文件,包括 untrackedignored 文件。这种行为在 2018 年发生了变化,因此请确保您的 git 是最新的。

警告:似乎存在(或曾经存在)被忽略目录的内容可能被永久删除的情况。 See this archived website for more information


为什么即使这些更改尚未暂存,stash 仍会存储更改的现有文件?
@alan-christensen 阅读 kernel.org/pub/software/scm/git/docs/git-stash.html 的描述。关键是在存储后有一个干净的工作树。
@Kelvin我在评论中的意思是它不会存储新文件,除非它们已经被暂存,但是即使它们没有被暂存,它也会存储现有文件。对我来说似乎不一致。
@AlanChristensen 的重点是存储可能被不同分支的结帐覆盖的东西。
由于您在此处获得最佳答案,因此出于两个原因,我会要求您在答案中的 git stash --all 之前列出 git stash --include-untracked。首先,它现在在 2019 年更好地回答了 OP 的问题,其次是因为 --all 做了大多数用户可能不想要的事情,因为它删除了所有 .gitignored 的文件
v
vallentin

从 git 1.7.7 开始,git stash 接受 --include-untracked 选项(或简写 -u)。要在存储中包含未跟踪的文件,请使用以下任一命令:

git stash --include-untracked
# or
git stash -u

警告,如果您的 gitignore 文件中有任何目录/条目,这样做将永久删除您的文件。*


酷 - 它最终按照手册页中的描述工作。不存储(和清理)新文件是一种破坏行为。
我的 git 版本是 1.9.1,即使我在 .gitignore 中的内容看起来像 ignoredDirectory 而不是 ignoredDirectory/*,它仍然会删除那些未跟踪的。甚至未跟踪的文件也不仅仅是目录。
你能解释一下这个警告吗?为什么要删除这些文件?它会删除它们而不是隐藏它们吗?我使用 Git 已经有一段时间了,还没有遇到这个问题。
警告是否也适用于 *.extension 条目?
@aleksandr-dubinsky,@arekolek - git 1.8.3 -u (--include-untracked) 选项可以存储和弹出未跟踪的文件,但 git stash show 不会列出存储中的未跟踪文件
s
skiphoppy

将文件添加到索引中:

git add path/to/untracked-file
git stash

索引的全部内容,加上对现有文件的任何未暂存的更改,都会将其放入存储中。


如果您不想隐藏索引中已经存在的更改怎么办?仍然可以存储新文件吗?
提交索引,存储新文件,然后恢复提交和/或从提交中签出文件。这是一个笨拙的解决方案,但它应该可以工作。
git add . 出于某种原因没有考虑到它
更好的答案,因为 --include-untracked 将拾取所有内容,尤其是隐藏目录;像 node_modules.pytest_cache 以及任何不在 .gitignore 中的东西。
@Eggon 在您弹出/应用隐藏的更改后,git reset 将清除对索引的更改,但将它们留在工作树中,因为默认模式是 --mixed
v
vallentin

在 git bash 中,隐藏未跟踪文件是通过使用命令实现的

git stash --include-untracked
# or
git stash -u

http://git-scm.com/docs/git-stash

git stash 从您的工作区中删除任何未跟踪或未提交的文件。您可以使用以下命令恢复 git stash

git stash pop

这会将文件放回本地工作区。

我的经验

我必须对我的 gitIgnore 文件进行修改,以避免将 .classpath 和 .project 文件移动到远程仓库中。到目前为止,我不允许在远程仓库中移动这个修改后的 .gitIgnore。

.classpath 和 .project 文件对于 eclipse 很重要——这是我的 java 编辑器。

我首先有选择地添加了我的其余文件并提交暂存。但是,除非修改后的 .gitIgnore 文件和未跟踪的文件,否则无法执行最终推送。 .project 和 .classpath 没有被隐藏。

我用了

git stash

用于存储修改后的 .gitIgnore 文件。

对于存储 .classpath 和 .project 文件,我使用了

git stash --include-untracked

它从我的工作区中删除了文件。缺少这些文件会剥夺我在 Eclipse 中处理工作位置的能力。我继续完成将提交的文件推送到远程的过程。成功完成后,我使用

git stash pop

这将相同的文件粘贴回我的工作区。这让我有能力在 Eclipse 中处理同一个项目。希望这能消除误解。


为什么不对 IDE 文件使用全局 gitignore? IE。使用 ~/.gitignore
这很好用,我遇到的唯一问题是 git stash show 只列出了修改过的文件,而不是未跟踪的文件......最初,我认为我失去了很多工作......
u
user1012513

在 git 版本 2.8.1 上:以下对我有用。

将已修改和未跟踪的文件保存在没有名称的存储中

git stash save -u

使用名称将已修改和未跟踪的文件保存在 stash 中

git stash save -u <name_of_stash>

您可以使用 pop 或稍后应用,如下所示。

git stash pop

git stash apply stash@{0}

这并没有从我的计算机中删除未跟踪的文件,尽管它们不再被列为未跟踪。 git stash show 没有显示。当我尝试 git stash apply 时,我收到“错误:无法从存储中恢复未跟踪的文件”。但是,这些文件随后再次被列为未跟踪,但未恢复对已跟踪文件的更改。我认为这些文件可以通过将它们从存储库中检出来单独恢复,但这个解决方案并不是我所希望的。
你看到这个问题的标题了吗?它是“您如何存储未跟踪的文件?”。我不明白,你想在这里做什么。上面的答案对这个问题非常清楚。您需要使用 git stash show -p stash@{0} 以补丁形式查看最新的存储。
user1012513,我想你的最后一条评论是写给我的。出于上述原因,我支持评论。我尝试 git stash apply 时出错。请注意,添加 stash@{0} 仅告诉 git 您正在尝试应用最近的存储,这在省略时是隐含的,因此没有必要。也许自 2018 年以来发生了一些变化,或者我的情况有所不同,但我认为人们应该了解我的经历,因为这对我来说是出乎意料的。这并不意味着您的解决方案对某些人没有用。
l
lindes

正如其他地方所说,答案是 git add 文件。例如:

git add path/to/untracked-file
git stash

但是,另一个答案中也提出了这个问题:如果您真的不想添加文件怎么办?好吧,据我所知,你必须这样做。以下将不起作用:

git add -N path/to/untracked/file     # note: -N is short for --intent-to-add
git stash

这将失败,如下所示:

path/to/untracked-file: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state

所以,你可以做什么?好吧,您必须真正添加文件,然而,您可以稍后使用 git rm --cached 有效地取消添加它:

git add path/to/untracked-file
git stash save "don't forget to un-add path/to/untracked-file" # stash w/reminder
# do some other work
git stash list
# shows:
# stash@{0}: On master: don't forget to un-add path/to/untracked-file
git stash pop   # or apply instead of pop, to keep the stash available
git rm --cached path/to/untracked-file

然后您可以继续工作,以与 git add 之前相同的状态(即使用名为 path/to/untracked-file 的未跟踪文件;加上您可能必须对已跟踪文件进行的任何其他更改)。

对此工作流程的另一种可能性是:

git ls-files -o > files-to-untrack
git add `cat files-to-untrack` # note: files-to-untrack will be listed, itself!
git stash
# do some work
git stash pop
git rm --cached `cat files-to-untrack`
rm files-to-untrack

[注意:正如 @mancocapac 的评论中提到的,您可能希望将 --exclude-standard 添加到 git ls-files 命令(因此,git ls-files -o --exclude-standard)。]

...这也可以很容易地编写脚本——即使是别名也可以(以 zsh 语法呈现;根据需要进行调整)[另外,我缩短了文件名,因此它完全适合屏幕,而无需在此答案中滚动;随意替换您选择的备用文件名]:

alias stashall='git ls-files -o > .gftu; git add `cat .gftu`; git stash'
alias unstashall='git stash pop; git rm --cached `cat .gftu`; rm .gftu'

请注意,后者可能更适合作为 shell 脚本或函数,以允许将参数提供给 git stash,以防您不需要 pop 而需要 apply,和/或希望能够指定特定的藏匿处,而不仅仅是拿走顶部的藏匿处。也许这个(而不是上面的第二个别名)[空白被剥离以适应不滚动;重新添加以提高可读性]:

function unstashall(){git stash "${@:-pop}";git rm --cached `cat .gftu`;rm .gftu}

注意:在这种形式中,如果要提供存储标识符,则需要提供操作参数以及标识符,例如 unstashall apply stash@{1}unstashall pop stash@{1}

您当然会放入 .zshrc 或等效项以使其长期存在。

希望这个答案对某人有所帮助,将所有内容放在一个答案中。


git ls-files -o 显示的文件比我感兴趣的文件多得多。从以下git status中我发现添加了 --exclude-standard 作品。 git ls-files -o --exclude-standard。我对此的看法是它仅“包含”您通常不会忽略的未跟踪文件,即仅显示您的 .gitignore 不会过滤掉的未跟踪文件
R
Ryan

2020 年更新的答案

令我惊讶的是,此页面上没有其他答案提到 git stash push

This article 帮助我理解:

命令 git stash 是 git stash push 的简写。在这种模式下,不允许使用非选项参数来防止拼写错误的子命令生成不需要的隐藏条目。此命令还有另一个别名 git stash save 已弃用,取而代之的是 git stash push。默认情况下,git 在进行存储时会忽略未跟踪的文件。如果需要将这些文件添加到存储中,您可以使用 -u 选项告诉 git 包含未跟踪的文件。如果指定了 -a 选项,也可以添加忽略的文件。 -a 将包括未跟踪和忽略的文件。

我关心命名我的存储,我希望它们包含未跟踪的文件,所以我最常运行的命令是: git stash push -u -m "whatIWantToNameThisStash"


另请参阅此别名:stackoverflow.com/q/64823742/470749
如果您有很多未跟踪的文件并且您只想存储其中的一部分:git stash push path/to/some/file -u
O
Oded

我可以通过以下方式仅存储未跟踪的文件:

git stash save "tracked files I'm working on"
git stash save -u "untracked files I'm trying to stash"
git stash pop stash@{1}

最后一个会弹出已跟踪文件的存储,因此只保留未跟踪的文件。


git stash save -u 不仅保存 untracked 文件,还保存 trackeduntracked。我认为在这种情况下,您所做的第一次保存不是必需的。 atlassian.com/git/tutorials/saving-changes/… 中有一个很好的图表
问题是如何只存储未跟踪的文件。如果你跳过第一个存储,那么你会弹出什么?这个想法是:1)隐藏跟踪。 2) 藏匿未追踪。 3) 流行音乐跟踪。结果:未追踪的遗体被藏匿。
M
Mike

2.35 版中的新功能

git stash 的新 --staged 模式可以轻松地隐藏暂存区域中已有的内容,仅此而已。你可以把它想象成 git commit (它只写入分阶段的更改),但它不是创建一个新的提交,而是将一个新的条目写入存储。然后,当您准备好时,您可以恢复您的更改(使用 git stash pop)并继续工作。

git add -A
git stash --staged

T
Tdy

如果您想存储未跟踪的文件,但保留索引文件(例如您将要提交的文件),只需将 -k(保留索引)选项添加到 -u

git stash -u -k

s
shubham mishra

您可以使用以下命令简单地做到这一点

git stash save --include-untracked

或者

git stash save -u

有关 git stash Visit this post (Click Here) 的更多信息


P
Paul Rooney

假设新的和未跟踪的文件被称为:“views.json”。如果您想通过隐藏应用程序的状态来更改分支,我通常会输入:

git add views.json

然后:

git stash

它会被藏起来。然后我可以改变分支

git checkout other-nice-branch

A
Ali Raza

您如何存储未跟踪的文件?

git stash --include-untracked

C
Chandraprakash

Stashing 在 VS 2019 及更高版本中可用。

转到 Git 更改窗口 Ctrl + Alt + F7 现在按 Commit All 或 Commit staged 按钮附近的下拉键以查看存储选项

https://i.stack.imgur.com/f1HcN.png

如果您想存储 Git ignored filesFiles which are not included into project 等未跟踪文件,请选择此选项

https://i.stack.imgur.com/SMvy2.png

阅读此答案以在 Visual Studio 中充分使用 Git stash: https://stackoverflow.com/a/69905607/4391394


C
Community

我认为这可以通过告诉 git 文件存在来解决,而不是将其所有内容提交到暂存区,然后调用 git stash。 araqniddescribes前怎么做。

git add --intent-to-add path/to/untracked-file

或者

git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 path/to/untracked-file

但是,后者不起作用:

$ git stash
b.rb: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state

据我所知,前者也不起作用。有关此问题的解决方案,请参见 my answer
D
DrStrangepork

这里有几个正确答案,但我想指出,对于新的整个目录,'git add path' 起作用。因此,如果您在 untracked-path 中有一堆新文件并执行以下操作:

git add untracked-path
git stash "temp stash"

这将隐藏以下消息:

Saved working directory and index state On master: temp stash
warning: unable to rmdir untracked-path: Directory not empty

如果 untracked-path 是您要存储的唯一路径,则存储“临时存储”将是一个空存储。正确的方法是添加整个路径,而不仅仅是目录名(即以'/'结束路径):

git add untracked-path/
git stash "temp stash"

至少在我的系统上你的假设是错误的。它可以在没有斜线的情况下工作!无论如何都会忽略空目录。 (macos git 2.6.2)
I
IvoL

我在将 Sourcetree 与新创建的文件一起使用时遇到了类似的问题(它们也不会包含在存储中)。

当我第一次选择“全部暂存”然后将新添加的组件存储在跟踪位置并因此包含在存储中时。


D
Dieter_be

我曾经思考和渴望相同的功能。但随着时间的推移,我注意到它确实不需要。存储时,可以保留新文件。他们不会发生任何“坏事”(当您检查其他内容时,git 会出错并且不会覆盖现有的未跟踪文件)

由于 git stashgit stash pop 之间的时间范围通常很小,因此您很快就会再次需要未跟踪的文件。所以我想说,当您处理其他内容(在 git stashgit stash pop 之间)时,文件显示在 git status 中的不便比工作造成的不便和需要注意的不便要小尝试将未跟踪的文件添加到您的存储中的成本。


这取决于项目。假设未跟踪的文件是(半写的)单元测试,并且测试工具运行目录中的所有单元测试。等等。
另一个例子是,如果您在两台计算机上工作,并且您可以将数据从 A 移动到 B,但不能从 B 移动到 A。如果您创建一段新代码来解决首先出现在 B 上但您想要在 A 和 B 上,您希望能够将文件存储在 B 上,这样当您在 A 上重新创建该文件然后将其打包时,您可以 git diff 存储的版本来验证您没有犯了一个错误。
仅仅因为一个文件没有在一个分支中被跟踪,并不意味着它不会与另一个分支中的跟踪文件发生冲突。
简单的反例: .conf.d 目录中的配置文件,或任何其他只有在那里才能修改软件行为的文件。
当然需要功能。再举一个例子,如果您有本地未跟踪的文件想要存储,则不可能从一个分支切换到另一个分支。