假设在由git版本化的项目中进行了两组更改.一套是上演的,另一套则没有.
我想通过在此状态下运行我的项目(在提交之前)来重新检查暂存的更改.什么是简单的方法来收起所有未分阶段的变化并且只留下上演?所以我需要从我的项目中消失的非分段更改,但是要存储在某个地方以便进一步工作.
这听起来非常像git stash命令.但是git stash会将未分阶段和分阶段的更改从我的项目中移除.我找不到类似的东西git stash uncached.
Moh*_*ady 78
更新:
即使这是选定的答案,很多人都指出下面的答案是正确答案,我建议检查出来.
旧答案:
如果使用该--keep-index选项,则已添加到索引的所有更改都保持不变:
git stash --keep-index
Run Code Online (Sandbox Code Playgroud)
来自以下文件git-stash:
测试部分提交
git stash save --keep-index当您想要在工作树中的更改中进行两次或更多次提交时,您可以使用,并且您希望在提交之前测试每个更改:Run Code Online (Sandbox Code Playgroud)# ... 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
Run Code Online (Sandbox Code Playgroud)
ste*_*son 72
接受的答案还隐藏了一些已经指出的阶段性更改,并且它不会存储未跟踪的文件.这是一种方法,无需在存储中进行暂存更改,同时还可以删除和存储未跟踪的文件.
我们的想法是暂时提交您的暂存更改,然后存储未暂存的更改,然后取消提交临时提交:
# 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^
Run Code Online (Sandbox Code Playgroud)
此时,您将收到未暂存更改的隐藏信息,并且只会在您的工作副本中显示您的暂存更改.
Evi*_*lta 18
从Git 2.35(2022 年第一季度)开始,您现在可以通过git stash --staged.
因此,要隐藏未暂存 (且未跟踪)的更改:
git stash --staged # stashes staged, leaving unstaged
git stash -u # stashes unstaged & untracked
git stash pop "stash@{1}" # pops staged back (but they're now unstaged)
git add -A # restages the previously staged changes
Run Code Online (Sandbox Code Playgroud)
然而,如果分阶段和未分阶段的更改影响相同的行,则这将失败
git stash --staged,因为在这种情况下,通过隐藏分阶段的更改会“部分”失败,但会留下分阶段和未分阶段的更改。
在这种情况下,下面的方法(使用git commit)可能会更好。
如果您想为其添加 git别名.gitconfig,请将其添加到您的:
[alias]
stash-unstaged = "!cd "${GIT_PREFIX:-.}"; f() { \
git stash --quiet --staged; \
git stash -u \"$@\"; \
git stash pop --quiet \"stash@{1}\"; \
git add -A; \
}; f"
Run Code Online (Sandbox Code Playgroud)
用法:
git stash-unstaged -m "Stash Message"
Run Code Online (Sandbox Code Playgroud)
对于Git 版本 <2.35,
您可以通过利用分离暂存和未暂存的更改来隐藏未暂存 (和未跟踪)的更改:git commit
git commit -m "TEMP" # commits staged, leaving unstaged
git stash -u # stashes unstaged & untracked
git reset --soft HEAD^ # undo commit, bringing staged back
Run Code Online (Sandbox Code Playgroud)
与之前的方法(使用
git stash --staged)不同,即使暂存和未暂存的更改影响相同的行,该方法仍然有效。
不过,当您弹出存储时,您可能需要解决合并冲突。
仅供参考,要存储分阶段的更改,只需先存储未分阶段的更改:
# Stash unstaged as shown previously
git commit -m "TEMP"
git stash -u
git reset --soft HEAD^
git stash -u # stashes remaining staged
git stash pop "stash@{1}" # pops unstaged back
Run Code Online (Sandbox Code Playgroud)
这 2 个的别名:
[alias]
stash-unstaged = "!cd "${GIT_PREFIX:-.}"; f() { \
git commit --quiet -m \"TEMP\"; \
git stash -u \"$@\"; \
git reset --quiet --soft HEAD^ \
}; f"
stash-staged = "!cd "${GIT_PREFIX:-.}"; f() { \
git stash-unstaged --quiet; \
git stash -u \"$@\"; \
git stash pop --quiet \"stash@{1}\"; \
}; f"
Run Code Online (Sandbox Code Playgroud)
Bin*_*ile 17
我发现明确的答案对我来说不起作用,因为我需要的东西真的只能隐藏我未经修改的变化.标记的答案,git stash --keep-index隐藏了分阶段和非分阶段的变化.该--keep-index部分仅仅将索引保留在工作副本上.这适用于OP,但仅仅是因为他提出的问题与他实际想要的答案略有不同.
我发现存储未分级更改的唯一真实方法是不使用存储:
git diff > unstaged.diff
git apply -R unstaged.diff
Run Code Online (Sandbox Code Playgroud)
git checkout -- .也会工作而不是apply -R.
工作工作工作...
git apply unstaged.diff
rm unstaged.diff
Run Code Online (Sandbox Code Playgroud)
Gle*_*as' 12
由于到目前为止,这里的各种答案似乎都有自己的复杂性/局限性,因此我想提供更多替代方案,涵盖我个人需要的所有特定边缘情况。
\n列出暂存(未删除)文件:
\ngit diff --staged --diff-filter=d --name-only\nRun Code Online (Sandbox Code Playgroud)\n列出未暂存(未删除)的文件:
\ngit diff --diff-filter=d --name-only\nRun Code Online (Sandbox Code Playgroud)\n列出未暂存/未跟踪的文件:
\ngit ls-files --modified --others --exclude-standard\nRun Code Online (Sandbox Code Playgroud)\n仅存储暂存文件(最初来自StackOverflow 答案,但略有调整):
\ngit diff --staged --diff-filter=d --name-only\nRun Code Online (Sandbox Code Playgroud)\n仅存储未暂存(而非未跟踪)的文件:
\ngit stash push --keep-index -- $(git diff --diff-filter=d --name-only)\nRun Code Online (Sandbox Code Playgroud)\n存储未暂存和未跟踪的文件:
\ngit stash push --keep-index --include-untracked -- $(git ls-files --modified --others --exclude-standard)\nRun Code Online (Sandbox Code Playgroud)\n存储暂存/未暂存文件,同时还将暂存文件保留在索引中:
\ngit stash push --keep-index\nRun Code Online (Sandbox Code Playgroud)\n存储暂存/未暂存/未跟踪文件,同时还将暂存文件保留在索引中:
\ngit stash push --include-untracked --keep-index\nRun Code Online (Sandbox Code Playgroud)\ngit stash push允许我们提供一个<pathspec>,并且只存储与其匹配的文件:
git stash push -- <pathspec>\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n将本地修改保存到新的存储条目并将其回滚到 HEAD(在工作树和索引中)。该部分是可选的,并给出描述以及隐藏状态。
\n
\n\n\n
<pathspec>\xe2\x80\xa6\xe2\x80\x8b该选项仅对
\npush命令有效。新的存储条目仅记录与路径规范匹配的文件的修改状态。然后,索引条目和工作树文件也仅回滚到这些文件的 HEAD 中的状态,而使与路径规范不匹配的文件保持不变。
\n
\n\n\n
-u,--include-untracked,--no-include-untracked当与
\npush和save命令一起使用时,所有未跟踪的文件也会被隐藏,然后用 清理git clean。
git diff允许我们列出当前未暂存的文件--name-only:
git diff --name-only\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n
git diff [<options>] [--] [<path>\xe2\x80\xa6\xe2\x80\x8b]这个表单是查看你相对于索引(下一次提交的暂存区)所做的更改。
\n
\n\n\n仅显示已更改文件的名称。
\n
\n\n\n
--diff-filter=\\[(A|C|D|M|R|T|U|X|B)\xe2\x80\xa6\xe2\x80\x8b\\[*\\]\\]仅选择已添加 (
\nA)、已复制 (C)、已删除 (D)、已修改 (M)、已重命名 (R) 且具有其类型的文件(即常规文件、符号链接、子模块、\xe2\x80\xa6\xe2\x80\x8b)已更改 (T)、未合并 (U)、未知 (X) 或其配对已损坏 (B)。可以使用过滤字符的任意组合(包括无)。此外,这些大写字母可以小写以排除。例如,
\n--diff-filter=ad排除添加和删除的路径。
git ls-files允许我们列出--modified文件和未跟踪的 ( --others) 文件:
git ls-files --modified --others --exclude-standard\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n
git-ls-files- 显示索引和工作树中文件的信息
\n\n\n在输出中显示修改后的文件
\n
\n\n\n在输出中显示其他(即未跟踪的)文件
\n
\n\n\n添加标准 Git 排除:.git/info/exclude、每个目录中的 .gitignore 以及 user\xe2\x80\x99s 全局排除文件。
\n
Git:隐藏未分级的更改
这将存储您没有git添加的所有修改:
git stash -k
Run Code Online (Sandbox Code Playgroud)
请注意,除非您也使用该-u开关,否则新创建(和未添加)的文件将保留在您的工作目录中。
git stash -k -u
Run Code Online (Sandbox Code Playgroud)
另外,稍后您使用git stash pop时,您的工作目录必须干净(即,需要添加所有更改)。
http://makandracards.com/makandra/853-git-stash-unstaged-changes