问:
我对一个文件进行了更改,加上一个新文件,并希望在切换到另一个任务时使用 git stash 将它们收起来。但是 git stash 本身只存储对现有文件的更改;新文件保留在我的工作树中,使我未来的工作变得混乱。如何存储这个未跟踪的文件?
答1:
一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会
要存储您的工作目录,包括未跟踪的文件(尤其是 .gitignore 中的文件),您可能需要使用此 cmd:
git stash --include-untracked
或者,您可以使用简写 -u 而不是 --include-untracked,或者简单地使用 git stash --all 来存储所有文件,包括 untracked 和 ignored 文件。这种行为在 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 的文件
答2:
一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会
从 git 1.7.7 开始,git stash 接受 --include-untracked 选项(或简写 -u)。要在存储中包含未跟踪的文件,请使用以下任一命令:
git stash --include-untracked
# or
git stash -u
警告,如果您的 gitignore 文件中有任何目录/条目,这样做将永久删除您的文件。*
huntsbot.com – 高效赚钱,自由工作
酷 - 它最终按照手册页中的描述工作。不存储(和清理)新文件是一种破坏行为。
我的 git 版本是 1.9.1,即使我在 .gitignore 中的内容看起来像 ignoredDirectory 而不是 ignoredDirectory/*,它仍然会删除那些未跟踪的。甚至未跟踪的文件也不仅仅是目录。
你能解释一下这个警告吗?为什么要删除这些文件?它会删除它们而不是隐藏它们吗?我使用 Git 已经有一段时间了,还没有遇到这个问题。
警告是否也适用于 *.extension 条目?
@aleksandr-dubinsky,@arekolek - git 1.8.3 -u (--include-untracked) 选项可以存储和弹出未跟踪的文件,但 git stash show 不会列出存储中的未跟踪文件
答3:
huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。
将文件添加到索引中:
git add path/to/untracked-file
git stash
索引的全部内容,加上对现有文件的任何未暂存的更改,都会将其放入存储中。
如果您不想隐藏索引中已经存在的更改怎么办?仍然可以存储新文件吗?
提交索引,存储新文件,然后恢复提交和/或从提交中签出文件。这是一个笨拙的解决方案,但它应该可以工作。
git add . 出于某种原因没有考虑到它
更好的答案,因为 --include-untracked 将拾取所有内容,尤其是隐藏目录;像 node_modules 或 .pytest_cache 以及任何不在 .gitignore 中的东西。
@Eggon 在您弹出/应用隐藏的更改后,git reset 将清除对索引的更改,但将它们留在工作树中,因为默认模式是 --mixed。
答4:
huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。
在 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 只列出了修改过的文件,而不是未跟踪的文件......最初,我认为我失去了很多工作......
答5:
huntsbot.com – 高效赚钱,自由工作
在 git 版本 2.8.1 上:以下对我有用。
将已修改和未跟踪的文件保存在没有名称的存储中
git stash save -u
使用名称将已修改和未跟踪的文件保存在 stash 中
git stash save -u
您可以使用 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 年以来发生了一些变化,或者我的情况有所不同,但我认为人们应该了解我的经历,因为这对我来说是出乎意料的。这并不意味着您的解决方案对某些人没有用。
答6:
huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!
正如其他地方所说,答案是 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 不会过滤掉的未跟踪文件
答7:
保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com
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
答8:
huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。
我可以通过以下方式仅存储未跟踪的文件:
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 文件,还保存 tracked 和 untracked。我认为在这种情况下,您所做的第一次保存不是必需的。 atlassian.com/git/tutorials/saving-changes/… 中有一个很好的图表
问题是如何只存储未跟踪的文件。如果你跳过第一个存储,那么你会弹出什么?这个想法是:1)隐藏跟踪。 2) 藏匿未追踪。 3) 流行音乐跟踪。结果:未追踪的遗体被藏匿。
答9:
huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。
2.35 版中的新功能
git stash 的新 --staged 模式可以轻松地隐藏暂存区域中已有的内容,仅此而已。你可以把它想象成 git commit (它只写入分阶段的更改),但它不是创建一个新的提交,而是将一个新的条目写入存储。然后,当您准备好时,您可以恢复您的更改(使用 git stash pop)并继续工作。
git add -A
git stash --staged
答10:
一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会
如果您想存储未跟踪的文件,但保留索引文件(例如您将要提交的文件),只需将 -k(保留索引)选项添加到 -u
git stash -u -k
答11:
huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求
您可以使用以下命令简单地做到这一点
git stash save --include-untracked
或者
git stash save -u
有关 git stash Visit this post (Click Here) 的更多信息
原文链接:https://www.huntsbot.com/qa/2VkQ/how-do-you-stash-an-untracked-file?lang=zh_CN&from=csdn
保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com