假设在git控制的项目中做了两组更改。一组是上演的,另一组不是。
我想通过在此状态(提交之前)运行我的项目来重新检查阶段性更改。有什么简单的方法可以把所有非阶段性的变化都收起来,只留下阶段性的变化?因此,我需要从项目中消失的非阶段性更改,但要存储在某个地方以供进一步工作。
这听起来很像git的stash命令。但是git stash会把非阶段性和阶段性的变化都从我的项目中删除。我也找不到什么没被偷的东西。
假设在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
其他回答
从Git 2.35 (Q1 2022)开始,你现在可以通过Git stash来隐藏阶段性变化。
因此,要隐藏未分期(和未跟踪)的更改:
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
然而,如果阶段性和非阶段性的更改影响相同的行,这将失败,因为git stash - staging在这种情况下会“部分”失败,因为它存储了阶段性的更改,但留下了阶段性和非阶段性的更改。 在这种情况下,下面的方法(使用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"
用法:
git stash-unstaged -m "Stash Message"
对于<2.35的Git版本,
你可以通过利用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
与之前的方法(使用git stash - staging)不同,即使阶段性和非阶段性的更改影响相同的行,这仍然可以工作。 不过,你可能需要解决合并冲突,当你弹出隐藏。
供参考,要隐藏阶段性变化,只需先隐藏非阶段性变化:
# 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
这两个的别名:
[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"
这里有一个简单的方法:
将下面的别名定义添加到.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'
正如一些人指出的那样,公认的答案也隐藏着阶段性的变化。这里有一种方法可以做到这一点,而不用在隐藏的地方进行阶段性的更改。
这个想法是做一个临时提交你的阶段性变化,然后保存非阶段性的变化,然后取消临时提交:
# 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^
在这一点上,您将有一个非阶段性更改的隐藏,并且只会在工作副本中显示阶段性更改。
Git:隐藏未分阶段的更改
这将隐藏所有你没有git添加的修改:
git stash -k
注意,新创建的(和未添加的)文件将保留在工作目录中,除非您也使用了-u开关。
git stash -k -u
此外,你的工作目录必须是干净的(即所有的变化需要添加),当你git stash pop以后。
http://makandracards.com/makandra/853-git-stash-unstaged-changes
我发现标记的答案对我不起作用,因为我需要一个真正只隐藏我的非阶段性变化的东西。标记的答案是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