假设在由git版本化的项目中进行了两组更改。一套是上演的,另一套则没有。
我想通过在此状态下运行我的项目(在提交之前)来重新检查暂存的更改。 什么是一种简单的方法来放弃所有未分级的更改,只留下暂停?所以我需要从我的项目中消失的非分段更改,但要存储在某处以便进一步工作。
这听起来非常像git stash
命令。但git stash
会将未分阶段和分阶段的更改放在我的项目之外。我找不到类似git stash uncached
的内容。
答案 0 :(得分:74)
<强>更新强>
即使这是选定的答案,但很多人都指出answer below是正确的答案,我建议将其检出。
旧答案:
如果使用--keep-index
选项,则已添加到索引的所有更改都将保持不变:
git stash --keep-index
测试部分提交
如果你想制作两个或两个,你可以使用
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)
由于到目前为止这里的各种答案似乎都有自己的错综复杂/局限性,我想提供更多的替代方案,涵盖我个人需要的所有特定边缘情况。
列出暂存(未删除)文件:
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>
<块引用>
将您的本地修改保存到一个新的存储条目并将它们回滚到 HEAD(在工作树和索引中)。该部分是可选的,并提供描述以及隐藏状态。
<块引用>此选项仅对 push
命令有效。
新的存储条目仅记录与路径规范匹配的文件的修改状态。然后,索引条目和工作树文件也仅针对这些文件回滚到 HEAD 中的状态,而将与路径规范不匹配的文件保持完整。
<块引用>-u
, --include-untracked
, --no-include-untracked
当与 push
和 save
命令一起使用时,所有未跟踪的文件也会被隐藏起来,然后用 git clean
清理。
git diff
允许我们使用 currently unstaged files 列出 --name-only
:
git diff --name-only
<块引用>
git diff [<options>] [--] [<path>…]
此表单用于查看您相对于索引所做的更改(下一次提交的暂存区)。
<块引用>仅显示已更改文件的名称。
<块引用>--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
- 显示有关索引和工作树中文件的信息
在输出中显示修改过的文件
<块引用>在输出中显示其他(即未跟踪的)文件
<块引用>在每个目录中添加标准的 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