你如何存放未跟踪的文件?

ski*_*ppy 1287 git git-stash

我对文件进行了更改,加上一个新文件,并希望在切换到另一个任务时使用git stash将它们删除.但git stash本身只会隐藏对现有文件的更改; 新文件仍然存在于我的工作树中,使我未来的工作变得混乱.如何存放这个未跟踪的文件?

syk*_*ora 1705

2018年5月17日更新:

新版本的git现在可以存储git stash --include-untracked所有文件,包括未跟踪和忽略的文件.
git stash --all不再触及被忽略的文件(在git 2.16.2上测试).

原答案如下:

警告,如果您的gitignore文件中有任何目录/*条目,执行此操作将永久删除您的文件.

从版本1.7.7开始,您可以使用git stash --include-untrackedgit stash --include-untracked存储未跟踪的文件,而无需对其进行暂存.

添加(git stash save -u)文件并开始跟踪它.然后藏匿.由于文件的全部内容都是新的,因此它们将被隐藏,您可以根据需要对其进行操作.

  • 由于您在这里有最佳答案,我会要求您在答案中的“git stash --all”之前列出“git stash --include-untracked”,原因有两个。首先,它现在在 2019 年更好地回答了 OP 的问题,其次是因为 --all 做了大多数用户可能不想要的事情,因为它删除了所有 .gitignored 的文件 (13认同)
  • @AlanChristensen关键是要隐藏可能被结帐的另一个分支覆盖的东西. (11认同)
  • @ alan-christensen阅读http://www.kernel.org/pub/software/scm/git/docs/git-stash.html的说明.重点是在存放后有一个干净的工作树. (5认同)
  • 为什么stash仍然存储已更改现有文件,即使这些更改尚未上演? (4认同)
  • @Kelvin我在评论中的意思是它不会存储新文件,除非它们已被暂存,但它会存储现有文件,即使它们尚未上演.似乎与我不一致. (3认同)
  • 即:`git stash save -u“我的保存”` (2认同)
  • 如果使用“-u/--include-untracked”添加未跟踪的文件,“git stash show”和“git stash show --stat”不会显示未跟踪文件的迹象。这对于跟踪和未跟踪的混合尤其令人困惑,因为它**使 git 看起来像不可恢复地删除了未跟踪的文件。**文件在弹出或应用时会恢复。 (2认同)
  • 我会在使用“git stash --all”时发出更多警告。大致如下: *注意:* 使用 `git stash --all` 将存储 **所有** `.gitignore` 的文件,这些文件可能是 CPU 密集型的,而不是您想要的。您可能*不*希望隐藏的常见被忽略文件包括:日志文件(可能很大)、项目配置文件、JS node_modules 等库、.DS_Store 等操作系统文件等。一目了然,这将使这个流行的答案更加有用。 (2认同)
  • “.gitignore”中“directory/*”条目文件被**永久删除**的错误已在版本 2.14.0 中修复 https://github.com/git/git/blob/master/Documentation/RelNotes/ 2.14.0.txt#L384 (2认同)

Joh*_*ary 398

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

git stash --include-untracked
git stash -u
Run Code Online (Sandbox Code Playgroud)

警告,如果您的gitignore文件中有任何目录/*条目,执行此操作将永久删除您的文件.

  • 你能解释一下警告吗?为什么要删除这些文件?它会删除它们而不是存储它们吗?我已经使用Git一段时间了,并没有遇到这个问题. (20认同)
  • 酷 - 它最终按照手册页中的描述工作.不存储(和清理)新文件是破坏的行为. (15认同)
  • @ aleksandr-dubinsky,@ alekolek - `git` 1.8.3` -u`(`--include-untracked`)选项可以存储和弹出未跟踪的文件,但是`git stash show`没有列出所有未跟踪的文件藏匿 (3认同)

ski*_*ppy 74

将文件添加到索引:

git add path/to/untracked-file
git stash
Run Code Online (Sandbox Code Playgroud)

索引的全部内容以及对现有文件的任何未分级更改都将使其成为存储.

  • 更好的答案,因为 `--include-untracked` 将拾取所有内容,特别是隐藏目录;比如“node_modules”或“.pytest_cache”以及任何不在“.gitignore”中的东西。 (5认同)

Dol*_*ava 51

在git bash中,使用该命令可以实现对未跟踪文件的存储

git stash --include-untracked
Run Code Online (Sandbox Code Playgroud)

要么

git stash -u
Run Code Online (Sandbox Code Playgroud)

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

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

git stash pop
Run Code Online (Sandbox Code Playgroud)

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

我的经验

我不得不对我的gitIgnore文件执行修改,以避免将.classpath和.project文件移动到远程仓库中.到目前为止,我不允许在远程仓库中移动此修改后的.gitIgnore.

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

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

我用了

 git stash 
Run Code Online (Sandbox Code Playgroud)

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

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

git stash --include-untracked
Run Code Online (Sandbox Code Playgroud)

它从我的工作区中删除了文件.缺少这些文件会剥夺我在eclipse中工作的能力.我继续完成将提交的文件推送到远程的过程.一旦成功完成,我就用了

git stash pop
Run Code Online (Sandbox Code Playgroud)

这会将相同的文件粘贴回我的工作区.这让我有机会在eclipse中处理同一个项目.希望这可以撇开误解.

  • 为什么不在IDE文件中使用全局gitignore?IE浏览器.使用`〜/ .gitignore`. (2认同)
  • 这很好用,我遇到的唯一问题是“git stash show”只列出了修改过的文件,而不列出了未跟踪的文件...最初,我以为我丢失了很多工作... (2认同)

小智 27

2.35版本新增

\n

git stash\xe2\x80\x98s 新的 --staged 模式可以轻松地隐藏暂存区域中已有的内容,而不是其他任何内容。您可以将其视为 git commit (仅写入分阶段更改),但它不是创建新提交,而是向存储中写入新条目。然后,当您\xe2\x80\x99 准备好时,您可以恢复您的更改(使用 git stash pop)并继续工作。

\n
git add -A\ngit stash --staged\n
Run Code Online (Sandbox Code Playgroud)\n

  • 很棒的模式(--staged)和很棒的解决方案!我等这个很久了...谢谢! (2认同)

lin*_*des 20

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

git add path/to/untracked-file
git stash
Run Code Online (Sandbox Code Playgroud)

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

git add -N path/to/untracked/file     # note: -N is short for --intent-to-add
git stash
Run Code Online (Sandbox Code Playgroud)

这将失败,如下:

path/to/untracked-file: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state
Run Code Online (Sandbox Code Playgroud)

所以,你可以做什么?好吧,你必须真正添加文件,但是,您可以在以后有效地取消添加它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
Run Code Online (Sandbox Code Playgroud)

然后,您可以继续工作,处于与之前相同的状态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
Run Code Online (Sandbox Code Playgroud)

[注意:如@mancocapac的评论中所述,您可能希望添加--exclude-standardgit 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'
Run Code Online (Sandbox Code Playgroud)

需要注意的是,后者可能是作为一个shell脚本或功能,允许参数以提供给更好的git stash,如果你不想pop,但是apply,和/或希望能够指定一个特定的藏匿处,而不是只考虑顶部一.也许这个(而不是上面的第二个别名)[空格被剥离以适应而不滚动; 重新添加以增加易读性]:

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

注意:在此表单中,如果要提供存储标识符,则需要提供操作参数和标识符,例如unstashall apply stash@{1}unstashall pop stash@{1}

你当然会把你.zshrc或同等的东西长期存在.

希望这个答案对某人有帮助,将所有内容整合在一起.


Muh*_*Ali 17

要将未跟踪的文件包含在 stash 中,您可以在命令中使用--include-untracked或选项。-ugit stash

git stash --include-untracked
Run Code Online (Sandbox Code Playgroud)

或者

git stash -u
Run Code Online (Sandbox Code Playgroud)

解释:

当您运行git stash时有未提交的更改(包括新文件)时,Git 会将您的更改保存在一个名为stash. 但是,默认情况下,git stash仅保存跟踪的文件。任何新的、未跟踪的文件都不会包含在存储中。

如果您已将新文件添加到存储库然后运行git stash​​,则存储操作将不会保存新文件。新文件将在您的工作目录中保持未跟踪状态。

git stash --include-untracked git stash -u会将修改后的跟踪文件和任何未跟踪的文件保存在存储中,以便您稍后使用git stash apply或检索它们git stash pop


use*_*513 15

在git版本2.8.1:以下为我工作.

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

git stash save -u
Run Code Online (Sandbox Code Playgroud)

使用名称保存已存储的已修改和未跟踪文件

git stash save -u <name_of_stash>
Run Code Online (Sandbox Code Playgroud)

您可以使用pop和以后应用,如下所示.

git stash pop

git stash apply stash@{0}
Run Code Online (Sandbox Code Playgroud)


Rya*_*yan 11

2020 年更新答案

我很惊讶这个页面上没有提到其他答案git stash push

这篇文章帮助我理解:

该命令git stash是 的简写git stash push。在此模式下,不允许使用非选项参数来防止拼写错误的子命令生成不需要的存储条目。此命令还有另一个别名,git stash save但已弃用,取而代之的是git stash push.

默认情况下,git 在进行 stash 时会忽略未跟踪的文件。如果需要将这些文件添加到存储中,您可以使用-u告诉 git 包含未跟踪文件的选项。如果-a指定了选项,也可以添加忽略的文件。-a将包括未跟踪和忽略的文件。

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


小智 9

只需在项目根目录中运行以下命令:

git stash --include-untracked
Run Code Online (Sandbox Code Playgroud)


Ode*_*ded 8

我能藏匿只是做未跟踪文件:

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}
Run Code Online (Sandbox Code Playgroud)

最后一个弹出被跟踪文件的藏匿处,因此只留下未跟踪的文件.

  • 问题是如何仅存储未跟踪的文件。如果您跳过第一个存储区,那么会弹出什么?这个想法是:1)追踪藏匿处。2)藏匿未追踪。3)流行追踪。结果:未追踪的遗物被藏起来。 (2认同)

Cha*_*ash 8

VS 2019 及更高版本中提供了存储功能。

  1. 转到 Git 更改窗口Ctrl + Alt + F7
  2. Commit All现在按或按钮附近的下拉键Commit staged即可查看隐藏选项

在此输入图像描述

如果您想隐藏未跟踪的文件,例如Git ignored filesFiles which are not included into project然后选择此选项

在此输入图像描述

阅读此答案,了解 Visual Studio 中 Git stash 的完整用法: /sf/answers/4893392521/


Tdy*_*Tdy 5

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

git stash -u -k
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

390692 次

最近记录:

6 年,3 月 前