使用git(不是--keep-index)仅存储未分级的更改

时间:2018-03-15 13:52:22

标签: git

首先,我知道--keep-index。这不是我想要的,因为它仍然隐藏所有更改,但将暂存的更改留在工作树中。我想只隐藏未分段的文件,如果可能的话,不再使用git stash --patch添加所有更改。

3 个答案:

答案 0 :(得分:2)

如果您想存储索引(已暂存的内容)和工作树(尚未暂存的内容)之间的差异,则只需 git diff :

# store it :
git diff > stash.patch

# if you additionally want to put the unstaged changes away :
git stash -k

稍后将这些更改应用于工作树(而不是索引):使用 git apply

git apply stash.patch

您还可以使用存储在存储中的内容来重新创建该差异:

# stash the changes :
git stash -k

# to reapply them on the worktree at a later time :
#   the 'unstaged changes' are the diff between 
#    - what the index was (stash^2)
#    - and what the worktree was (stash)
git diff stash^2 stash | git apply -

# again : 'git apply' will apply the changes on the *worktree*, not the index

答案 1 :(得分:1)

我能想到的最好方法是:

git commit -n -m temp
git stash push -u
git reset HEAD~1

这将在不触发任何预提交钩子的情况下提交。然后它将隐藏剩余的更改(即之前未暂存的更改)。最后,它会将 head 重置回预提交状态(在“temp”提交之前)。

答案 2 :(得分:0)

您无法做到彻底,但最终甚至可以完全不使用任何git-stash命令而仅隔离未暂存的更改或仅暂存的更改,或两者都隔离:


git switch -c separated-stashes

相当于旧的checkout -b:创建一个新分支并打开它。它既不会更改您的工作树也不会更改您的索引,因此您基本上将获得与之前相同的git status'输出,但是这次是在新分支上。与简单的git switch / git checkout相反,它不会警告您在切换分支之前存储或提交更改,因为您是通过-c / {{ 1}}。


-b

在新分支上创建仅包含从头开始的阶段性更改的第一次提交。


git commit -m "staged"

创建第二个提交,并且从一开始就进行无阶段的更改。


git add -u && git commit -m "unstaged"

返回上一个分支。

现在,您已经藏匿了所有东西,可以随时随地git switch - # == git checkout - {需要进行(暂存/未暂存)的内容。


这看起来有点麻烦,但是您可以自由定义一个git别名来自动化它:

cherry-pick