Git stash未缓存:如何收起所有未分级的变化?

时间:2013-11-17 07:53:27

标签: git git-stash

假设在由git版本化的项目中进行了两组更改。一套是上演的,另一套则没有。

我想通过在此状态下运行我的项目(在提交之前)来重新检查暂存的更改。 什么是一种简单的方法来放弃所有未分级的更改,只留下暂停?所以我需要从我的项目中消失的非分段更改,但要存储在某处以便进一步工作。

这听起来非常像git stash命令。但git stash会将未分阶段和分阶段的更改放在我的项目之外。我找不到类似git stash uncached的内容。

5 个答案:

答案 0 :(得分:74)

<强>更新
即使这是选定的答案,但很多人都指出answer below是正确的答案,我建议将其检出。

旧答案
如果使用--keep-index选项,则已添加到索引的所有更改都将保持不变:

git stash --keep-index

来自documentation of git-stash

  

测试部分提交

     

如果你想制作两个或两个,你可以使用git stash save --keep-index   更多提交工作树中的更改,并且您想要测试   提交前的每次更改:

# ... hack hack hack ...
$ git add --patch foo            # add just first part to the index
$ git stash save --keep-index    # save all other changes to the stash
$ edit/build/test first part
$ git commit -m 'First part'     # commit fully tested change
$ git stash pop                  # prepare to work on all other changes
# ... repeat above five steps until one commit remains ...
$ edit/build/test remaining parts
$ git commit foo -m 'Remaining parts'

但是,如果您只想视觉检查分阶段的更改,可以尝试difftool

git difftool --cached

答案 1 :(得分:61)

接受的答案还隐藏了一些已经指出的阶段性更改,并且它不会存储未经跟踪的文件。这是一种方法,无需在存储中进行分阶段更改,同时还可以删除和存储未跟踪的文件。

我们的想法是暂时提交您的暂存更改,然后存储未暂存的更改,然后取消提交临时提交:

# temp commit of your staged changes:
$ git commit --message "WIP"

# stage your previously unstaged files before stashing (so you get untracked files):
$ git add .

$ git stash

# now un-commit your WIP commit:
$ git reset --soft HEAD^

此时,您将收到未暂存的更改信息,并且只会在您的工作副本中显示您的暂存更改。

答案 2 :(得分:14)

我发现标记的答案对我来说不起作用,因为我需要的东西真的只能隐藏我的未经修改的变化。标记的答案git stash --keep-index会隐藏分阶段和未分阶段的更改。 --keep-index部分仅在工作副本上保留索引完整性。这适用于OP,但仅仅是因为他提出的问题与他实际想要的答案略有不同。

我发现存储未分期更改的唯一真实方法是根本不使用存储:

git diff > unstaged.diff
git apply -R unstaged.diff

git checkout -- .也可以代替apply -R

工作工作......

git apply unstaged.diff
rm unstaged.diff

答案 3 :(得分:2)

由于到目前为止这里的各种答案似乎都有自己的错综复杂/局限性,我想提供更多的替代方案,涵盖我个人需要的所有特定边缘情况。

tl;博士

列出暂存(未删除)文件:

git diff --staged --diff-filter=d --name-only

列出未暂存(未删除)的文件:

git diff --diff-filter=d --name-only

列出未暂存/未跟踪的文件:

git ls-files --modified --others --exclude-standard

仅存储暂存文件(最初来自 this StackOverflow answer,但略有调整):

git stash push --include-untracked -- $(git diff --staged --diff-filter=d --name-only)

仅存储未暂存(而非未跟踪)的文件:

git stash push --keep-index -- $(git diff --diff-filter=d --name-only)

存储未暂存和未跟踪的文件:

git stash push --keep-index --include-untracked -- $(git ls-files --modified --others --exclude-standard)

存储暂存/未暂存文件,同时还将暂存文件保存在您的索引中:

git stash push --keep-index

存储暂存/未暂存/未跟踪的文件,同时还将暂存文件保存在您的索引中:

git stash push --include-untracked --keep-index

完整说明

git stash push 允许我们提供一个 <pathspec>,并且只存储与其匹配的文件:

git stash push -- <pathspec>
<块引用>

push [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [-m|--message <message>] [--pathspec-from-file=<file> [--pathspec-file-nul]] [--] [<pathspec>…​]

将您的本地修改保存到一个新的存储条目并将它们回滚到 HEAD(在工作树和索引中)。该部分是可选的,并提供描述以及隐藏状态。

<块引用>

<pathspec>…​

此选项仅对 push 命令有效。

新的存储条目仅记录与路径规范匹配的文件的修改状态。然后,索引条目和工作树文件也仅针对这些文件回滚到 HEAD 中的状态,而将与路径规范不匹配的文件保持完整。

<块引用>

-u, --include-untracked, --no-include-untracked

当与 pushsave 命令一起使用时,所有未跟踪的文件也会被隐藏起来,然后用 git clean 清理。


git diff 允许我们使用 currently unstaged files 列出 --name-only

git diff --name-only
<块引用>

git diff [<options>] [--] [<path>…​]

此表单用于查看您相对于索引所做的更改(下一次提交的暂存区)。

<块引用>

--name-only

仅显示已更改文件的名称。

<块引用>

--diff-filter=\[(A|C|D|M|R|T|U|X|B)…​\[*\]\]

仅选择已添加 (A)、已复制 (C)、已删除 (D)、已修改 (M) 的文件, 重命名 (R), 改变它们的类型 (即常规文件, 符号链接, 子模块, ... ) (T), 未合并 (U), 未知 ({{1 }}),或者配对已损坏 (X)。可以使用过滤器字符的任意组合(包括无)。

此外,可以将这些大写字母小写以排除。例如。 B 排除添加和删除的路径。


git ls-files 允许我们列出 --modified 文件和未跟踪的 (--others) 文件:

--diff-filter=ad
<块引用>

git-ls-files - 显示有关索引和工作树中文件的信息

<块引用>

-m, --modified

在输出中显示修改过的文件

<块引用>

-o, --others

在输出中显示其他(即未跟踪的)文件

<块引用>

--exclude-standard

在每个目录中添加标准的 Git 排除:.git/info/exclude、.gitignore,以及用户的全局排除文件。

答案 4 :(得分:1)

Git:存储未分期更改

这将隐藏您未添加的所有修改:

git stash -k

请注意,新创建的(和未添加的)文件将保留在您的工作目录中,除非您还使用-u开关。

git stash -k -u 

此外,当您稍后使用git stash pop时,您的工作目录必须是干净的(即需要添加所有更改)。

http://makandracards.com/makandra/853-git-stash-unstaged-changes