假设在git控制的项目中做了两组更改。一组是上演的,另一组不是。

我想通过在此状态(提交之前)运行我的项目来重新检查阶段性更改。有什么简单的方法可以把所有非阶段性的变化都收起来,只留下阶段性的变化?因此,我需要从项目中消失的非阶段性更改,但要存储在某个地方以供进一步工作。

这听起来很像git的stash命令。但是git stash会把非阶段性和阶段性的变化都从我的项目中删除。我也找不到什么没被偷的东西。


当前回答

Git:隐藏未分阶段的更改

这将隐藏所有你没有git添加的修改:

git stash -k

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

git stash -k -u 

此外,你的工作目录必须是干净的(即所有的变化需要添加),当你git stash pop以后。

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

其他回答

这里有一个简单的方法:

将下面的别名定义添加到.zshrc或.bashrc或.bash_profile中 现在,任何时候你在这种情况下,只要输入gss,你将有2个存储-一个包含所有的变化,另一个只包含阶段性的变化

你现在可以应用阶段性的变化,看看它们是否有效,如果你想提交它们。然后,稍后您还可以通过应用“all WIP”存储来引入未分阶段的更改并尝试这些更改。

alias gsts='git stash save'
alias gsv="git stash save --keep-index"

# How to Git Stash preserving staged/unstaged situation.
# 1. gsv will stash all and reset (remove) the unstaged, leaving only staged in staged state.
# 2. gsts will make a stash with your "good" (staged) files
alias gss='gsv all WIP && gsts staged WIP'

我发现标记的答案对我不起作用,因为我需要一个真正只隐藏我的非阶段性变化的东西。标记的答案是git stash——keep-index,它同时存储阶段性和非阶段性更改。——keep-index部分也只是在工作副本上保持索引完整。这对OP有用,但只是因为他问了一个与他真正想要的答案略有不同的问题。

我发现的唯一隐藏非阶段性变化的方法是根本不使用隐藏:

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

你也可以使用git恢复。或者git结帐——。而不是git应用-R unstage .diff。

工作,工作,工作……

git apply unstaged.diff
rm unstaged.diff

Git:隐藏未分阶段的更改

这将隐藏所有你没有git添加的修改:

git stash -k

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

git stash -k -u 

此外,你的工作目录必须是干净的(即所有的变化需要添加),当你git stash pop以后。

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

更新2: 我不知道为什么人们抱怨这个答案,它似乎与我完美地工作,对于未提取的文件,你可以添加-u标志

完整命令变成git stash——keep-index -u

下面是git-stash帮助的一个片段

如果使用了——keep-index选项,则所有更改都已添加到 索引保持完整。 如果使用了——include-untracked选项,则所有未跟踪的文件都将被删除 还藏好了,然后用git清理干净,留下工作 目录处于非常干净的状态。如果使用——all选项 然后将被忽略的文件存储和清理 无路径的文件。

这是它的动图:

更新:

尽管这是选定的答案,但很多人指出[下面的答案](https://stackoverflow.com/a/34681302/292408)是正确的,我建议大家去看看。

我今天(31/1/2020)在git 2.24.0版本上再次测试了我的答案,我仍然相信它是正确的,我在上面添加了一个关于未跟踪文件的小注释。 如果你认为它不起作用,请同时提到你的git版本。

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

git stash --keep-index

来自git-stash的文档:

Testing partial commits You can use git stash save --keep-index when you want to make two or more commits out of the changes in the work tree, and you want to test each change before committing: # ... 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

正如一些人指出的那样,公认的答案也隐藏着阶段性的变化。这里有一种方法可以做到这一点,而不用在隐藏的地方进行阶段性的更改。

这个想法是做一个临时提交你的阶段性变化,然后保存非阶段性的变化,然后取消临时提交:

# 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^

在这一点上,您将有一个非阶段性更改的隐藏,并且只会在工作副本中显示阶段性更改。