Git隐藏未缓存的内容:如何保存所有未分段的更改?


96

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

我想通过在此状态下运行我的项目(在提交之前)来重新检查分阶段的更改。丢弃所有未进行的更改而仅保留已进行的更改的简单方法是什么?因此,我需要分阶段进行的更改才能从项目中消失,而要存储在某个地方以进行进一步的工作。

这听起来很像git stash命令。但这git stash会使未进行的变更和已进行的变更都脱离我的项目。我找不到类似的东西git stash uncached


截至今天,在我的git 2.21中,对此仍然没有好的答案。以下所有答案都不正确(-k可选)或使用起来很麻烦。
Penghe Geng

Answers:


98

更新2:
我不确定为什么人们会抱怨这个答案,似乎与我合作得很好,对于未处理的文件,您可以添加-u标记

完整的命令变为 git stash --keep-index -u

这是git-stash帮助中的摘录

如果使用--keep-index选项,则已添加到索引的所有更改均保持不变。

如果使用了--include-untracked选项,则所有未跟踪的文件也会被存放,然后使用git clean进行清理,从而使工作目录处于非常干净的状态。如果改用--all选项,则除了未跟踪的文件外,还将隐藏和清除被忽略的文件。

这是它的外观的一个gif:

在此处输入图片说明

更新:

即使这是选择的答案,也有很多人指出[下面的答案](https://stackoverflow.com/a/34681302/292408)是正确的,我建议您将其检查一下。

我今天(2020年1月31日)针对git版本再次测试了我的答案2.24.0,但我仍然认为这是正确的,我在上面添加了有关未跟踪文件的小注释。如果您认为它不起作用,请同时提及您的git版本。

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

git stash --keep-index

从以下文档中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

4
另请参阅git stash [-p|--patch]感觉像是交互式隐藏。从man git stash“使用--patch,您可以从HEAD和要隐藏的工作树之间的差异中交互地选择块”。
在这里

1
我通常add -pcheckout -p并且reset -p从未尝试过stash -p,谢谢您的提示:D
Mohammad AbuShady 2014年

18
请注意,此答案还将隐藏您已上演的更改。
本弗林

这个答案并不是真正有用的,因为它会导致混乱。这个答案是更好的stackoverflow.com/a/34681302/292408
伊利亚·林恩

1
@ElijahLynn我已链接到其他答案,因为我发现很多人说这是更好的答案,谢谢您的评论
Mohammad AbuShady

100

正如一些人指出的那样,被接受的答案还会带来阶段性的变化。这是一种方法,无需在存储中分阶段进行更改。

这个想法是对暂存的更改进行临时提交,然后存储未暂存的更改,然后取消提交临时提交:

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

# -u option so you also stash untracked files
$ git stash -u

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

此时,您将拥有未分阶段的更改的存储,并且只会在工作副本中显示已分阶段的更改。


21
这确实是IMO的正确答案。在--keep-index当前接受的答案选项仍然藏匿有什么索引,它只是保持它的指标。因此,它被复制了,随之而来的是欢闹。
肯·威廉姆斯

3
@KenWilliams <del> hilarity </ del> <ins>悲剧</ ins>
tuespetre 17/09/13

@KenWilliams真的让我很生气。OP,请您调整选择的答案?
MikeMurko '18

2
git add .可能需要改进此步骤,git add --all因为它也应该在当前工作目录上方的目录中抓取文件。
伊利亚·林恩

1
到目前为止,这是最好的答案,因为公认的答案中的--keep-index选项具有误导性。这应该是公认的答案。
伊利亚·林恩

21

我发现标记的答案对我不起作用,因为我需要的东西只能真正隐藏我未分阶段的更改。标记为的答案会存储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

1
在上git version 2.6.1.windows.1,按说明git stash -k工作。
koppor

这应该是公认的答案!它是多个stackoverflow线程中唯一执行其声明且不依赖于进行临时提交的线程!
user643011

1
@ user643011:临时提交在git中不是一件坏事。他们不花钱,也不会伤害任何人。
Fritz

1
@Fritz:在某些情况下无法进行临时提交。如果您具有检查当前工作代码的预提交挂钩,则可能会失败。如果您进行的分阶段更改很好,但未进行的分阶段更改则不好,则此方法将无法提交已进行的更改。
Penghe Geng

1
这不包括未跟踪的文件。您需要使用“ git ls-files”查找并包含在diff补丁中
ACyclic '18

5

Git:隐藏未分级的更改

这将存储您没有git添加的所有修改:

git stash -k

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

git stash -k -u 

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

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


13
这等效于git stash --keep-index。暂存文件包含在隐藏文件中。
本杰明·谢
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.