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

时间:2009-05-07 15:54:20

标签: git git-stash

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

16 个答案:

答案 0 :(得分:1477)

2018年5月17日更新:

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

以下原始答案:

<强> Warning, doing this will permanently delete your files if you have any directory/* entries in your gitignore file.

从版本1.7.7开始,您可以使用git stash --include-untrackedgit stash save -u来存储未跟踪的文件,而无需暂存它们。

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

答案 1 :(得分:377)

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

git stash --include-untracked
git stash -u

<强> Warning, doing this will permanently delete your files if you have any directory/* entries in your gitignore file.

答案 2 :(得分:68)

将文件添加到索引:

git add path/to/untracked-file
git stash

索引的全部内容以及对现有文件的任何未分级更改都将进入存储。

答案 3 :(得分:49)

在git bash中,使用命令

实现对未跟踪文件的存储
git stash --include-untracked

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 fiels和未跟踪的文件,否则无法执行最终推送。 .project和.classpath没有被隐藏。

我用过

 git stash 

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

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

git stash --include-untracked

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

git stash pop

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

答案 4 :(得分:20)

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

git add path/to/untracked-file
git stash

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

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,以防您不希望popapply,以及/或希望能够指定一个特定的藏匿,而不是仅仅取得最重要的藏匿。也许这个(而不是上面的第二个别名)[空白被剥离以适应而不滚动;重新添加以增加易读性]:

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

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

您当然会将.zshrc或等效内容存放在长期存在的位置。

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

答案 5 :(得分:11)

在git版本2.8.1上:以下版本适用于我。

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

git stash save -u

使用名称

以藏匿方式保存已修改和未跟踪的文件
git stash save -u <name_of_stash>

您可以按照以下方式使用pop和apply。

git stash pop

git stash apply stash@{0}

答案 6 :(得分:5)

2020年更新的答案

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

This article帮助我理解了:

命令git stashgit stash push的简写。在这种模式下,不允许使用非选项参数来防止拼写错误的子命令产生不必要的隐藏项。此命令git stash save还有另一个别名,不推荐使用git stash push

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

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

答案 7 :(得分:1)

这里有几个正确答案,但我想指出,对于新的整个目录,'git add path' NOT 工作。因此,如果您在 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 是您要存放的唯一路径,则存储“temp stash”将是一个空藏匿处。正确的方法是添加整个路径,而不仅仅是目录名称(即以'/'结束路径):

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

答案 8 :(得分:1)

您只需使用以下命令

即可
git stash save --include-untracked

git stash save -u

有关git stash Visit this post (Click Here)

的更多信息

答案 9 :(得分:1)

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

import java.util.*; public class Hw5{ public static void main(String[] args){ Scanner console = new Scanner(System.in); int input = console.nextInt(); ArrayList<Integer> GradeList = new ArrayList<>(); while(input >= 0){ input = console.nextInt(); GradeList.add(input); } evaluateGrade(GradeList); System.out.print(GradeList); } public static void evaluateGrade(List<Integer> Scores){ int count = Scores.size(); int high = Collections.max(Scores); int low = Collections.min(Scores); int Aplus = 0; int A = 0; int Amin = 0; int Bplus = 0; int B = 0; int Bmin = 0; int Cplus = 0; int C = 0; int Cmin = 0; int Dplus = 0; int D = 0; int Dmin = 0; int F = 0; for(int i : Scores){ if(i > 97){ Aplus += 1; } else if(i >= 93 && i <= 96){ A += 1; } else if(i >= 89 && i <= 92){ Amin += 1; } else if(i >= 85 && i <= 88){ Bplus += 1; } else if(i >= 81 && i <= 84){ B += 1; } else if(i >= 77 && i <= 80){ Bmin += 1; } else if(i >= 81 && i <= 84){ B += 1; } else if(i >= 77 && i <= 80){ Bmin += 1; } else if(i >= 76 && i <= 73){ Cplus += 1; } else if(i >= 69 && i <= 72){ C += 1; } else if(i >= 65 && i <= 68){ Cmin += 1; } else if(i >= 61 && i <= 64){ Dplus += 1; } else if(i >= 57 && i <= 60){ D += 1; } else if(i >= 53 && i <= 56){ Dmin += 1; } else if(i >= 52 && i <= 0){ F += 1; } } System.out.printf("Total number of grades = %d", count); System.out.println(); System.out.printf("Number of A+'s = %d", Aplus); System.out.println(); System.out.printf("Number of A's = %d", A); System.out.println(); System.out.printf("Number of A-'s = %d", Amin); System.out.println(); System.out.printf("Number of B+'s = %d", Bplus); System.out.println(); System.out.printf("Number of B's = %d", B); System.out.println(); System.out.printf("Number of B-'s = %d", Bmin); System.out.println(); System.out.printf("Number of C+'s = %d", Cplus); System.out.println(); System.out.printf("Number of C's = %d", C); System.out.println(); System.out.printf("Number of C-'s = %d", Cmin); System.out.println(); System.out.printf("Number of D+'s = %d", Dplus); System.out.println(); System.out.printf("Number of D's = %d", D); System.out.println(); System.out.printf("Number of D+'s = %d", Dmin); System.out.println(); System.out.printf("Number of F's = %d", F); System.out.println(); System.out.printf("The highest grade = %d", high); System.out.println(); System.out.printf("The lowest grade = %d", low); System.out.println(); }

然后:

git add views.json

它会藏起来。然后我可以用

git stash

答案 10 :(得分:1)

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

git stash -u -k

答案 11 :(得分:0)

我认为这可以通过告诉git文件存在而不是将其所有内容提交到临时区域来解决,然后调用git stash。 Araqnid describes如何做前者。

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

答案 12 :(得分:0)

git stash --include-untracked

我的最爱,因为它还会保存您已添加但尚未暂存的文件。

答案 13 :(得分:0)

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

当我第一次选择'stage all',然后将新添加的组件存放在要跟踪的地方,因此包含在其中。

答案 14 :(得分:0)

如何隐藏未跟踪的文件?

git stash --include-untracked

答案 15 :(得分:-6)

我曾经思考并渴望同样的功能。 但随着时间的推移,我注意到它真的不需要。 当您藏匿时,可以保留新文件。没有什么“坏”可能发生在他们身上(当你检查出别的东西时,git会出错并且不会覆盖现有的未跟踪文件)

由于git stashgit stash pop之间的时间范围通常相当小,因此您需要再次快速地需要未跟踪的文件。 因此,我会说,当您处理其他内容(git statusgit stash之间)时,git stash pop中显示的文件的不便之处小于工作带来的不便并且需要注意的是,尝试将未跟踪的文件添加到您的藏匿处会花费其他费用。